@@ -177,9 +177,11 @@ declare void @use32(i32)
177
177
178
178
define i32 @masked_bit_set (i32 %x , i32 %y ) {
179
179
; CHECK-LABEL: @masked_bit_set(
180
- ; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], [[Y:%.*]]
181
- ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 1
182
- ; CHECK-NEXT: ret i32 [[TMP2]]
180
+ ; CHECK-NEXT: [[SH1:%.*]] = shl i32 1, [[Y:%.*]]
181
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[SH1]], [[X:%.*]]
182
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0
183
+ ; CHECK-NEXT: [[R:%.*]] = zext i1 [[CMP]] to i32
184
+ ; CHECK-NEXT: ret i32 [[R]]
183
185
;
184
186
%sh1 = shl i32 1 , %y
185
187
%and = and i32 %sh1 , %x
@@ -190,10 +192,11 @@ define i32 @masked_bit_set(i32 %x, i32 %y) {
190
192
191
193
define <2 x i32 > @masked_bit_clear (<2 x i32 > %x , <2 x i32 > %y ) {
192
194
; CHECK-LABEL: @masked_bit_clear(
193
- ; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i32> [[X:%.*]], <i32 -1, i32 -1>
194
- ; CHECK-NEXT: [[TMP2:%.*]] = lshr <2 x i32> [[TMP1]], [[Y:%.*]]
195
- ; CHECK-NEXT: [[TMP3:%.*]] = and <2 x i32> [[TMP2]], <i32 1, i32 1>
196
- ; CHECK-NEXT: ret <2 x i32> [[TMP3]]
195
+ ; CHECK-NEXT: [[SH1:%.*]] = shl <2 x i32> <i32 1, i32 1>, [[Y:%.*]]
196
+ ; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[SH1]], [[X:%.*]]
197
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[AND]], zeroinitializer
198
+ ; CHECK-NEXT: [[R:%.*]] = zext <2 x i1> [[CMP]] to <2 x i32>
199
+ ; CHECK-NEXT: ret <2 x i32> [[R]]
197
200
;
198
201
%sh1 = shl <2 x i32 > <i32 1 , i32 1 >, %y
199
202
%and = and <2 x i32 > %sh1 , %x
@@ -205,9 +208,11 @@ define <2 x i32> @masked_bit_clear(<2 x i32> %x, <2 x i32> %y) {
205
208
define <2 x i32 > @masked_bit_set_commute (<2 x i32 > %px , <2 x i32 > %y ) {
206
209
; CHECK-LABEL: @masked_bit_set_commute(
207
210
; CHECK-NEXT: [[X:%.*]] = srem <2 x i32> <i32 42, i32 3>, [[PX:%.*]]
208
- ; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i32> [[X]], [[Y:%.*]]
209
- ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], <i32 1, i32 1>
210
- ; CHECK-NEXT: ret <2 x i32> [[TMP2]]
211
+ ; CHECK-NEXT: [[SH1:%.*]] = shl <2 x i32> <i32 1, i32 1>, [[Y:%.*]]
212
+ ; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[X]], [[SH1]]
213
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[AND]], zeroinitializer
214
+ ; CHECK-NEXT: [[R:%.*]] = zext <2 x i1> [[CMP]] to <2 x i32>
215
+ ; CHECK-NEXT: ret <2 x i32> [[R]]
211
216
;
212
217
%x = srem <2 x i32 > <i32 42 , i32 3 >, %px ; thwart complexity-based canonicalization
213
218
%sh1 = shl <2 x i32 > <i32 1 , i32 1 >, %y
@@ -220,10 +225,11 @@ define <2 x i32> @masked_bit_set_commute(<2 x i32> %px, <2 x i32> %y) {
220
225
define i32 @masked_bit_clear_commute (i32 %px , i32 %y ) {
221
226
; CHECK-LABEL: @masked_bit_clear_commute(
222
227
; CHECK-NEXT: [[X:%.*]] = srem i32 42, [[PX:%.*]]
223
- ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X]], -1
224
- ; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], [[Y:%.*]]
225
- ; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[TMP2]], 1
226
- ; CHECK-NEXT: ret i32 [[TMP3]]
228
+ ; CHECK-NEXT: [[SH1:%.*]] = shl i32 1, [[Y:%.*]]
229
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X]], [[SH1]]
230
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
231
+ ; CHECK-NEXT: [[R:%.*]] = zext i1 [[CMP]] to i32
232
+ ; CHECK-NEXT: ret i32 [[R]]
227
233
;
228
234
%x = srem i32 42 , %px ; thwart complexity-based canonicalization
229
235
%sh1 = shl i32 1 , %y
@@ -237,9 +243,10 @@ define i32 @masked_bit_set_use1(i32 %x, i32 %y) {
237
243
; CHECK-LABEL: @masked_bit_set_use1(
238
244
; CHECK-NEXT: [[SH1:%.*]] = shl i32 1, [[Y:%.*]]
239
245
; CHECK-NEXT: call void @use32(i32 [[SH1]])
240
- ; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], [[Y]]
241
- ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 1
242
- ; CHECK-NEXT: ret i32 [[TMP2]]
246
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[SH1]], [[X:%.*]]
247
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0
248
+ ; CHECK-NEXT: [[R:%.*]] = zext i1 [[CMP]] to i32
249
+ ; CHECK-NEXT: ret i32 [[R]]
243
250
;
244
251
%sh1 = shl i32 1 , %y
245
252
call void @use32 (i32 %sh1 )
@@ -249,8 +256,6 @@ define i32 @masked_bit_set_use1(i32 %x, i32 %y) {
249
256
ret i32 %r
250
257
}
251
258
252
- ; Negative test
253
-
254
259
define i32 @masked_bit_set_use2 (i32 %x , i32 %y ) {
255
260
; CHECK-LABEL: @masked_bit_set_use2(
256
261
; CHECK-NEXT: [[SH1:%.*]] = shl i32 1, [[Y:%.*]]
@@ -268,8 +273,6 @@ define i32 @masked_bit_set_use2(i32 %x, i32 %y) {
268
273
ret i32 %r
269
274
}
270
275
271
- ; Negative test
272
-
273
276
define i32 @masked_bit_set_use3 (i32 %x , i32 %y ) {
274
277
; CHECK-LABEL: @masked_bit_set_use3(
275
278
; CHECK-NEXT: [[SH1:%.*]] = shl i32 1, [[Y:%.*]]
@@ -291,10 +294,10 @@ define i32 @masked_bit_clear_use1(i32 %x, i32 %y) {
291
294
; CHECK-LABEL: @masked_bit_clear_use1(
292
295
; CHECK-NEXT: [[SH1:%.*]] = shl i32 1, [[Y:%.*]]
293
296
; CHECK-NEXT: call void @use32(i32 [[SH1]])
294
- ; CHECK-NEXT: [[TMP1 :%.*]] = xor i32 [[X:%.*]], -1
295
- ; CHECK-NEXT: [[TMP2 :%.*]] = lshr i32 [[TMP1 ]], [[Y]]
296
- ; CHECK-NEXT: [[TMP3 :%.*]] = and i32 [[TMP2]], 1
297
- ; CHECK-NEXT: ret i32 [[TMP3 ]]
297
+ ; CHECK-NEXT: [[AND :%.*]] = and i32 [[SH1]], [[ X:%.*]]
298
+ ; CHECK-NEXT: [[CMP :%.*]] = icmp eq i32 [[AND ]], 0
299
+ ; CHECK-NEXT: [[R :%.*]] = zext i1 [[CMP]] to i32
300
+ ; CHECK-NEXT: ret i32 [[R ]]
298
301
;
299
302
%sh1 = shl i32 1 , %y
300
303
call void @use32 (i32 %sh1 )
@@ -304,8 +307,6 @@ define i32 @masked_bit_clear_use1(i32 %x, i32 %y) {
304
307
ret i32 %r
305
308
}
306
309
307
- ; Negative test
308
-
309
310
define i32 @masked_bit_clear_use2 (i32 %x , i32 %y ) {
310
311
; CHECK-LABEL: @masked_bit_clear_use2(
311
312
; CHECK-NEXT: [[SH1:%.*]] = shl i32 1, [[Y:%.*]]
@@ -323,8 +324,6 @@ define i32 @masked_bit_clear_use2(i32 %x, i32 %y) {
323
324
ret i32 %r
324
325
}
325
326
326
- ; Negative test
327
-
328
327
define i32 @masked_bit_clear_use3 (i32 %x , i32 %y ) {
329
328
; CHECK-LABEL: @masked_bit_clear_use3(
330
329
; CHECK-NEXT: [[SH1:%.*]] = shl i32 1, [[Y:%.*]]
@@ -342,8 +341,6 @@ define i32 @masked_bit_clear_use3(i32 %x, i32 %y) {
342
341
ret i32 %r
343
342
}
344
343
345
- ; Negative test
346
-
347
344
define i32 @masked_bits_set (i32 %x , i32 %y ) {
348
345
; CHECK-LABEL: @masked_bits_set(
349
346
; CHECK-NEXT: [[SH1:%.*]] = shl i32 3, [[Y:%.*]]
@@ -359,8 +356,6 @@ define i32 @masked_bits_set(i32 %x, i32 %y) {
359
356
ret i32 %r
360
357
}
361
358
362
- ; Negative test
363
-
364
359
define i32 @div_bit_set (i32 %x , i32 %y ) {
365
360
; CHECK-LABEL: @div_bit_set(
366
361
; CHECK-NEXT: [[SH1:%.*]] = shl i32 1, [[Y:%.*]]
@@ -376,8 +371,6 @@ define i32 @div_bit_set(i32 %x, i32 %y) {
376
371
ret i32 %r
377
372
}
378
373
379
- ; Negative test
380
-
381
374
define i32 @masked_bit_set_nonzero_cmp (i32 %x , i32 %y ) {
382
375
; CHECK-LABEL: @masked_bit_set_nonzero_cmp(
383
376
; CHECK-NEXT: [[SH1:%.*]] = shl i32 1, [[Y:%.*]]
@@ -393,8 +386,6 @@ define i32 @masked_bit_set_nonzero_cmp(i32 %x, i32 %y) {
393
386
ret i32 %r
394
387
}
395
388
396
- ; Negative test
397
-
398
389
define i32 @masked_bit_wrong_pred (i32 %x , i32 %y ) {
399
390
; CHECK-LABEL: @masked_bit_wrong_pred(
400
391
; CHECK-NEXT: [[SH1:%.*]] = shl i32 1, [[Y:%.*]]
0 commit comments