Promote shifts by a constant to multiplies so that we can reassociate
authorChris Lattner <sabre@nondot.org>
Tue, 14 Mar 2006 06:55:18 +0000 (06:55 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 14 Mar 2006 06:55:18 +0000 (06:55 +0000)
(x<<1)+(y<<1) -> (X+Y)<<1.  This implements
Transforms/Reassociate/shift-factor.ll

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

lib/Transforms/Scalar/Reassociate.cpp

index 61c5c4953c1ade3e91e16143887c25a28bacd27a..4a484c3584a856d716dbe758b323363d4beaeea5 100644 (file)
@@ -410,19 +410,23 @@ static Instruction *BreakUpSubtract(Instruction *Sub) {
 /// by one, change this into a multiply by a constant to assist with further
 /// reassociation.
 static Instruction *ConvertShiftToMul(Instruction *Shl) {
-  if (!isReassociableOp(Shl->getOperand(0), Instruction::Mul) &&
-      !(Shl->hasOneUse() && isReassociableOp(Shl->use_back(),Instruction::Mul)))
-    return 0;
-
-  Constant *MulCst = ConstantInt::get(Shl->getType(), 1);
-  MulCst = ConstantExpr::getShl(MulCst, cast<Constant>(Shl->getOperand(1)));
-
-  std::string Name = Shl->getName();  Shl->setName("");
-  Instruction *Mul = BinaryOperator::createMul(Shl->getOperand(0), MulCst,
-                                               Name, Shl);
-  Shl->replaceAllUsesWith(Mul);
-  Shl->eraseFromParent();
-  return Mul;
+  // If an operand of this shift is a reassociable multiply, or if the shift
+  // is used by a reassociable multiply or add, turn into a multiply.
+  if (isReassociableOp(Shl->getOperand(0), Instruction::Mul) ||
+      (Shl->hasOneUse() && 
+       (isReassociableOp(Shl->use_back(), Instruction::Mul) ||
+        isReassociableOp(Shl->use_back(), Instruction::Add)))) {
+    Constant *MulCst = ConstantInt::get(Shl->getType(), 1);
+    MulCst = ConstantExpr::getShl(MulCst, cast<Constant>(Shl->getOperand(1)));
+    
+    std::string Name = Shl->getName();  Shl->setName("");
+    Instruction *Mul = BinaryOperator::createMul(Shl->getOperand(0), MulCst,
+                                                 Name, Shl);
+    Shl->replaceAllUsesWith(Mul);
+    Shl->eraseFromParent();
+    return Mul;
+  }
+  return 0;
 }
 
 // Scan backwards and forwards among values with the same rank as element i to