Swap the order of operands created here. For +&|^, the order doesn't matter,
authorChris Lattner <sabre@nondot.org>
Wed, 31 May 2006 21:14:00 +0000 (21:14 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 31 May 2006 21:14:00 +0000 (21:14 +0000)
but for sub, it really does!  Fix fixes a miscompilation of fibheap_cut in
llvmgcc4.

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

lib/Transforms/Scalar/InstructionCombining.cpp

index 30a1de23aa49c83eae51667da2c0556b357e0682..3a099af9e98ee74ffbc29bad7e99a46d5f5f0d1c 100644 (file)
@@ -4437,7 +4437,7 @@ Instruction *InstCombiner::FoldShiftByConstant(Value *Op0, ConstantUInt *Op1,
                                             Op0BO->getName());
             InsertNewInstBefore(YS, I); // (Y << C)
             Instruction *X =
-              BinaryOperator::create(Op0BO->getOpcode(), YS, V1,
+              BinaryOperator::create(Op0BO->getOpcode(), V1, YS,
                                      Op0BO->getOperand(0)->getName());
             InsertNewInstBefore(X, I);  // (X + (Y << C))
             Constant *C2 = ConstantInt::getAllOnesValue(X->getType());
@@ -4445,6 +4445,7 @@ Instruction *InstCombiner::FoldShiftByConstant(Value *Op0, ConstantUInt *Op1,
             return BinaryOperator::createAnd(X, C2);
           }
           
+          // Turn (((X >> C)&CC) + Y) << C  ->  (X + (Y << C)) & (CC << C)
           if (isLeftShift && Op0BO->getOperand(0)->hasOneUse() &&
               match(Op0BO->getOperand(0),
                     m_And(m_Shr(m_Value(V1), m_Value(V2)),
@@ -4460,7 +4461,7 @@ Instruction *InstCombiner::FoldShiftByConstant(Value *Op0, ConstantUInt *Op1,
                                         V1->getName()+".mask");
             InsertNewInstBefore(XM, I); // X & (CC << C)
             
-            return BinaryOperator::create(Op0BO->getOpcode(), YS, XM);
+            return BinaryOperator::create(Op0BO->getOpcode(), XM, YS);
           }
           
           break;