@@ -13859,43 +13859,30 @@ static SDValue getMad64_32(SelectionDAG &DAG, const SDLoc &SL, EVT VT,
13859
13859
13860
13860
// Fold
13861
13861
// y = lshr i64 x, 32
13862
- // res = add (mul i64 y, Constant ), x where "Constant " is a 32 bit
13863
- // negative value
13862
+ // res = add (mul i64 y, Const ), x where "Const " is a 64- bit constant
13863
+ // with Const.hi == -1
13864
13864
// To
13865
- // res = mad_u64_u32 y.lo ,Constant .lo, x.lo
13865
+ // res = mad_u64_u32 y.lo ,Const .lo, x.lo
13866
13866
static SDValue tryFoldMADwithSRL(SelectionDAG &DAG, const SDLoc &SL,
13867
13867
SDValue MulLHS, SDValue MulRHS,
13868
13868
SDValue AddRHS) {
13869
13869
13870
- if (MulLHS.getValueType() != MVT::i64)
13870
+ if (MulLHS.getValueType() != MVT::i64 || MulLHS.getOpcode() != ISD::SRL )
13871
13871
return SDValue();
13872
13872
13873
- ConstantSDNode *ConstOp;
13874
- SDValue ShiftOp;
13875
- if (MulLHS.getOpcode() == ISD::SRL && MulRHS.getOpcode() == ISD::Constant) {
13876
- ConstOp = cast<ConstantSDNode>(MulRHS.getNode());
13877
- ShiftOp = MulLHS;
13878
- } else if (MulRHS.getOpcode() == ISD::SRL &&
13879
- MulLHS.getOpcode() == ISD::Constant) {
13880
- ConstOp = cast<ConstantSDNode>(MulLHS.getNode());
13881
- ShiftOp = MulRHS;
13882
- } else
13883
- return SDValue();
13884
-
13885
- if (ShiftOp.getOperand(1).getOpcode() != ISD::Constant ||
13886
- AddRHS != ShiftOp.getOperand(0))
13873
+ if (MulLHS.getOperand(1).getOpcode() != ISD::Constant ||
13874
+ MulLHS.getOperand(0) != AddRHS)
13887
13875
return SDValue();
13888
13876
13889
- if (cast<ConstantSDNode>(ShiftOp ->getOperand(1))->getAsZExtVal() != 32)
13877
+ if (cast<ConstantSDNode>(MulLHS ->getOperand(1))->getAsZExtVal() != 32)
13890
13878
return SDValue();
13891
13879
13892
- APInt ConstVal = ConstOp ->getAPIntValue();
13893
- if (!ConstVal .isNegative() || !ConstVal .isSignedIntN(33))
13880
+ APInt Const = cast<ConstantSDNode>(MulRHS.getNode()) ->getAPIntValue();
13881
+ if (!Const .isNegative() || !Const .isSignedIntN(33))
13894
13882
return SDValue();
13895
13883
13896
- SDValue Zero = DAG.getConstant(0, SL, MVT::i32);
13897
- SDValue ConstMul = DAG.getConstant(
13898
- ConstVal.getZExtValue() & 0x00000000FFFFFFFF, SL, MVT::i32);
13884
+ SDValue ConstMul =
13885
+ DAG.getConstant(Const.getZExtValue() & 0x00000000FFFFFFFF, SL, MVT::i32);
13899
13886
AddRHS = DAG.getNode(ISD::AND, SL, MVT::i64, AddRHS,
13900
13887
DAG.getConstant(0x00000000FFFFFFFF, SL, MVT::i64));
13901
13888
return getMad64_32(DAG, SL, MVT::i64,
@@ -13961,8 +13948,14 @@ SDValue SITargetLowering::tryFoldToMad64_32(SDNode *N,
13961
13948
SDValue MulRHS = LHS.getOperand(1);
13962
13949
SDValue AddRHS = RHS;
13963
13950
13964
- if (SDValue FoldedMAD = tryFoldMADwithSRL(DAG, SL, MulLHS, MulRHS, AddRHS))
13965
- return FoldedMAD;
13951
+ if (MulLHS.getOpcode() == ISD::Constant ||
13952
+ MulRHS.getOpcode() == ISD::Constant) {
13953
+ if (MulRHS.getOpcode() == ISD::SRL)
13954
+ std::swap(MulLHS, MulRHS);
13955
+
13956
+ if (SDValue FoldedMAD = tryFoldMADwithSRL(DAG, SL, MulLHS, MulRHS, AddRHS))
13957
+ return FoldedMAD;
13958
+ }
13966
13959
13967
13960
// Always check whether operands are small unsigned values, since that
13968
13961
// knowledge is useful in more cases. Check for small signed values only if
0 commit comments