blob: 577ad5409d1fbd7bfdf4ee80b6745c4e295096a0 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -passes=instsimplify < %s -S | FileCheck %s
define i1 @lshr_add_nuw_lhs_has_high_bit(i32 %x, i32 %y) {
; CHECK-LABEL: @lshr_add_nuw_lhs_has_high_bit(
; CHECK-NEXT: ret i1 false
;
%x_high = or i32 %x, 256
%add = add nuw i32 %x_high, %y
%shr = lshr i32 %add, 4
%cmp = icmp eq i32 %shr, 0
ret i1 %cmp
}
define i1 @lshr_add_nuw_rhs_has_high_bit(i32 %x, i32 %y) {
; CHECK-LABEL: @lshr_add_nuw_rhs_has_high_bit(
; CHECK-NEXT: ret i1 false
;
%y_high = or i32 %y, 256
%add = add nuw i32 %x, %y_high
%shr = lshr i32 %add, 4
%cmp = icmp eq i32 %shr, 0
ret i1 %cmp
}
define i1 @lshr_add_nuw_rhs_has_high_bit_i13(i13 %x, i13 %y) {
; CHECK-LABEL: @lshr_add_nuw_rhs_has_high_bit_i13(
; CHECK-NEXT: ret i1 false
;
%y_high = or i13 %y, 256
%add = add nuw i13 %x, %y_high
%shr = lshr i13 %add, 4
%cmp = icmp eq i13 %shr, 0
ret i1 %cmp
}
define <2 x i1> @lshr_add_nuw_vec(<2 x i32> %x, <2 x i32> %y) {
; CHECK-LABEL: @lshr_add_nuw_vec(
; CHECK-NEXT: ret <2 x i1> zeroinitializer
;
%x_high = or <2 x i32> %x, splat (i32 256)
%add = add nuw <2 x i32> %x_high, %y
%shr = lshr <2 x i32> %add, splat (i32 4)
%cmp = icmp eq <2 x i32> %shr, zeroinitializer
ret <2 x i1> %cmp
}
define i1 @ashr_add_nuw_lhs_has_high_bit(i32 %x, i32 %y) {
; CHECK-LABEL: @ashr_add_nuw_lhs_has_high_bit(
; CHECK-NEXT: ret i1 false
;
%x_high = or i32 %x, 256
%add = add nuw i32 %x_high, %y
%shr = ashr i32 %add, 4
%cmp = icmp eq i32 %shr, 0
ret i1 %cmp
}
; negative tests
define i1 @lshr_add_nuw_bit_shifted_out_fail(i32 %x, i32 %y) {
; CHECK-LABEL: @lshr_add_nuw_bit_shifted_out_fail(
; CHECK-NEXT: [[X_HIGH:%.*]] = or i32 [[X:%.*]], 16
; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[X_HIGH]], [[Y:%.*]]
; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[ADD]], 8
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SHR]], 0
; CHECK-NEXT: ret i1 [[CMP]]
;
%x_high = or i32 %x, 16
%add = add nuw i32 %x_high, %y
%shr = lshr i32 %add, 8
%cmp = icmp eq i32 %shr, 0
ret i1 %cmp
}
define i1 @lshr_add_no_nuw_fail(i32 %x, i32 %y) {
; CHECK-LABEL: @lshr_add_no_nuw_fail(
; CHECK-NEXT: [[X_HIGH:%.*]] = or i32 [[X:%.*]], 256
; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X_HIGH]], [[Y:%.*]]
; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[ADD]], 4
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SHR]], 0
; CHECK-NEXT: ret i1 [[CMP]]
;
%x_high = or i32 %x, 256
%add = add i32 %x_high, %y
%shr = lshr i32 %add, 4
%cmp = icmp eq i32 %shr, 0
ret i1 %cmp
}
define i1 @lshr_add_nsw_fail(i32 %x, i32 %y) {
; CHECK-LABEL: @lshr_add_nsw_fail(
; CHECK-NEXT: [[X_HIGH:%.*]] = or i32 [[X:%.*]], 256
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X_HIGH]], [[Y:%.*]]
; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[ADD]], 4
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SHR]], 0
; CHECK-NEXT: ret i1 [[CMP]]
;
%x_high = or i32 %x, 256
%add = add nsw i32 %x_high, %y
%shr = lshr i32 %add, 4
%cmp = icmp eq i32 %shr, 0
ret i1 %cmp
}
define i1 @lshr_add_nuw_variable_shift_fail(i32 %x, i32 %y, i32 %c) {
; CHECK-LABEL: @lshr_add_nuw_variable_shift_fail(
; CHECK-NEXT: [[X_HIGH:%.*]] = or i32 [[X:%.*]], 256
; CHECK-NEXT: [[ADD:%.*]] = add nuw i32 [[X_HIGH]], [[Y:%.*]]
; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[ADD]], [[C:%.*]]
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SHR]], 0
; CHECK-NEXT: ret i1 [[CMP]]
;
%x_high = or i32 %x, 256
%add = add nuw i32 %x_high, %y
%shr = lshr i32 %add, %c
%cmp = icmp eq i32 %shr, 0
ret i1 %cmp
}