Assign finer grained ranks, make sure to reassociate top-level after reassociating...
authorChris Lattner <sabre@nondot.org>
Tue, 12 Aug 2003 20:14:27 +0000 (20:14 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 12 Aug 2003 20:14:27 +0000 (20:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7787 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/Reassociate.cpp

index c4f5fb1848cabf8275416dc54299284b1c2f74ed..fe032116c55d0f571e35985c1cfb952e869126e5 100644 (file)
@@ -57,20 +57,20 @@ namespace {
 Pass *createReassociatePass() { return new Reassociate(); }
 
 void Reassociate::BuildRankMap(Function &F) {
-  unsigned i = 1;
+  unsigned i = 2;
   ReversePostOrderTraversal<Function*> RPOT(&F);
   for (ReversePostOrderTraversal<Function*>::rpo_iterator I = RPOT.begin(),
          E = RPOT.end(); I != E; ++I)
-    RankMap[*I] = ++i;
+    RankMap[*I] = ++i << 16;
 }
 
 unsigned Reassociate::getRank(Value *V) {
   if (isa<Argument>(V)) return 1;   // Function argument...
   if (Instruction *I = dyn_cast<Instruction>(V)) {
-    // If this is an expression, return the MAX(rank(LHS), rank(RHS)) so that we
-    // can reassociate expressions for code motion!  Since we do not recurse for
-    // PHI nodes, we cannot have infinite recursion here, because there cannot
-    // be loops in the value graph that do not go through PHI nodes.
+    // If this is an expression, return the 1+MAX(rank(LHS), rank(RHS)) so that
+    // we can reassociate expressions for code motion!  Since we do not recurse
+    // for PHI nodes, we cannot have infinite recursion here, because there
+    // cannot be loops in the value graph that do not go through PHI nodes.
     //
     if (I->getOpcode() == Instruction::PHINode ||
         I->getOpcode() == Instruction::Alloca ||
@@ -87,7 +87,10 @@ unsigned Reassociate::getRank(Value *V) {
          i != e && Rank != MaxRank; ++i)
       Rank = std::max(Rank, getRank(I->getOperand(i)));
 
-    return CachedRank = Rank;
+    DEBUG(std::cerr << "Calculated Rank[" << V->getName() << "] = "
+                    << Rank+1 << "\n");
+
+    return CachedRank = Rank+1;
   }
 
   // Otherwise it's a global or constant, rank 0.
@@ -145,6 +148,7 @@ bool Reassociate::ReassociateExpr(BinaryOperator *I) {
 
         // Since we modified the RHS instruction, make sure that we recheck it.
         ReassociateExpr(LHSI);
+        ReassociateExpr(I);
         return true;
       }
     }