Skip to content

Commit bde39d7

Browse files
authored
[DAG] Add SDPatternMatch::m_BitwiseLogic common matcher for AND/OR/XOR nodes (llvm#138301)
1 parent a8344a9 commit bde39d7

File tree

4 files changed

+22
-21
lines changed

4 files changed

+22
-21
lines changed

llvm/include/llvm/CodeGen/SDPatternMatch.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,11 @@ inline BinaryOpc_match<LHS, RHS, true> m_Xor(const LHS &L, const RHS &R) {
729729
return BinaryOpc_match<LHS, RHS, true>(ISD::XOR, L, R);
730730
}
731731

732+
template <typename LHS, typename RHS>
733+
inline auto m_BitwiseLogic(const LHS &L, const RHS &R) {
734+
return m_AnyOf(m_And(L, R), m_Or(L, R), m_Xor(L, R));
735+
}
736+
732737
template <typename LHS, typename RHS>
733738
inline BinaryOpc_match<LHS, RHS, true> m_SMin(const LHS &L, const RHS &R) {
734739
return BinaryOpc_match<LHS, RHS, true>(ISD::SMIN, L, R);

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10553,29 +10553,20 @@ static SDValue foldBitOrderCrossLogicOp(SDNode *N, SelectionDAG &DAG) {
1055310553
SDValue N0 = N->getOperand(0);
1055410554
EVT VT = N->getValueType(0);
1055510555
SDLoc DL(N);
10556-
if (ISD::isBitwiseLogicOp(N0.getOpcode()) && N0.hasOneUse()) {
10557-
SDValue OldLHS = N0.getOperand(0);
10558-
SDValue OldRHS = N0.getOperand(1);
10559-
10560-
// If both operands are bswap/bitreverse, ignore the multiuse
10561-
// Otherwise need to ensure logic_op and bswap/bitreverse(x) have one use.
10562-
if (OldLHS.getOpcode() == Opcode && OldRHS.getOpcode() == Opcode) {
10563-
return DAG.getNode(N0.getOpcode(), DL, VT, OldLHS.getOperand(0),
10564-
OldRHS.getOperand(0));
10565-
}
10556+
SDValue X, Y;
1056610557

10567-
if (OldLHS.getOpcode() == Opcode && OldLHS.hasOneUse()) {
10568-
SDValue NewBitReorder = DAG.getNode(Opcode, DL, VT, OldRHS);
10569-
return DAG.getNode(N0.getOpcode(), DL, VT, OldLHS.getOperand(0),
10570-
NewBitReorder);
10571-
}
10558+
// If both operands are bswap/bitreverse, ignore the multiuse
10559+
if (sd_match(N0, m_OneUse(m_BitwiseLogic(m_UnaryOp(Opcode, m_Value(X)),
10560+
m_UnaryOp(Opcode, m_Value(Y))))))
10561+
return DAG.getNode(N0.getOpcode(), DL, VT, X, Y);
1057210562

10573-
if (OldRHS.getOpcode() == Opcode && OldRHS.hasOneUse()) {
10574-
SDValue NewBitReorder = DAG.getNode(Opcode, DL, VT, OldLHS);
10575-
return DAG.getNode(N0.getOpcode(), DL, VT, NewBitReorder,
10576-
OldRHS.getOperand(0));
10577-
}
10563+
// Otherwise need to ensure logic_op and bswap/bitreverse(x) have one use.
10564+
if (sd_match(N0, m_OneUse(m_BitwiseLogic(
10565+
m_OneUse(m_UnaryOp(Opcode, m_Value(X))), m_Value(Y))))) {
10566+
SDValue NewBitReorder = DAG.getNode(Opcode, DL, VT, Y);
10567+
return DAG.getNode(N0.getOpcode(), DL, VT, X, NewBitReorder);
1057810568
}
10569+
1057910570
return SDValue();
1058010571
}
1058110572

llvm/test/CodeGen/ARM/combine-bswap.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ define i64 @bs_or_rhs_bs64(i64 %a, i64 %b) #0 {
2323
; CHECK-NEXT: rev r1, r1
2424
; CHECK-NEXT: rev r0, r0
2525
; CHECK-NEXT: orrs r2, r1
26-
; CHECK-NEXT: orr.w r1, r0, r3
26+
; CHECK-NEXT: orr.w r1, r3, r0
2727
; CHECK-NEXT: mov r0, r2
2828
; CHECK-NEXT: bx lr
2929
%1 = tail call i64 @llvm.bswap.i64(i64 %b)

llvm/unittests/CodeGen/SelectionDAGPatternMatchTest.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,13 +302,18 @@ TEST_F(SelectionDAGPatternMatchTest, matchBinaryOp) {
302302
EXPECT_TRUE(
303303
sd_match(SFAdd, m_ChainedBinOp(ISD::STRICT_FADD, m_SpecificVT(Float32VT),
304304
m_SpecificVT(Float32VT))));
305+
EXPECT_FALSE(sd_match(Add, m_BitwiseLogic(m_Value(), m_Value())));
306+
EXPECT_FALSE(sd_match(Sub, m_BitwiseLogic(m_Value(), m_Value())));
305307

306308
EXPECT_TRUE(sd_match(And, m_c_BinOp(ISD::AND, m_Value(), m_Value())));
307309
EXPECT_TRUE(sd_match(And, m_And(m_Value(), m_Value())));
310+
EXPECT_TRUE(sd_match(And, m_BitwiseLogic(m_Value(), m_Value())));
308311
EXPECT_TRUE(sd_match(Xor, m_c_BinOp(ISD::XOR, m_Value(), m_Value())));
309312
EXPECT_TRUE(sd_match(Xor, m_Xor(m_Value(), m_Value())));
313+
EXPECT_TRUE(sd_match(Xor, m_BitwiseLogic(m_Value(), m_Value())));
310314
EXPECT_TRUE(sd_match(Or, m_c_BinOp(ISD::OR, m_Value(), m_Value())));
311315
EXPECT_TRUE(sd_match(Or, m_Or(m_Value(), m_Value())));
316+
EXPECT_TRUE(sd_match(Or, m_BitwiseLogic(m_Value(), m_Value())));
312317
EXPECT_FALSE(sd_match(Or, m_DisjointOr(m_Value(), m_Value())));
313318

314319
EXPECT_TRUE(sd_match(DisOr, m_Or(m_Value(), m_Value())));

0 commit comments

Comments
 (0)