diff options
| author | Chris Lattner <sabre@nondot.org> | 2003-08-12 20:14:27 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2003-08-12 20:14:27 +0000 |
| commit | 58c7eb60ecdd3c093ed28b4c96fdb7c83bd862e7 (patch) | |
| tree | d3cef9e33f31b0199a48c18663ede196f8f2e818 /llvm/lib | |
| parent | 01d5639515530a855e7043b78fe0553384334dd6 (diff) | |
| download | bcm5719-llvm-58c7eb60ecdd3c093ed28b4c96fdb7c83bd862e7.tar.gz bcm5719-llvm-58c7eb60ecdd3c093ed28b4c96fdb7c83bd862e7.zip | |
Assign finer grained ranks, make sure to reassociate top-level after reassociating bottom level
llvm-svn: 7787
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/Reassociate.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Scalar/Reassociate.cpp b/llvm/lib/Transforms/Scalar/Reassociate.cpp index c4f5fb1848c..fe032116c55 100644 --- a/llvm/lib/Transforms/Scalar/Reassociate.cpp +++ b/llvm/lib/Transforms/Scalar/Reassociate.cpp @@ -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; } } |

