[llvm] [DAG] Add SDPatternMatch::m_BitwiseLogic common matcher for AND/OR/XOR nodes (PR #138301)
Min-Yih Hsu via llvm-commits
llvm-commits at lists.llvm.org
Fri May 2 10:34:33 PDT 2025
================
@@ -10553,29 +10553,20 @@ static SDValue foldBitOrderCrossLogicOp(SDNode *N, SelectionDAG &DAG) {
SDValue N0 = N->getOperand(0);
EVT VT = N->getValueType(0);
SDLoc DL(N);
- if (ISD::isBitwiseLogicOp(N0.getOpcode()) && N0.hasOneUse()) {
- SDValue OldLHS = N0.getOperand(0);
- SDValue OldRHS = N0.getOperand(1);
-
- // If both operands are bswap/bitreverse, ignore the multiuse
- // Otherwise need to ensure logic_op and bswap/bitreverse(x) have one use.
- if (OldLHS.getOpcode() == Opcode && OldRHS.getOpcode() == Opcode) {
- return DAG.getNode(N0.getOpcode(), DL, VT, OldLHS.getOperand(0),
- OldRHS.getOperand(0));
- }
+ SDValue X, Y;
- if (OldLHS.getOpcode() == Opcode && OldLHS.hasOneUse()) {
- SDValue NewBitReorder = DAG.getNode(Opcode, DL, VT, OldRHS);
- return DAG.getNode(N0.getOpcode(), DL, VT, OldLHS.getOperand(0),
- NewBitReorder);
- }
+ // If both operands are bswap/bitreverse, ignore the multiuse
+ if (sd_match(N0, m_OneUse(m_BitwiseLogic(m_UnaryOp(Opcode, m_Value(X)),
+ m_UnaryOp(Opcode, m_Value(Y))))))
+ return DAG.getNode(N0.getOpcode(), DL, VT, X, Y);
- if (OldRHS.getOpcode() == Opcode && OldRHS.hasOneUse()) {
- SDValue NewBitReorder = DAG.getNode(Opcode, DL, VT, OldLHS);
- return DAG.getNode(N0.getOpcode(), DL, VT, NewBitReorder,
- OldRHS.getOperand(0));
- }
+ // Otherwise need to ensure logic_op and bswap/bitreverse(x) have one use.
+ if (sd_match(N0, m_OneUse(m_BitwiseLogic(
+ m_OneUse(m_UnaryOp(Opcode, m_Value(X))), m_Value(Y))))) {
+ SDValue NewBitReorder = DAG.getNode(Opcode, DL, VT, Y);
+ return DAG.getNode(N0.getOpcode(), DL, VT, X, NewBitReorder);
----------------
mshockwave wrote:
originally we had:
```
(bswap (logic_op(bswap(x),y))) -> logic_op(x,bswap(y))
```
and
```
(bswap (logic_op(x, bswap(y)))) -> logic_op(bswap(x),y)
```
but I think the new code would always generate `logic_op(x,bswap(y))` even when the source pattern is `(bswap (logic_op(x, bswap(y))))`, which I believe is not correct.
https://github.com/llvm/llvm-project/pull/138301
More information about the llvm-commits
mailing list