@@ -253,12 +253,50 @@ define <3 x i1> @t15_const_lshr_shl_ne_vec_undef6(<3 x i32> %x, <3 x i32> %y) {
253
253
ret <3 x i1 > %t3
254
254
}
255
255
256
+ ; Commutativity tests
257
+
258
+ declare i32 @gen32 ()
259
+
260
+ define i1 @t16_commutativity0 (i32 %x ) {
261
+ ; CHECK-LABEL: @t16_commutativity0(
262
+ ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32()
263
+ ; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], 1
264
+ ; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y]], 1
265
+ ; CHECK-NEXT: [[T2:%.*]] = and i32 [[T1]], [[T0]]
266
+ ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 0
267
+ ; CHECK-NEXT: ret i1 [[T3]]
268
+ ;
269
+ %y = call i32 @gen32 ()
270
+ %t0 = lshr i32 %x , 1
271
+ %t1 = shl i32 %y , 1
272
+ %t2 = and i32 %t1 , %t0
273
+ %t3 = icmp ne i32 %t2 , 0
274
+ ret i1 %t3
275
+ }
276
+
277
+ define i1 @t17_commutativity1 (i32 %y ) {
278
+ ; CHECK-LABEL: @t17_commutativity1(
279
+ ; CHECK-NEXT: [[X:%.*]] = call i32 @gen32()
280
+ ; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X]], 1
281
+ ; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], 1
282
+ ; CHECK-NEXT: [[T2:%.*]] = and i32 [[T0]], [[T1]]
283
+ ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 0
284
+ ; CHECK-NEXT: ret i1 [[T3]]
285
+ ;
286
+ %x = call i32 @gen32 ()
287
+ %t0 = lshr i32 %x , 1
288
+ %t1 = shl i32 %y , 1
289
+ %t2 = and i32 %t0 , %t1 ; "swapped"
290
+ %t3 = icmp ne i32 %t2 , 0
291
+ ret i1 %t3
292
+ }
293
+
256
294
; One-use tests
257
295
258
296
declare void @use32 (i32 )
259
297
260
- define i1 @t16_const_oneuse0 (i32 %x , i32 %y ) {
261
- ; CHECK-LABEL: @t16_const_oneuse0 (
298
+ define i1 @t18_const_oneuse0 (i32 %x , i32 %y ) {
299
+ ; CHECK-LABEL: @t18_const_oneuse0 (
262
300
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], 1
263
301
; CHECK-NEXT: call void @use32(i32 [[T0]])
264
302
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], 1
@@ -273,8 +311,8 @@ define i1 @t16_const_oneuse0(i32 %x, i32 %y) {
273
311
%t3 = icmp ne i32 %t2 , 0
274
312
ret i1 %t3
275
313
}
276
- define i1 @t17_const_oneuse1 (i32 %x , i32 %y ) {
277
- ; CHECK-LABEL: @t17_const_oneuse1 (
314
+ define i1 @t19_const_oneuse1 (i32 %x , i32 %y ) {
315
+ ; CHECK-LABEL: @t19_const_oneuse1 (
278
316
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], 1
279
317
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], 1
280
318
; CHECK-NEXT: call void @use32(i32 [[T1]])
@@ -289,8 +327,8 @@ define i1 @t17_const_oneuse1(i32 %x, i32 %y) {
289
327
%t3 = icmp ne i32 %t2 , 0
290
328
ret i1 %t3
291
329
}
292
- define i1 @t18_const_oneuse2 (i32 %x , i32 %y ) {
293
- ; CHECK-LABEL: @t18_const_oneuse2 (
330
+ define i1 @t20_const_oneuse2 (i32 %x , i32 %y ) {
331
+ ; CHECK-LABEL: @t20_const_oneuse2 (
294
332
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], 1
295
333
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], 1
296
334
; CHECK-NEXT: [[T2:%.*]] = and i32 [[T1]], [[T0]]
@@ -305,8 +343,8 @@ define i1 @t18_const_oneuse2(i32 %x, i32 %y) {
305
343
%t3 = icmp ne i32 %t2 , 0
306
344
ret i1 %t3
307
345
}
308
- define i1 @t19_const_oneuse3 (i32 %x , i32 %y ) {
309
- ; CHECK-LABEL: @t19_const_oneuse3 (
346
+ define i1 @t21_const_oneuse3 (i32 %x , i32 %y ) {
347
+ ; CHECK-LABEL: @t21_const_oneuse3 (
310
348
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], 1
311
349
; CHECK-NEXT: call void @use32(i32 [[T0]])
312
350
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], 1
@@ -323,8 +361,8 @@ define i1 @t19_const_oneuse3(i32 %x, i32 %y) {
323
361
%t3 = icmp ne i32 %t2 , 0
324
362
ret i1 %t3
325
363
}
326
- define i1 @t20_const_oneuse4 (i32 %x , i32 %y ) {
327
- ; CHECK-LABEL: @t20_const_oneuse4 (
364
+ define i1 @t22_const_oneuse4 (i32 %x , i32 %y ) {
365
+ ; CHECK-LABEL: @t22_const_oneuse4 (
328
366
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], 1
329
367
; CHECK-NEXT: call void @use32(i32 [[T0]])
330
368
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], 1
@@ -341,8 +379,8 @@ define i1 @t20_const_oneuse4(i32 %x, i32 %y) {
341
379
%t3 = icmp ne i32 %t2 , 0
342
380
ret i1 %t3
343
381
}
344
- define i1 @t21_const_oneuse5 (i32 %x , i32 %y ) {
345
- ; CHECK-LABEL: @t21_const_oneuse5 (
382
+ define i1 @t23_const_oneuse5 (i32 %x , i32 %y ) {
383
+ ; CHECK-LABEL: @t23_const_oneuse5 (
346
384
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], 1
347
385
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], 1
348
386
; CHECK-NEXT: call void @use32(i32 [[T1]])
@@ -359,8 +397,8 @@ define i1 @t21_const_oneuse5(i32 %x, i32 %y) {
359
397
%t3 = icmp ne i32 %t2 , 0
360
398
ret i1 %t3
361
399
}
362
- define i1 @t22_const_oneuse6 (i32 %x , i32 %y ) {
363
- ; CHECK-LABEL: @t22_const_oneuse6 (
400
+ define i1 @t24_const_oneuse6 (i32 %x , i32 %y ) {
401
+ ; CHECK-LABEL: @t24_const_oneuse6 (
364
402
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], 1
365
403
; CHECK-NEXT: call void @use32(i32 [[T0]])
366
404
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], 1
@@ -380,8 +418,8 @@ define i1 @t22_const_oneuse6(i32 %x, i32 %y) {
380
418
ret i1 %t3
381
419
}
382
420
383
- define i1 @t23_var_oneuse0 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
384
- ; CHECK-LABEL: @t23_var_oneuse0 (
421
+ define i1 @t25_var_oneuse0 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
422
+ ; CHECK-LABEL: @t25_var_oneuse0 (
385
423
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], [[SHAMT0:%.*]]
386
424
; CHECK-NEXT: call void @use32(i32 [[T0]])
387
425
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], [[SHAMT1:%.*]]
@@ -396,8 +434,8 @@ define i1 @t23_var_oneuse0(i32 %x, i32 %y, i32 %shamt0, i32 %shamt1) {
396
434
%t3 = icmp ne i32 %t2 , 0
397
435
ret i1 %t3
398
436
}
399
- define i1 @t24_var_oneuse1 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
400
- ; CHECK-LABEL: @t24_var_oneuse1 (
437
+ define i1 @t26_var_oneuse1 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
438
+ ; CHECK-LABEL: @t26_var_oneuse1 (
401
439
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], [[SHAMT0:%.*]]
402
440
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], [[SHAMT1:%.*]]
403
441
; CHECK-NEXT: call void @use32(i32 [[T1]])
@@ -412,8 +450,8 @@ define i1 @t24_var_oneuse1(i32 %x, i32 %y, i32 %shamt0, i32 %shamt1) {
412
450
%t3 = icmp ne i32 %t2 , 0
413
451
ret i1 %t3
414
452
}
415
- define i1 @t25_var_oneuse2 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
416
- ; CHECK-LABEL: @t25_var_oneuse2 (
453
+ define i1 @t27_var_oneuse2 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
454
+ ; CHECK-LABEL: @t27_var_oneuse2 (
417
455
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], [[SHAMT0:%.*]]
418
456
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], [[SHAMT1:%.*]]
419
457
; CHECK-NEXT: [[T2:%.*]] = and i32 [[T1]], [[T0]]
@@ -428,8 +466,8 @@ define i1 @t25_var_oneuse2(i32 %x, i32 %y, i32 %shamt0, i32 %shamt1) {
428
466
%t3 = icmp ne i32 %t2 , 0
429
467
ret i1 %t3
430
468
}
431
- define i1 @t26_var_oneuse3 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
432
- ; CHECK-LABEL: @t26_var_oneuse3 (
469
+ define i1 @t28_var_oneuse3 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
470
+ ; CHECK-LABEL: @t28_var_oneuse3 (
433
471
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], [[SHAMT0:%.*]]
434
472
; CHECK-NEXT: call void @use32(i32 [[T0]])
435
473
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], [[SHAMT1:%.*]]
@@ -446,8 +484,8 @@ define i1 @t26_var_oneuse3(i32 %x, i32 %y, i32 %shamt0, i32 %shamt1) {
446
484
%t3 = icmp ne i32 %t2 , 0
447
485
ret i1 %t3
448
486
}
449
- define i1 @t27_var_oneuse4 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
450
- ; CHECK-LABEL: @t27_var_oneuse4 (
487
+ define i1 @t29_var_oneuse4 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
488
+ ; CHECK-LABEL: @t29_var_oneuse4 (
451
489
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], [[SHAMT0:%.*]]
452
490
; CHECK-NEXT: call void @use32(i32 [[T0]])
453
491
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], [[SHAMT1:%.*]]
@@ -464,8 +502,8 @@ define i1 @t27_var_oneuse4(i32 %x, i32 %y, i32 %shamt0, i32 %shamt1) {
464
502
%t3 = icmp ne i32 %t2 , 0
465
503
ret i1 %t3
466
504
}
467
- define i1 @t28_var_oneuse5 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
468
- ; CHECK-LABEL: @t28_var_oneuse5 (
505
+ define i1 @t30_var_oneuse5 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
506
+ ; CHECK-LABEL: @t30_var_oneuse5 (
469
507
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], [[SHAMT0:%.*]]
470
508
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], [[SHAMT1:%.*]]
471
509
; CHECK-NEXT: call void @use32(i32 [[T1]])
@@ -482,8 +520,8 @@ define i1 @t28_var_oneuse5(i32 %x, i32 %y, i32 %shamt0, i32 %shamt1) {
482
520
%t3 = icmp ne i32 %t2 , 0
483
521
ret i1 %t3
484
522
}
485
- define i1 @t29_var_oneuse6 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
486
- ; CHECK-LABEL: @t29_var_oneuse6 (
523
+ define i1 @t31_var_oneuse6 (i32 %x , i32 %y , i32 %shamt0 , i32 %shamt1 ) {
524
+ ; CHECK-LABEL: @t31_var_oneuse6 (
487
525
; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], [[SHAMT0:%.*]]
488
526
; CHECK-NEXT: call void @use32(i32 [[T0]])
489
527
; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], [[SHAMT1:%.*]]
@@ -503,9 +541,85 @@ define i1 @t29_var_oneuse6(i32 %x, i32 %y, i32 %shamt0, i32 %shamt1) {
503
541
ret i1 %t3
504
542
}
505
543
544
+ ; Commutativity with extra uses
545
+
546
+ define i1 @t32_commutativity0_oneuse0 (i32 %x ) {
547
+ ; CHECK-LABEL: @t32_commutativity0_oneuse0(
548
+ ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32()
549
+ ; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], 1
550
+ ; CHECK-NEXT: call void @use32(i32 [[T0]])
551
+ ; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y]], 1
552
+ ; CHECK-NEXT: [[T2:%.*]] = and i32 [[T1]], [[T0]]
553
+ ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 0
554
+ ; CHECK-NEXT: ret i1 [[T3]]
555
+ ;
556
+ %y = call i32 @gen32 ()
557
+ %t0 = lshr i32 %x , 1
558
+ call void @use32 (i32 %t0 )
559
+ %t1 = shl i32 %y , 1
560
+ %t2 = and i32 %t1 , %t0
561
+ %t3 = icmp ne i32 %t2 , 0
562
+ ret i1 %t3
563
+ }
564
+ define i1 @t33_commutativity0_oneuse1 (i32 %x ) {
565
+ ; CHECK-LABEL: @t33_commutativity0_oneuse1(
566
+ ; CHECK-NEXT: [[Y:%.*]] = call i32 @gen32()
567
+ ; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X:%.*]], 1
568
+ ; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y]], 1
569
+ ; CHECK-NEXT: call void @use32(i32 [[T1]])
570
+ ; CHECK-NEXT: [[T2:%.*]] = and i32 [[T1]], [[T0]]
571
+ ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 0
572
+ ; CHECK-NEXT: ret i1 [[T3]]
573
+ ;
574
+ %y = call i32 @gen32 ()
575
+ %t0 = lshr i32 %x , 1
576
+ %t1 = shl i32 %y , 1
577
+ call void @use32 (i32 %t1 )
578
+ %t2 = and i32 %t1 , %t0
579
+ %t3 = icmp ne i32 %t2 , 0
580
+ ret i1 %t3
581
+ }
582
+
583
+ define i1 @t34_commutativity1_oneuse0 (i32 %y ) {
584
+ ; CHECK-LABEL: @t34_commutativity1_oneuse0(
585
+ ; CHECK-NEXT: [[X:%.*]] = call i32 @gen32()
586
+ ; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X]], 1
587
+ ; CHECK-NEXT: call void @use32(i32 [[T0]])
588
+ ; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], 1
589
+ ; CHECK-NEXT: [[T2:%.*]] = and i32 [[T0]], [[T1]]
590
+ ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 0
591
+ ; CHECK-NEXT: ret i1 [[T3]]
592
+ ;
593
+ %x = call i32 @gen32 ()
594
+ %t0 = lshr i32 %x , 1
595
+ call void @use32 (i32 %t0 )
596
+ %t1 = shl i32 %y , 1
597
+ %t2 = and i32 %t0 , %t1 ; "swapped"
598
+ %t3 = icmp ne i32 %t2 , 0
599
+ ret i1 %t3
600
+ }
601
+ define i1 @t35_commutativity1_oneuse1 (i32 %y ) {
602
+ ; CHECK-LABEL: @t35_commutativity1_oneuse1(
603
+ ; CHECK-NEXT: [[X:%.*]] = call i32 @gen32()
604
+ ; CHECK-NEXT: [[T0:%.*]] = lshr i32 [[X]], 1
605
+ ; CHECK-NEXT: [[T1:%.*]] = shl i32 [[Y:%.*]], 1
606
+ ; CHECK-NEXT: call void @use32(i32 [[T1]])
607
+ ; CHECK-NEXT: [[T2:%.*]] = and i32 [[T0]], [[T1]]
608
+ ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 0
609
+ ; CHECK-NEXT: ret i1 [[T3]]
610
+ ;
611
+ %x = call i32 @gen32 ()
612
+ %t0 = lshr i32 %x , 1
613
+ %t1 = shl i32 %y , 1
614
+ call void @use32 (i32 %t1 )
615
+ %t2 = and i32 %t0 , %t1 ; "swapped"
616
+ %t3 = icmp ne i32 %t2 , 0
617
+ ret i1 %t3
618
+ }
619
+
506
620
; Negative tests
507
- define <2 x i1 > @n20_overshift (<2 x i32 > %x , <2 x i32 > %y ) {
508
- ; CHECK-LABEL: @n20_overshift (
621
+ define <2 x i1 > @n36_overshift (<2 x i32 > %x , <2 x i32 > %y ) {
622
+ ; CHECK-LABEL: @n36_overshift (
509
623
; CHECK-NEXT: [[T0:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 15, i32 1>
510
624
; CHECK-NEXT: [[T1:%.*]] = shl <2 x i32> [[Y:%.*]], <i32 17, i32 1>
511
625
; CHECK-NEXT: [[T2:%.*]] = and <2 x i32> [[T1]], [[T0]]
0 commit comments