@@ -8512,39 +8512,33 @@ SDValue DAGCombiner::MatchFunnelPosNeg(SDValue N0, SDValue N1, SDValue Pos,
8512
8512
// so for now just use the PosOpcode case if its legal.
8513
8513
// TODO: When can we use the NegOpcode case?
8514
8514
if (PosOpcode == ISD::FSHL && isPowerOf2_32(EltBits)) {
8515
- auto IsBinOpImm = [](SDValue Op, unsigned BinOpc, unsigned Imm) {
8516
- if (Op.getOpcode() != BinOpc)
8517
- return false;
8518
- ConstantSDNode *Cst = isConstOrConstSplat(Op.getOperand(1));
8519
- return Cst && (Cst->getAPIntValue() == Imm);
8520
- };
8521
-
8515
+ SDValue X;
8522
8516
// fold (or (shl x0, y), (srl (srl x1, 1), (xor y, 31)))
8523
8517
// -> (fshl x0, x1, y)
8524
- if (IsBinOpImm (N1, ISD::SRL, 1 ) &&
8525
- IsBinOpImm (InnerNeg, ISD::XOR, EltBits - 1) &&
8526
- InnerPos == InnerNeg.getOperand(0 ) &&
8518
+ if (sd_match (N1, m_Srl(m_Value(X), m_One()) ) &&
8519
+ sd_match (InnerNeg,
8520
+ m_Xor(m_Specific(InnerPos), m_SpecificInt(EltBits - 1)) ) &&
8527
8521
TLI.isOperationLegalOrCustom(ISD::FSHL, VT)) {
8528
- return DAG.getNode(ISD::FSHL, DL, VT, N0, N1.getOperand(0) , Pos);
8522
+ return DAG.getNode(ISD::FSHL, DL, VT, N0, X , Pos);
8529
8523
}
8530
8524
8531
8525
// fold (or (shl (shl x0, 1), (xor y, 31)), (srl x1, y))
8532
8526
// -> (fshr x0, x1, y)
8533
- if (IsBinOpImm (N0, ISD::SHL, 1 ) &&
8534
- IsBinOpImm (InnerPos, ISD::XOR, EltBits - 1) &&
8535
- InnerNeg == InnerPos.getOperand(0 ) &&
8527
+ if (sd_match (N0, m_Shl(m_Value(X), m_One()) ) &&
8528
+ sd_match (InnerPos,
8529
+ m_Xor(m_Specific(InnerNeg), m_SpecificInt(EltBits - 1)) ) &&
8536
8530
TLI.isOperationLegalOrCustom(ISD::FSHR, VT)) {
8537
- return DAG.getNode(ISD::FSHR, DL, VT, N0.getOperand(0) , N1, Neg);
8531
+ return DAG.getNode(ISD::FSHR, DL, VT, X , N1, Neg);
8538
8532
}
8539
8533
8540
8534
// fold (or (shl (add x0, x0), (xor y, 31)), (srl x1, y))
8541
8535
// -> (fshr x0, x1, y)
8542
8536
// TODO: Should add(x,x) -> shl(x,1) be a general DAG canonicalization?
8543
- if (N0.getOpcode() == ISD::ADD && N0.getOperand(0) == N0.getOperand(1 ) &&
8544
- IsBinOpImm (InnerPos, ISD::XOR, EltBits - 1) &&
8545
- InnerNeg == InnerPos.getOperand(0 ) &&
8537
+ if (sd_match(N0, m_Add(m_Value(X), m_Deferred(X)) ) &&
8538
+ sd_match (InnerPos,
8539
+ m_Xor(m_Specific(InnerNeg), m_SpecificInt(EltBits - 1)) ) &&
8546
8540
TLI.isOperationLegalOrCustom(ISD::FSHR, VT)) {
8547
- return DAG.getNode(ISD::FSHR, DL, VT, N0.getOperand(0) , N1, Neg);
8541
+ return DAG.getNode(ISD::FSHR, DL, VT, X , N1, Neg);
8548
8542
}
8549
8543
}
8550
8544
0 commit comments