@@ -54,8 +54,7 @@ define i1 @ctlz_eq_bitwidth_i32(i32 %x) {
54
54
55
55
define i1 @ctlz_eq_zero_i32 (i32 %x ) {
56
56
; CHECK-LABEL: @ctlz_eq_zero_i32(
57
- ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
58
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[LZ]], 0
57
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 0
59
58
; CHECK-NEXT: ret i1 [[CMP]]
60
59
;
61
60
%lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
@@ -65,8 +64,7 @@ define i1 @ctlz_eq_zero_i32(i32 %x) {
65
64
66
65
define <2 x i1 > @ctlz_ne_zero_v2i32 (<2 x i32 > %a ) {
67
66
; CHECK-LABEL: @ctlz_ne_zero_v2i32(
68
- ; CHECK-NEXT: [[X:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[A:%.*]], i1 false)
69
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[X]], zeroinitializer
67
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[A:%.*]], <i32 -1, i32 -1>
70
68
; CHECK-NEXT: ret <2 x i1> [[CMP]]
71
69
;
72
70
%x = tail call <2 x i32 > @llvm.ctlz.v2i32 (<2 x i32 > %a , i1 false )
@@ -76,8 +74,7 @@ define <2 x i1> @ctlz_ne_zero_v2i32(<2 x i32> %a) {
76
74
77
75
define i1 @ctlz_eq_bw_minus_1_i32 (i32 %x ) {
78
76
; CHECK-LABEL: @ctlz_eq_bw_minus_1_i32(
79
- ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
80
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[LZ]], 31
77
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 1
81
78
; CHECK-NEXT: ret i1 [[CMP]]
82
79
;
83
80
%lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
@@ -87,8 +84,7 @@ define i1 @ctlz_eq_bw_minus_1_i32(i32 %x) {
87
84
88
85
define <2 x i1 > @ctlz_ne_bw_minus_1_v2i32 (<2 x i32 > %a ) {
89
86
; CHECK-LABEL: @ctlz_ne_bw_minus_1_v2i32(
90
- ; CHECK-NEXT: [[X:%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[A:%.*]], i1 false)
91
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[X]], <i32 31, i32 31>
87
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], <i32 1, i32 1>
92
88
; CHECK-NEXT: ret <2 x i1> [[CMP]]
93
89
;
94
90
%x = tail call <2 x i32 > @llvm.ctlz.v2i32 (<2 x i32 > %a , i1 false )
@@ -98,8 +94,8 @@ define <2 x i1> @ctlz_ne_bw_minus_1_v2i32(<2 x i32> %a) {
98
94
99
95
define i1 @ctlz_eq_other_i32 (i32 %x ) {
100
96
; CHECK-LABEL: @ctlz_eq_other_i32(
101
- ; CHECK-NEXT: [[LZ :%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
102
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[LZ ]], 24
97
+ ; CHECK-NEXT: [[TMP1 :%.*]] = and i32 [[X:%.*]], -128
98
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP1 ]], 128
103
99
; CHECK-NEXT: ret i1 [[CMP]]
104
100
;
105
101
%lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
@@ -109,15 +105,28 @@ define i1 @ctlz_eq_other_i32(i32 %x) {
109
105
110
106
define <2 x i1 > @ctlz_ne_other_v2i32 (<2 x i32 > %a ) {
111
107
; CHECK-LABEL: @ctlz_ne_other_v2i32(
112
- ; CHECK-NEXT: [[X :%.*]] = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[A:%.*]], i1 false)
113
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[X ]], <i32 24 , i32 24 >
108
+ ; CHECK-NEXT: [[TMP1 :%.*]] = and <2 x i32> [[A:%.*]], <i32 -128, i32 -128>
109
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1 ]], <i32 128 , i32 128 >
114
110
; CHECK-NEXT: ret <2 x i1> [[CMP]]
115
111
;
116
112
%x = tail call <2 x i32 > @llvm.ctlz.v2i32 (<2 x i32 > %a , i1 false )
117
113
%cmp = icmp ne <2 x i32 > %x , <i32 24 , i32 24 >
118
114
ret <2 x i1 > %cmp
119
115
}
120
116
117
+ define i1 @ctlz_eq_other_i32_multiuse (i32 %x , i32* %p ) {
118
+ ; CHECK-LABEL: @ctlz_eq_other_i32_multiuse(
119
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false), !range !0
120
+ ; CHECK-NEXT: store i32 [[LZ]], i32* [[P:%.*]], align 4
121
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[LZ]], 24
122
+ ; CHECK-NEXT: ret i1 [[CMP]]
123
+ ;
124
+ %lz = tail call i32 @llvm.ctlz.i32 (i32 %x , i1 false )
125
+ store i32 %lz , i32* %p
126
+ %cmp = icmp eq i32 %lz , 24
127
+ ret i1 %cmp
128
+ }
129
+
121
130
define <2 x i1 > @ctlz_ne_bitwidth_v2i32 (<2 x i32 > %a ) {
122
131
; CHECK-LABEL: @ctlz_ne_bitwidth_v2i32(
123
132
; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], zeroinitializer
@@ -150,8 +159,8 @@ define <2 x i1> @cttz_eq_bitwidth_v2i32(<2 x i32> %a) {
150
159
151
160
define i1 @cttz_eq_zero_i33 (i33 %x ) {
152
161
; CHECK-LABEL: @cttz_eq_zero_i33(
153
- ; CHECK-NEXT: [[TZ :%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range ! 1
154
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TZ ]], 0
162
+ ; CHECK-NEXT: [[TMP1 :%.*]] = and i33 [[X:%.*]], 1
163
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i33 [[TMP1 ]], 0
155
164
; CHECK-NEXT: ret i1 [[CMP]]
156
165
;
157
166
%tz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
@@ -161,8 +170,8 @@ define i1 @cttz_eq_zero_i33(i33 %x) {
161
170
162
171
define <2 x i1 > @cttz_ne_zero_v2i32 (<2 x i32 > %a ) {
163
172
; CHECK-LABEL: @cttz_ne_zero_v2i32(
164
- ; CHECK-NEXT: [[X :%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[A:%.*]], i1 false)
165
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[X ]], zeroinitializer
173
+ ; CHECK-NEXT: [[TMP1 :%.*]] = and <2 x i32> [[A:%.*]], <i32 1, i32 1>
174
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[TMP1 ]], zeroinitializer
166
175
; CHECK-NEXT: ret <2 x i1> [[CMP]]
167
176
;
168
177
%x = tail call <2 x i32 > @llvm.cttz.v2i32 (<2 x i32 > %a , i1 false )
@@ -172,8 +181,7 @@ define <2 x i1> @cttz_ne_zero_v2i32(<2 x i32> %a) {
172
181
173
182
define i1 @cttz_eq_bw_minus_1_i33 (i33 %x ) {
174
183
; CHECK-LABEL: @cttz_eq_bw_minus_1_i33(
175
- ; CHECK-NEXT: [[TZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
176
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TZ]], 32
184
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[X:%.*]], -4294967296
177
185
; CHECK-NEXT: ret i1 [[CMP]]
178
186
;
179
187
%tz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
@@ -183,8 +191,7 @@ define i1 @cttz_eq_bw_minus_1_i33(i33 %x) {
183
191
184
192
define <2 x i1 > @cttz_ne_bw_minus_1_v2i32 (<2 x i32 > %a ) {
185
193
; CHECK-LABEL: @cttz_ne_bw_minus_1_v2i32(
186
- ; CHECK-NEXT: [[X:%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[A:%.*]], i1 false)
187
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[X]], <i32 31, i32 31>
194
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], <i32 -2147483648, i32 -2147483648>
188
195
; CHECK-NEXT: ret <2 x i1> [[CMP]]
189
196
;
190
197
%x = tail call <2 x i32 > @llvm.cttz.v2i32 (<2 x i32 > %a , i1 false )
@@ -194,8 +201,8 @@ define <2 x i1> @cttz_ne_bw_minus_1_v2i32(<2 x i32> %a) {
194
201
195
202
define i1 @cttz_eq_other_i33 (i33 %x ) {
196
203
; CHECK-LABEL: @cttz_eq_other_i33(
197
- ; CHECK-NEXT: [[TZ :%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
198
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TZ ]], 4
204
+ ; CHECK-NEXT: [[TMP1 :%.*]] = and i33 [[X:%.*]], 31
205
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TMP1 ]], 16
199
206
; CHECK-NEXT: ret i1 [[CMP]]
200
207
;
201
208
%tz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
@@ -205,15 +212,28 @@ define i1 @cttz_eq_other_i33(i33 %x) {
205
212
206
213
define <2 x i1 > @cttz_ne_other_v2i32 (<2 x i32 > %a ) {
207
214
; CHECK-LABEL: @cttz_ne_other_v2i32(
208
- ; CHECK-NEXT: [[X :%.*]] = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[A:%.*]], i1 false)
209
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[X ]], <i32 4 , i32 4 >
215
+ ; CHECK-NEXT: [[TMP1 :%.*]] = and <2 x i32> [[A:%.*]], <i32 31, i32 31>
216
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1 ]], <i32 16 , i32 16 >
210
217
; CHECK-NEXT: ret <2 x i1> [[CMP]]
211
218
;
212
219
%x = tail call <2 x i32 > @llvm.cttz.v2i32 (<2 x i32 > %a , i1 false )
213
220
%cmp = icmp ne <2 x i32 > %x , <i32 4 , i32 4 >
214
221
ret <2 x i1 > %cmp
215
222
}
216
223
224
+ define i1 @cttz_eq_other_i33_multiuse (i33 %x , i33* %p ) {
225
+ ; CHECK-LABEL: @cttz_eq_other_i33_multiuse(
226
+ ; CHECK-NEXT: [[LZ:%.*]] = tail call i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false), !range !1
227
+ ; CHECK-NEXT: store i33 [[LZ]], i33* [[P:%.*]], align 4
228
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[LZ]], 4
229
+ ; CHECK-NEXT: ret i1 [[CMP]]
230
+ ;
231
+ %lz = tail call i33 @llvm.cttz.i33 (i33 %x , i1 false )
232
+ store i33 %lz , i33* %p
233
+ %cmp = icmp eq i33 %lz , 4
234
+ ret i1 %cmp
235
+ }
236
+
217
237
define i1 @ctpop_eq_zero_i11 (i11 %x ) {
218
238
; CHECK-LABEL: @ctpop_eq_zero_i11(
219
239
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i11 [[X:%.*]], 0
0 commit comments