@@ -388,10 +388,9 @@ define i8 @xor_shl(i8 %x, i8 %y, i8 %zarg, i8 %shamt) {
388
388
; CHECK-LABEL: define {{[^@]+}}@xor_shl
389
389
; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[ZARG:%.*]], i8 [[SHAMT:%.*]]) {
390
390
; CHECK-NEXT: [[Z:%.*]] = sdiv i8 42, [[ZARG]]
391
- ; CHECK-NEXT: [[SX:%.*]] = shl i8 [[X]], [[SHAMT]]
392
- ; CHECK-NEXT: [[SY:%.*]] = shl i8 [[Y]], [[SHAMT]]
393
- ; CHECK-NEXT: [[A:%.*]] = xor i8 [[Z]], [[SX]]
394
- ; CHECK-NEXT: [[R:%.*]] = xor i8 [[A]], [[SY]]
391
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[X]], [[Y]]
392
+ ; CHECK-NEXT: [[TMP2:%.*]] = shl i8 [[TMP1]], [[SHAMT]]
393
+ ; CHECK-NEXT: [[R:%.*]] = xor i8 [[TMP2]], [[Z]]
395
394
; CHECK-NEXT: ret i8 [[R]]
396
395
;
397
396
%z = sdiv i8 42 , %zarg ; thwart complexity-based canonicalization
@@ -406,10 +405,9 @@ define i8 @and_lshr(i8 %x, i8 %y, i8 %zarg, i8 %shamt) {
406
405
; CHECK-LABEL: define {{[^@]+}}@and_lshr
407
406
; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[ZARG:%.*]], i8 [[SHAMT:%.*]]) {
408
407
; CHECK-NEXT: [[Z:%.*]] = sdiv i8 42, [[ZARG]]
409
- ; CHECK-NEXT: [[SX:%.*]] = lshr i8 [[X]], [[SHAMT]]
410
- ; CHECK-NEXT: [[SY:%.*]] = lshr i8 [[Y]], [[SHAMT]]
411
- ; CHECK-NEXT: [[A:%.*]] = and i8 [[Z]], [[SX]]
412
- ; CHECK-NEXT: [[R:%.*]] = and i8 [[SY]], [[A]]
408
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X]], [[Y]]
409
+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i8 [[TMP1]], [[SHAMT]]
410
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[TMP2]], [[Z]]
413
411
; CHECK-NEXT: ret i8 [[R]]
414
412
;
415
413
%z = sdiv i8 42 , %zarg ; thwart complexity-based canonicalization
@@ -435,6 +433,51 @@ define i8 @or_lshr(i8 %x, i8 %y, i8 %z, i8 %shamt) {
435
433
ret i8 %r
436
434
}
437
435
436
+ define i8 @or_lshr_commuted1 (i8 %x , i8 %y , i8 %z , i8 %shamt ) {
437
+ ; CHECK-LABEL: define {{[^@]+}}@or_lshr_commuted1
438
+ ; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]], i8 [[SHAMT:%.*]]) {
439
+ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], [[Y]]
440
+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i8 [[TMP1]], [[SHAMT]]
441
+ ; CHECK-NEXT: [[R:%.*]] = or i8 [[TMP2]], [[Z]]
442
+ ; CHECK-NEXT: ret i8 [[R]]
443
+ ;
444
+ %sx = lshr i8 %x , %shamt
445
+ %sy = lshr i8 %y , %shamt
446
+ %a = or i8 %z , %sx
447
+ %r = or i8 %sy , %a
448
+ ret i8 %r
449
+ }
450
+
451
+ define i8 @or_lshr_commuted2 (i8 %x , i8 %y , i8 %z , i8 %shamt ) {
452
+ ; CHECK-LABEL: define {{[^@]+}}@or_lshr_commuted2
453
+ ; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]], i8 [[SHAMT:%.*]]) {
454
+ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], [[Y]]
455
+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i8 [[TMP1]], [[SHAMT]]
456
+ ; CHECK-NEXT: [[R:%.*]] = or i8 [[TMP2]], [[Z]]
457
+ ; CHECK-NEXT: ret i8 [[R]]
458
+ ;
459
+ %sx = lshr i8 %x , %shamt
460
+ %sy = lshr i8 %y , %shamt
461
+ %a = or i8 %z , %sx
462
+ %r = or i8 %a , %sy
463
+ ret i8 %r
464
+ }
465
+
466
+ define i8 @or_lshr_commuted3 (i8 %x , i8 %y , i8 %z , i8 %shamt ) {
467
+ ; CHECK-LABEL: define {{[^@]+}}@or_lshr_commuted3
468
+ ; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]], i8 [[SHAMT:%.*]]) {
469
+ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X]], [[Y]]
470
+ ; CHECK-NEXT: [[TMP2:%.*]] = lshr i8 [[TMP1]], [[SHAMT]]
471
+ ; CHECK-NEXT: [[R:%.*]] = or i8 [[TMP2]], [[Z]]
472
+ ; CHECK-NEXT: ret i8 [[R]]
473
+ ;
474
+ %sx = lshr i8 %x , %shamt
475
+ %sy = lshr i8 %y , %shamt
476
+ %a = or i8 %sx , %z
477
+ %r = or i8 %a , %sy
478
+ ret i8 %r
479
+ }
480
+
438
481
define i8 @xor_lshr (i8 %x , i8 %y , i8 %z , i8 %shamt ) {
439
482
; CHECK-LABEL: define {{[^@]+}}@xor_lshr
440
483
; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]], i8 [[SHAMT:%.*]]) {
0 commit comments