Add folding rules for mul X, 0 and mul X, 2
authorChris Lattner <sabre@nondot.org>
Mon, 29 Apr 2002 22:24:47 +0000 (22:24 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 29 Apr 2002 22:24:47 +0000 (22:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2417 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 71c8723e42b159818781afb813b60baef5f31008..2ad2356de34f6e75de0bd313bb0ef6d26cea3721 100644 (file)
@@ -2,7 +2,7 @@
 //
 // InstructionCombining - Combine instructions to form fewer, simple
 //   instructions.  This pass does not modify the CFG, and has a tendancy to
-//   make instructions dead, so a subsequent DCE pass is useful.
+//   make instructions dead, so a subsequent DIE pass is useful.
 //
 // This pass combines things like:
 //    %Y = add int 1, %X
@@ -75,8 +75,7 @@ namespace {
 //
 static bool SimplifyBinOp(BinaryOperator *I) {
   if (isa<Constant>(I->getOperand(0)) && !isa<Constant>(I->getOperand(1)))
-    if (!I->swapOperands())
-      return true;
+    return !I->swapOperands();
   return false;
 }
 
@@ -146,6 +145,17 @@ Instruction *InstCombiner::visitMul(BinaryOperator *I) {
       AddUsesToWorkList(I);         // Add all modified instrs to worklist
       I->replaceAllUsesWith(Op1);
       return I;
+
+    } else if (I->getType()->isIntegral() &&
+               cast<ConstantInt>(Op2)->equalsInt(2)) {
+      // Convert 'mul int %X, 2' to 'add int %X, %X'
+      return BinaryOperator::create(Instruction::Add, Op1, Op1, I->getName());
+
+    } else if (Op2->isNullValue()) {
+      // Eliminate 'mul int %X, 0'
+      AddUsesToWorkList(I);         // Add all modified instrs to worklist
+      I->replaceAllUsesWith(Op2);   // Set this value to zero directly
+      return I;
     }
   }