9
9
10
10
define i1 @scalar_i8_lshr_and_signbit_eq (i8 %x , i8 %y ) {
11
11
; CHECK-LABEL: @scalar_i8_lshr_and_signbit_eq(
12
- ; CHECK-NEXT: [[TMP1:%.*]] = shl i8 -128, [[Y:%.*]]
13
- ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]]
14
- ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[TMP2]], 0
12
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i8 [[X:%.*]], [[Y:%.*]]
13
+ ; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[LSHR]], -1
15
14
; CHECK-NEXT: ret i1 [[R]]
16
15
;
17
16
%lshr = lshr i8 %x , %y
@@ -22,9 +21,8 @@ define i1 @scalar_i8_lshr_and_signbit_eq(i8 %x, i8 %y) {
22
21
23
22
define i1 @scalar_i16_lshr_and_signbit_eq (i16 %x , i16 %y ) {
24
23
; CHECK-LABEL: @scalar_i16_lshr_and_signbit_eq(
25
- ; CHECK-NEXT: [[TMP1:%.*]] = shl i16 -32768, [[Y:%.*]]
26
- ; CHECK-NEXT: [[TMP2:%.*]] = and i16 [[TMP1]], [[X:%.*]]
27
- ; CHECK-NEXT: [[R:%.*]] = icmp eq i16 [[TMP2]], 0
24
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i16 [[X:%.*]], [[Y:%.*]]
25
+ ; CHECK-NEXT: [[R:%.*]] = icmp sgt i16 [[LSHR]], -1
28
26
; CHECK-NEXT: ret i1 [[R]]
29
27
;
30
28
%lshr = lshr i16 %x , %y
@@ -35,9 +33,8 @@ define i1 @scalar_i16_lshr_and_signbit_eq(i16 %x, i16 %y) {
35
33
36
34
define i1 @scalar_i32_lshr_and_signbit_eq (i32 %x , i32 %y ) {
37
35
; CHECK-LABEL: @scalar_i32_lshr_and_signbit_eq(
38
- ; CHECK-NEXT: [[TMP1:%.*]] = shl i32 -2147483648, [[Y:%.*]]
39
- ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[X:%.*]]
40
- ; CHECK-NEXT: [[R:%.*]] = icmp eq i32 [[TMP2]], 0
36
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i32 [[X:%.*]], [[Y:%.*]]
37
+ ; CHECK-NEXT: [[R:%.*]] = icmp sgt i32 [[LSHR]], -1
41
38
; CHECK-NEXT: ret i1 [[R]]
42
39
;
43
40
%lshr = lshr i32 %x , %y
@@ -48,9 +45,8 @@ define i1 @scalar_i32_lshr_and_signbit_eq(i32 %x, i32 %y) {
48
45
49
46
define i1 @scalar_i64_lshr_and_signbit_eq (i64 %x , i64 %y ) {
50
47
; CHECK-LABEL: @scalar_i64_lshr_and_signbit_eq(
51
- ; CHECK-NEXT: [[TMP1:%.*]] = shl i64 -9223372036854775808, [[Y:%.*]]
52
- ; CHECK-NEXT: [[TMP2:%.*]] = and i64 [[TMP1]], [[X:%.*]]
53
- ; CHECK-NEXT: [[R:%.*]] = icmp eq i64 [[TMP2]], 0
48
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i64 [[X:%.*]], [[Y:%.*]]
49
+ ; CHECK-NEXT: [[R:%.*]] = icmp sgt i64 [[LSHR]], -1
54
50
; CHECK-NEXT: ret i1 [[R]]
55
51
;
56
52
%lshr = lshr i64 %x , %y
@@ -61,9 +57,8 @@ define i1 @scalar_i64_lshr_and_signbit_eq(i64 %x, i64 %y) {
61
57
62
58
define i1 @scalar_i32_lshr_and_signbit_ne (i32 %x , i32 %y ) {
63
59
; CHECK-LABEL: @scalar_i32_lshr_and_signbit_ne(
64
- ; CHECK-NEXT: [[TMP1:%.*]] = shl i32 -2147483648, [[Y:%.*]]
65
- ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[X:%.*]]
66
- ; CHECK-NEXT: [[R:%.*]] = icmp ne i32 [[TMP2]], 0
60
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i32 [[X:%.*]], [[Y:%.*]]
61
+ ; CHECK-NEXT: [[R:%.*]] = icmp slt i32 [[LSHR]], 0
67
62
; CHECK-NEXT: ret i1 [[R]]
68
63
;
69
64
%lshr = lshr i32 %x , %y
@@ -76,9 +71,8 @@ define i1 @scalar_i32_lshr_and_signbit_ne(i32 %x, i32 %y) {
76
71
77
72
define <4 x i1 > @vec_4xi32_lshr_and_signbit_eq (<4 x i32 > %x , <4 x i32 > %y ) {
78
73
; CHECK-LABEL: @vec_4xi32_lshr_and_signbit_eq(
79
- ; CHECK-NEXT: [[TMP1:%.*]] = shl <4 x i32> <i32 -2147483648, i32 -2147483648, i32 -2147483648, i32 -2147483648>, [[Y:%.*]]
80
- ; CHECK-NEXT: [[TMP2:%.*]] = and <4 x i32> [[TMP1]], [[X:%.*]]
81
- ; CHECK-NEXT: [[R:%.*]] = icmp eq <4 x i32> [[TMP2]], zeroinitializer
74
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr <4 x i32> [[X:%.*]], [[Y:%.*]]
75
+ ; CHECK-NEXT: [[R:%.*]] = icmp sgt <4 x i32> [[LSHR]], <i32 -1, i32 -1, i32 -1, i32 -1>
82
76
; CHECK-NEXT: ret <4 x i1> [[R]]
83
77
;
84
78
%lshr = lshr <4 x i32 > %x , %y
0 commit comments