| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: opt < %s -passes=instsimplify -S | FileCheck %s |
| |
| define i8 @xor_w_sub_fail_missing_nuw(i8 range(i8 0, 16) %x) { |
| ; CHECK-LABEL: define i8 @xor_w_sub_fail_missing_nuw( |
| ; CHECK-SAME: i8 range(i8 0, 16) [[X:%.*]]) { |
| ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], 15 |
| ; CHECK-NEXT: [[R:%.*]] = sub nsw i8 15, [[XOR]] |
| ; CHECK-NEXT: ret i8 [[R]] |
| ; |
| %xor = xor i8 %x, 15 |
| %r = sub nsw i8 15, %xor |
| ret i8 %r |
| } |
| |
| define i8 @xor_w_sub_fail_diff_values(i8 range(i8 0, 16) %x) { |
| ; CHECK-LABEL: define i8 @xor_w_sub_fail_diff_values( |
| ; CHECK-SAME: i8 range(i8 0, 16) [[X:%.*]]) { |
| ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], 15 |
| ; CHECK-NEXT: [[R:%.*]] = sub nuw nsw i8 31, [[XOR]] |
| ; CHECK-NEXT: ret i8 [[R]] |
| ; |
| %xor = xor i8 %x, 15 |
| %r = sub nsw nuw i8 31, %xor |
| ret i8 %r |
| } |
| |
| define i8 @xor_w_sub_fail_diff_values2(i8 range(i8 0, 16) %x) { |
| ; CHECK-LABEL: define i8 @xor_w_sub_fail_diff_values2( |
| ; CHECK-SAME: i8 range(i8 0, 16) [[X:%.*]]) { |
| ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], 31 |
| ; CHECK-NEXT: [[R:%.*]] = sub nuw nsw i8 15, [[XOR]] |
| ; CHECK-NEXT: ret i8 [[R]] |
| ; |
| %xor = xor i8 %x, 31 |
| %r = sub nsw nuw i8 15, %xor |
| ret i8 %r |
| } |
| |
| define i8 @xor_w_sub_fail_not_mask(i8 range(i8 0, 16) %x) { |
| ; CHECK-LABEL: define i8 @xor_w_sub_fail_not_mask( |
| ; CHECK-SAME: i8 range(i8 0, 16) [[X:%.*]]) { |
| ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[X]], 30 |
| ; CHECK-NEXT: [[R:%.*]] = sub nuw nsw i8 30, [[XOR]] |
| ; CHECK-NEXT: ret i8 [[R]] |
| ; |
| %xor = xor i8 %x, 30 |
| %r = sub nsw nuw i8 30, %xor |
| ret i8 %r |
| } |
| |
| define i8 @xor_w_sub_okay(i8 range(i8 0, 16) %x) { |
| ; CHECK-LABEL: define i8 @xor_w_sub_okay( |
| ; CHECK-SAME: i8 range(i8 0, 16) [[X:%.*]]) { |
| ; CHECK-NEXT: ret i8 [[X]] |
| ; |
| %xor = xor i8 %x, 31 |
| %r = sub nsw nuw i8 31, %xor |
| ret i8 %r |
| } |
| |
| define i8 @sub_w_xor_fail_missing_nuw(i8 range(i8 0, 16) %x) { |
| ; CHECK-LABEL: define i8 @sub_w_xor_fail_missing_nuw( |
| ; CHECK-SAME: i8 range(i8 0, 16) [[X:%.*]]) { |
| ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i8 15, [[X]] |
| ; CHECK-NEXT: [[R:%.*]] = xor i8 [[SUB]], 15 |
| ; CHECK-NEXT: ret i8 [[R]] |
| ; |
| %sub = sub nsw i8 15, %x |
| %r = xor i8 %sub, 15 |
| ret i8 %r |
| } |
| |
| define i8 @sub_w_xor_fail_diff_values(i8 range(i8 0, 16) %x) { |
| ; CHECK-LABEL: define i8 @sub_w_xor_fail_diff_values( |
| ; CHECK-SAME: i8 range(i8 0, 16) [[X:%.*]]) { |
| ; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i8 15, [[X]] |
| ; CHECK-NEXT: [[R:%.*]] = xor i8 [[SUB]], 31 |
| ; CHECK-NEXT: ret i8 [[R]] |
| ; |
| %sub = sub nsw nuw i8 15, %x |
| %r = xor i8 %sub, 31 |
| ret i8 %r |
| } |
| |
| define i8 @sub_w_sub_fail_diff_values2(i8 range(i8 0, 16) %x) { |
| ; CHECK-LABEL: define i8 @sub_w_sub_fail_diff_values2( |
| ; CHECK-SAME: i8 range(i8 0, 16) [[X:%.*]]) { |
| ; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i8 31, [[X]] |
| ; CHECK-NEXT: [[R:%.*]] = xor i8 [[SUB]], 15 |
| ; CHECK-NEXT: ret i8 [[R]] |
| ; |
| %sub = sub nsw nuw i8 31, %x |
| %r = xor i8 %sub, 15 |
| ret i8 %r |
| } |
| |
| define i8 @sub_w_sub_fail_not_mask(i8 range(i8 0, 16) %x) { |
| ; CHECK-LABEL: define i8 @sub_w_sub_fail_not_mask( |
| ; CHECK-SAME: i8 range(i8 0, 16) [[X:%.*]]) { |
| ; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i8 30, [[X]] |
| ; CHECK-NEXT: [[R:%.*]] = xor i8 [[SUB]], 30 |
| ; CHECK-NEXT: ret i8 [[R]] |
| ; |
| %sub = sub nsw nuw i8 30, %x |
| %r = xor i8 %sub, 30 |
| ret i8 %r |
| } |
| |
| define i8 @sub_w_sub_okay(i8 range(i8 0, 16) %x) { |
| ; CHECK-LABEL: define i8 @sub_w_sub_okay( |
| ; CHECK-SAME: i8 range(i8 0, 16) [[X:%.*]]) { |
| ; CHECK-NEXT: ret i8 [[X]] |
| ; |
| %sub = sub nsw nuw i8 31, %x |
| %r = xor i8 %sub, 31 |
| ret i8 %r |
| } |