diff options
author | Chris Lattner <sabre@nondot.org> | 2005-08-03 23:44:42 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-08-03 23:44:42 +0000 |
commit | 7a65839f4118c99fb1636c3cbb41b0bf7ef27665 (patch) | |
tree | 8b99fa117127171b29cede459c0f3ae496359f3a /lib/Transforms/Scalar/LoopStrengthReduce.cpp | |
parent | be3e5212e23edc9210f774fac18d801de252e906 (diff) |
Teach loop-reduce to see into nested loops, to pull out immediate values
pushed down by SCEV.
In a nested loop case, this allows us to emit this:
lis r3, ha16(L_A$non_lazy_ptr)
lwz r3, lo16(L_A$non_lazy_ptr)(r3)
add r2, r2, r3
li r3, 1
.LBB_foo_2: ; no_exit.1
lfd f0, 8(r2) ;; Uses offset of 8 instead of 0
stfd f0, 0(r2)
addi r4, r3, 1
addi r2, r2, 8
cmpwi cr0, r3, 100
or r3, r4, r4
bne .LBB_foo_2 ; no_exit.1
instead of this:
lis r3, ha16(L_A$non_lazy_ptr)
lwz r3, lo16(L_A$non_lazy_ptr)(r3)
add r2, r2, r3
addi r3, r3, 8
li r4, 1
.LBB_foo_2: ; no_exit.1
lfd f0, 0(r3)
stfd f0, 0(r2)
addi r5, r4, 1
addi r2, r2, 8
addi r3, r3, 8
cmpwi cr0, r4, 100
or r4, r5, r5
bne .LBB_foo_2 ; no_exit.1
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22639 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/LoopStrengthReduce.cpp')
-rw-r--r-- | lib/Transforms/Scalar/LoopStrengthReduce.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index ddce751104..9a9b0c2aec 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -483,8 +483,7 @@ static SCEVHandle GetImmediateValues(SCEVHandle Val, bool isAddress) { if (isTargetConstant(Val)) return Val; - SCEVAddExpr *SAE = dyn_cast<SCEVAddExpr>(Val); - if (SAE) { + if (SCEVAddExpr *SAE = dyn_cast<SCEVAddExpr>(Val)) { unsigned i = 0; for (; i != SAE->getNumOperands(); ++i) if (isTargetConstant(SAE->getOperand(i))) { @@ -497,6 +496,9 @@ static SCEVHandle GetImmediateValues(SCEVHandle Val, bool isAddress) { ImmVal = SCEVAddExpr::get(ImmVal, SAE->getOperand(i)); return ImmVal; } + } else if (SCEVAddRecExpr *SARE = dyn_cast<SCEVAddRecExpr>(Val)) { + // Try to pull immediates out of the start value of nested addrec's. + return GetImmediateValues(SARE->getStart(), isAddress); } return SCEVUnknown::getIntegerSCEV(0, Val->getType()); |