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

Chris Lattner lattner at cs.uiuc.edu
Sat May 7 17:08:46 PDT 2005



Changes in directory llvm/lib/Transforms/Scalar:

Reassociate.cpp updated: 1.39 -> 1.40
---
Log message:

Handle some simple cases where we can see that values get annihilated.


---
Diffs of the changes:  (+42 -7)

 Reassociate.cpp |   49 ++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 42 insertions(+), 7 deletions(-)


Index: llvm/lib/Transforms/Scalar/Reassociate.cpp
diff -u llvm/lib/Transforms/Scalar/Reassociate.cpp:1.39 llvm/lib/Transforms/Scalar/Reassociate.cpp:1.40
--- llvm/lib/Transforms/Scalar/Reassociate.cpp:1.39	Sat May  7 16:59:39 2005
+++ llvm/lib/Transforms/Scalar/Reassociate.cpp	Sat May  7 19:08:33 2005
@@ -113,10 +113,16 @@
        i != e && Rank != MaxRank; ++i)
     Rank = std::max(Rank, getRank(I->getOperand(i)));
   
+  // If this is a not or neg instruction, do not count it for rank.  This
+  // assures us that X and ~X will have the same rank.
+  if (!I->getType()->isIntegral() ||
+      (!BinaryOperator::isNot(I) && !BinaryOperator::isNeg(I)))
+    ++Rank;
+
   DEBUG(std::cerr << "Calculated Rank[" << V->getName() << "] = "
-        << Rank+1 << "\n");
+        << Rank << "\n");
   
-  return CachedRank = Rank+1;
+  return CachedRank = Rank;
 }
 
 /// isReassociableOp - Return true if V is an instruction of the specified
@@ -388,11 +394,40 @@
           goto FoldConstants;
         }
 
-    // FIXME: Handle destructive annihilation here.  Ensure RANK(neg(x)) ==
-    // RANK(x) [and not].  Handle case when Cst = 0 and op = AND f.e.
-
-    // FIXME: Handle +0,*1,&~0,... at end of the list.
-
+    // Check for destructive annihilation due to a constant being used.
+    if (Ops.size() != 1) {  // Nothing to annihilate?
+      if (ConstantIntegral *CstVal = dyn_cast<ConstantIntegral>(Ops.back().Op))
+        switch (I->getOpcode()) {
+        default: break;
+        case Instruction::And:
+          if (CstVal->isNullValue()) {           // ... & 0 -> 0
+            Ops[0].Op = CstVal;
+            Ops.erase(Ops.begin()+1, Ops.end());
+          } else if (CstVal->isAllOnesValue()) { // ... & -1 -> ...
+            Ops.pop_back();
+          }
+          break;
+        case Instruction::Mul:
+          if (CstVal->isNullValue()) {           // ... * 0 -> 0
+            Ops[0].Op = CstVal;
+            Ops.erase(Ops.begin()+1, Ops.end());
+          } else if (cast<ConstantInt>(CstVal)->getRawValue() == 1) {
+            Ops.pop_back();                      // ... * 1 -> ...
+          }
+          break;
+        case Instruction::Or:
+          if (CstVal->isAllOnesValue()) {        // ... | -1 -> -1
+            Ops[0].Op = CstVal;
+            Ops.erase(Ops.begin()+1, Ops.end());
+          }
+          // FALLTHROUGH!
+        case Instruction::Add:
+        case Instruction::Xor:
+          if (CstVal->isNullValue())             // ... [|^+] 0 -> ...
+            Ops.pop_back();
+          break;
+        }
+    }
 
     if (Ops.size() == 1) {
       // This expression tree simplified to something that isn't a tree,






More information about the llvm-commits mailing list