summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-08-12 20:14:27 +0000
committerChris Lattner <sabre@nondot.org>2003-08-12 20:14:27 +0000
commit58c7eb60ecdd3c093ed28b4c96fdb7c83bd862e7 (patch)
treed3cef9e33f31b0199a48c18663ede196f8f2e818 /llvm/lib
parent01d5639515530a855e7043b78fe0553384334dd6 (diff)
downloadbcm5719-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.cpp18
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;
}
}
OpenPOWER on IntegriCloud