Skip to content

Commit b8337dc

Browse files
authored
[InstCombine] Handle commuted patterns in foldBinOpShiftWithShift (#122126)
Closes #121775.
1 parent 9ba6e8d commit b8337dc

File tree

2 files changed

+55
-13
lines changed

2 files changed

+55
-13
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -939,12 +939,11 @@ Instruction *InstCombinerImpl::foldBinOpShiftWithShift(BinaryOperator &I) {
939939
m_OneUse(m_Shift(m_Value(Y), m_Value(Shift)))))
940940
return nullptr;
941941
if (!match(I.getOperand(1 - ShOpnum),
942-
m_BinOp(m_Value(ShiftedX), m_Value(Mask))))
942+
m_c_BinOp(m_CombineAnd(
943+
m_OneUse(m_Shift(m_Value(X), m_Specific(Shift))),
944+
m_Value(ShiftedX)),
945+
m_Value(Mask))))
943946
return nullptr;
944-
945-
if (!match(ShiftedX, m_OneUse(m_Shift(m_Value(X), m_Specific(Shift)))))
946-
return nullptr;
947-
948947
// Make sure we are matching instruction shifts and not ConstantExpr
949948
auto *IY = dyn_cast<Instruction>(I.getOperand(ShOpnum));
950949
auto *IX = dyn_cast<Instruction>(ShiftedX);

llvm/test/Transforms/InstCombine/and-xor-or.ll

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -388,10 +388,9 @@ define i8 @xor_shl(i8 %x, i8 %y, i8 %zarg, i8 %shamt) {
388388
; CHECK-LABEL: define {{[^@]+}}@xor_shl
389389
; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[ZARG:%.*]], i8 [[SHAMT:%.*]]) {
390390
; 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]]
395394
; CHECK-NEXT: ret i8 [[R]]
396395
;
397396
%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) {
406405
; CHECK-LABEL: define {{[^@]+}}@and_lshr
407406
; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[ZARG:%.*]], i8 [[SHAMT:%.*]]) {
408407
; 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]]
413411
; CHECK-NEXT: ret i8 [[R]]
414412
;
415413
%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) {
435433
ret i8 %r
436434
}
437435

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+
438481
define i8 @xor_lshr(i8 %x, i8 %y, i8 %z, i8 %shamt) {
439482
; CHECK-LABEL: define {{[^@]+}}@xor_lshr
440483
; CHECK-SAME: (i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]], i8 [[SHAMT:%.*]]) {

0 commit comments

Comments
 (0)