[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp

Chris Lattner sabre at nondot.org
Mon Nov 13 23:47:04 PST 2006



Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.543 -> 1.544
---
Log message:

implement InstCombine/shift-simplify.ll by transforming:
(X >> Z) op (Y >> Z)  -> (X op Y) >> Z

for all shifts and all ops={and/or/xor}.



---
Diffs of the changes:  (+46 -3)

 InstructionCombining.cpp |   49 ++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 46 insertions(+), 3 deletions(-)


Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.543 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.544
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.543	Tue Nov 14 00:06:06 2006
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp	Tue Nov 14 01:46:50 2006
@@ -3310,9 +3310,9 @@
   }
 
   // fold (and (cast A), (cast B)) -> (cast (and A, B))
-  if (CastInst *Op0C = dyn_cast<CastInst>(Op0)) {
-    const Type *SrcTy = Op0C->getOperand(0)->getType();
-    if (CastInst *Op1C = dyn_cast<CastInst>(Op1))
+  if (CastInst *Op1C = dyn_cast<CastInst>(Op1)) {
+    if (CastInst *Op0C = dyn_cast<CastInst>(Op0)) {
+      const Type *SrcTy = Op0C->getOperand(0)->getType();
       if (SrcTy == Op1C->getOperand(0)->getType() && SrcTy->isIntegral() &&
           // Only do this if the casts both really cause code to be generated.
           ValueRequiresCast(Op0C->getOperand(0), I.getType(), TD) &&
@@ -3323,6 +3323,21 @@
         InsertNewInstBefore(NewOp, I);
         return new CastInst(NewOp, I.getType());
       }
+    }
+  }
+    
+  // (X >> Z) & (Y >> Z)  -> (X&Y) >> Z  for all shifts.
+  if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) {
+    if (ShiftInst *SI0 = dyn_cast<ShiftInst>(Op0))
+      if (SI0->getOpcode() == SI1->getOpcode() && 
+          SI0->getOperand(1) == SI1->getOperand(1) &&
+          (SI0->hasOneUse() || SI1->hasOneUse())) {
+        Instruction *NewOp =
+          InsertNewInstBefore(BinaryOperator::createAnd(SI0->getOperand(0),
+                                                        SI1->getOperand(0),
+                                                        SI0->getName()), I);
+        return new ShiftInst(SI1->getOpcode(), NewOp, SI1->getOperand(1));
+      }
   }
 
   return Changed ? &I : 0;
@@ -3567,6 +3582,20 @@
       }
     }
   }
+  
+  // (X >> Z) | (Y >> Z)  -> (X|Y) >> Z  for all shifts.
+  if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) {
+    if (ShiftInst *SI0 = dyn_cast<ShiftInst>(Op0))
+      if (SI0->getOpcode() == SI1->getOpcode() && 
+          SI0->getOperand(1) == SI1->getOperand(1) &&
+          (SI0->hasOneUse() || SI1->hasOneUse())) {
+        Instruction *NewOp =
+        InsertNewInstBefore(BinaryOperator::createOr(SI0->getOperand(0),
+                                                     SI1->getOperand(0),
+                                                     SI0->getName()), I);
+        return new ShiftInst(SI1->getOpcode(), NewOp, SI1->getOperand(1));
+      }
+  }
 
   if (match(Op0, m_Not(m_Value(A)))) {   // ~A | Op1
     if (A == Op1)   // ~A | A == -1
@@ -3879,6 +3908,20 @@
         return new CastInst(NewOp, I.getType());
       }
   }
+
+  // (X >> Z) ^ (Y >> Z)  -> (X^Y) >> Z  for all shifts.
+  if (ShiftInst *SI1 = dyn_cast<ShiftInst>(Op1)) {
+    if (ShiftInst *SI0 = dyn_cast<ShiftInst>(Op0))
+      if (SI0->getOpcode() == SI1->getOpcode() && 
+          SI0->getOperand(1) == SI1->getOperand(1) &&
+          (SI0->hasOneUse() || SI1->hasOneUse())) {
+        Instruction *NewOp =
+        InsertNewInstBefore(BinaryOperator::createXor(SI0->getOperand(0),
+                                                      SI1->getOperand(0),
+                                                      SI0->getName()), I);
+        return new ShiftInst(SI1->getOpcode(), NewOp, SI1->getOperand(1));
+      }
+  }
     
   return Changed ? &I : 0;
 }






More information about the llvm-commits mailing list