aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Analysis
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2010-08-13 21:24:58 +0000
committerDan Gohman <gohman@apple.com>2010-08-13 21:24:58 +0000
commit0ad2c7ace8abe46a86724a0ad939515d23d5c402 (patch)
tree23cfa07dd5dc761ab4685cd4cf67095254623481 /lib/Analysis
parentfc412d85c46a8656361fe1e9197ea85922e2cd61 (diff)
downloadexternal_llvm-0ad2c7ace8abe46a86724a0ad939515d23d5c402.zip
external_llvm-0ad2c7ace8abe46a86724a0ad939515d23d5c402.tar.gz
external_llvm-0ad2c7ace8abe46a86724a0ad939515d23d5c402.tar.bz2
Various optimizations. Don't compare two loops' depths
when they are the same loop. Don't compare two instructions' loop depths when they are in the same block. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111045 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r--lib/Analysis/ScalarEvolution.cpp44
1 files changed, 26 insertions, 18 deletions
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp
index 2cf8fff..a9679d9 100644
--- a/lib/Analysis/ScalarEvolution.cpp
+++ b/lib/Analysis/ScalarEvolution.cpp
@@ -545,40 +545,45 @@ namespace {
// not as complete as it could be.
if (const SCEVUnknown *LU = dyn_cast<SCEVUnknown>(LHS)) {
const SCEVUnknown *RU = cast<SCEVUnknown>(RHS);
+ const Value *LV = LU->getValue(), *RV = RU->getValue();
// Order pointer values after integer values. This helps SCEVExpander
// form GEPs.
- bool LIsPointer = LU->getType()->isPointerTy(),
- RIsPointer = RU->getType()->isPointerTy();
+ bool LIsPointer = LV->getType()->isPointerTy(),
+ RIsPointer = RV->getType()->isPointerTy();
if (LIsPointer != RIsPointer)
return RIsPointer;
// Compare getValueID values.
- unsigned LID = LU->getValue()->getValueID(),
- RID = RU->getValue()->getValueID();
+ unsigned LID = LV->getValueID(),
+ RID = RV->getValueID();
if (LID != RID)
return LID < RID;
// Sort arguments by their position.
- if (const Argument *LA = dyn_cast<Argument>(LU->getValue())) {
- const Argument *RA = cast<Argument>(RU->getValue());
+ if (const Argument *LA = dyn_cast<Argument>(LV)) {
+ const Argument *RA = cast<Argument>(RV);
return LA->getArgNo() < RA->getArgNo();
}
// For instructions, compare their loop depth, and their opcode.
// This is pretty loose.
- if (const Instruction *LV = dyn_cast<Instruction>(LU->getValue())) {
- const Instruction *RV = cast<Instruction>(RU->getValue());
+ if (const Instruction *LInst = dyn_cast<Instruction>(LV)) {
+ const Instruction *RInst = cast<Instruction>(RV);
// Compare loop depths.
- unsigned LDepth = LI->getLoopDepth(LV->getParent()),
- RDepth = LI->getLoopDepth(RV->getParent());
- if (LDepth != RDepth)
- return LDepth < RDepth;
+ const BasicBlock *LParent = LInst->getParent(),
+ *RParent = RInst->getParent();
+ if (LParent != RParent) {
+ unsigned LDepth = LI->getLoopDepth(LParent),
+ RDepth = LI->getLoopDepth(RParent);
+ if (LDepth != RDepth)
+ return LDepth < RDepth;
+ }
// Compare the number of operands.
- unsigned LNumOps = LV->getNumOperands(),
- RNumOps = RV->getNumOperands();
+ unsigned LNumOps = LInst->getNumOperands(),
+ RNumOps = RInst->getNumOperands();
if (LNumOps != RNumOps)
return LNumOps < RNumOps;
}
@@ -600,10 +605,13 @@ namespace {
// Compare addrec loop depths.
if (const SCEVAddRecExpr *LA = dyn_cast<SCEVAddRecExpr>(LHS)) {
const SCEVAddRecExpr *RA = cast<SCEVAddRecExpr>(RHS);
- unsigned LDepth = LA->getLoop()->getLoopDepth(),
- RDepth = RA->getLoop()->getLoopDepth();
- if (LDepth != RDepth)
- return LDepth < RDepth;
+ const Loop *LLoop = LA->getLoop(), *RLoop = RA->getLoop();
+ if (LLoop != RLoop) {
+ unsigned LDepth = LLoop->getLoopDepth(),
+ RDepth = RLoop->getLoopDepth();
+ if (LDepth != RDepth)
+ return LDepth < RDepth;
+ }
}
// Lexicographically compare n-ary expressions.