Canonicalize (X+C1)*C2 -> X*C2+C1*C2
authorChris Lattner <sabre@nondot.org>
Sat, 4 Mar 2006 06:04:02 +0000 (06:04 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 4 Mar 2006 06:04:02 +0000 (06:04 +0000)
This implements Transforms/InstCombine/add.ll:test31

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

lib/Transforms/Scalar/InstructionCombining.cpp

index 6d006b1815d066266cde60ae7a2f880632259511..c409e91ef0028eb21e14071a335cf647ac6b9557 100644 (file)
@@ -1622,6 +1622,19 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {
       if (Op1F->getValue() == 1.0)
         return ReplaceInstUsesWith(I, Op0);  // Eliminate 'mul double %X, 1.0'
     }
+    
+    if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(Op0))
+      if (Op0I->getOpcode() == Instruction::Add && Op0I->hasOneUse() &&
+          isa<ConstantInt>(Op0I->getOperand(1))) {
+        // Canonicalize (X+C1)*C2 -> X*C2+C1*C2.
+        Instruction *Add = BinaryOperator::createMul(Op0I->getOperand(0),
+                                                     Op1, "tmp");
+        InsertNewInstBefore(Add, I);
+        Value *C1C2 = ConstantExpr::getMul(Op1, 
+                                           cast<Constant>(Op0I->getOperand(1)));
+        return BinaryOperator::createAdd(Add, C1C2);
+        
+      }
 
     // Try to fold constant mul into select arguments.
     if (SelectInst *SI = dyn_cast<SelectInst>(Op0))