@@ -9733,43 +9733,46 @@ SDValue TargetLowering::expandABS(SDNode *N, SelectionDAG &DAG,
97339733SDValue TargetLowering::expandABD (SDNode *N, SelectionDAG &DAG) const {
97349734 SDLoc dl (N);
97359735 EVT VT = N->getValueType (0 );
9736- SDValue LHS = DAG. getFreeze ( N->getOperand (0 ) );
9737- SDValue RHS = DAG. getFreeze ( N->getOperand (1 ) );
9736+ SDValue LHS = N->getOperand (0 );
9737+ SDValue RHS = N->getOperand (1 );
97389738 bool IsSigned = N->getOpcode () == ISD::ABDS;
97399739
97409740 // abds(lhs, rhs) -> sub(smax(lhs,rhs), smin(lhs,rhs))
97419741 // abdu(lhs, rhs) -> sub(umax(lhs,rhs), umin(lhs,rhs))
97429742 unsigned MaxOpc = IsSigned ? ISD::SMAX : ISD::UMAX;
97439743 unsigned MinOpc = IsSigned ? ISD::SMIN : ISD::UMIN;
97449744 if (isOperationLegal (MaxOpc, VT) && isOperationLegal (MinOpc, VT)) {
9745+ LHS = DAG.getFreeze (LHS);
9746+ RHS = DAG.getFreeze (RHS);
97459747 SDValue Max = DAG.getNode (MaxOpc, dl, VT, LHS, RHS);
97469748 SDValue Min = DAG.getNode (MinOpc, dl, VT, LHS, RHS);
97479749 return DAG.getNode (ISD::SUB, dl, VT, Max, Min);
97489750 }
97499751
97509752 // abdu(lhs, rhs) -> or(usubsat(lhs,rhs), usubsat(rhs,lhs))
9751- if (!IsSigned && isOperationLegal (ISD::USUBSAT, VT))
9753+ if (!IsSigned && isOperationLegal (ISD::USUBSAT, VT)) {
9754+ LHS = DAG.getFreeze (LHS);
9755+ RHS = DAG.getFreeze (RHS);
97529756 return DAG.getNode (ISD::OR, dl, VT,
97539757 DAG.getNode (ISD::USUBSAT, dl, VT, LHS, RHS),
97549758 DAG.getNode (ISD::USUBSAT, dl, VT, RHS, LHS));
9759+ }
97559760
97569761 // If the subtract doesn't overflow then just use abs(sub())
9757- // NOTE: don't use frozen operands for value tracking.
9758- bool IsNonNegative = DAG.SignBitIsZero (N->getOperand (1 )) &&
9759- DAG.SignBitIsZero (N->getOperand (0 ));
9762+ bool IsNonNegative = DAG.SignBitIsZero (LHS) && DAG.SignBitIsZero (RHS);
97609763
9761- if (DAG.willNotOverflowSub (IsSigned || IsNonNegative, N->getOperand (0 ),
9762- N->getOperand (1 )))
9764+ if (DAG.willNotOverflowSub (IsSigned || IsNonNegative, LHS, RHS))
97639765 return DAG.getNode (ISD::ABS, dl, VT,
97649766 DAG.getNode (ISD::SUB, dl, VT, LHS, RHS));
97659767
9766- if (DAG.willNotOverflowSub (IsSigned || IsNonNegative, N->getOperand (1 ),
9767- N->getOperand (0 )))
9768+ if (DAG.willNotOverflowSub (IsSigned || IsNonNegative, RHS, LHS))
97689769 return DAG.getNode (ISD::ABS, dl, VT,
97699770 DAG.getNode (ISD::SUB, dl, VT, RHS, LHS));
97709771
97719772 EVT CCVT = getSetCCResultType (DAG.getDataLayout (), *DAG.getContext (), VT);
97729773 ISD::CondCode CC = IsSigned ? ISD::CondCode::SETGT : ISD::CondCode::SETUGT;
9774+ LHS = DAG.getFreeze (LHS);
9775+ RHS = DAG.getFreeze (RHS);
97739776 SDValue Cmp = DAG.getSetCC (dl, CCVT, LHS, RHS, CC);
97749777
97759778 // Branchless expansion iff cmp result is allbits:
0 commit comments