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