Disable the (A == (B-A)) -> 2*A == B xform when the sub has multiple uses (in
authorChris Lattner <sabre@nondot.org>
Sat, 19 May 2007 00:43:44 +0000 (00:43 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 19 May 2007 00:43:44 +0000 (00:43 +0000)
this case, the xform introduces an extra operation).  This compiles
PowerPC/compare-duplicate.ll into:

_test:
        subf r2, r3, r4
        cmplw cr0, r2, r3
        bne cr0, LBB1_2 ;F

instead of:

_test:
        slwi r2, r3, 1
        subf r3, r3, r4
        cmplw cr0, r4, r2
        bne cr0, LBB1_2 ;F

This is target independent of course.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37246 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/TargetLowering.cpp

index a2cd12801dd7eeec44c81c68f37cda397e5e1b24..e5883f60c53fe0ce8d0381118cc18072e3dd8f39 100644 (file)
@@ -1785,7 +1785,7 @@ TargetLowering::SimplifySetCC(MVT::ValueType VT, SDOperand N0, SDOperand N1,
         if (DAG.isCommutativeBinOp(N0.getOpcode()))
           return DAG.getSetCC(VT, N0.getOperand(0),
                           DAG.getConstant(0, N0.getValueType()), Cond);
-        else {
+        else if (N0.Val->hasOneUse()) {
           assert(N0.getOpcode() == ISD::SUB && "Unexpected operation!");
           // (Z-X) == X  --> Z == X<<1
           SDOperand SH = DAG.getNode(ISD::SHL, N1.getValueType(),