; 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 }