diff options
author | Chris Lattner <sabre@nondot.org> | 2005-09-12 06:04:47 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-09-12 06:04:47 +0000 |
commit | c6bae65b49f3b0bb457b6bdb60e29bd9a44e743a (patch) | |
tree | 5bbc71bb25b47c6bdbdd0785be9ff49a99b15e33 /lib | |
parent | a0cf183e2c2c492eada2e97906b4bc5691f3ef1a (diff) | |
download | external_llvm-c6bae65b49f3b0bb457b6bdb60e29bd9a44e743a.zip external_llvm-c6bae65b49f3b0bb457b6bdb60e29bd9a44e743a.tar.gz external_llvm-c6bae65b49f3b0bb457b6bdb60e29bd9a44e743a.tar.bz2 |
_test:
li r2, 0
LBB_test_1: ; no_exit.2
li r5, 0
stw r5, 0(r3)
addi r2, r2, 1
addi r3, r3, 4
cmpwi cr0, r2, 701
blt cr0, LBB_test_1 ; no_exit.2
LBB_test_2: ; loopexit.2.loopexit
addi r2, r2, 1
stw r2, 0(r4)
blr
[zion ~/llvm]$ cat > ~/xx
Uses of IV's outside of the loop should use hte post-incremented version
of the IV, not the preincremented version. This helps many loops (e.g. in sixtrack)
which used to generate code like this (this is the code from the
dont-hoist-simple-loop-constants.ll testcase):
_test:
li r2, 0 **** IV starts at 0
LBB_test_1: ; no_exit.2
or r5, r2, r2 **** Copy for loop exit
li r2, 0
stw r2, 0(r3)
addi r3, r3, 4
addi r2, r5, 1
addi r6, r5, 2 **** IV+2
cmpwi cr0, r6, 701
blt cr0, LBB_test_1 ; no_exit.2
LBB_test_2: ; loopexit.2.loopexit
addi r2, r5, 2 **** IV+2
stw r2, 0(r4)
blr
And now generated code like this:
_test:
li r2, 1 *** IV starts at 1
LBB_test_1: ; no_exit.2
li r5, 0
stw r5, 0(r3)
addi r2, r2, 1
addi r3, r3, 4
cmpwi cr0, r2, 701 *** IV.postinc + 0
blt cr0, LBB_test_1
LBB_test_2: ; loopexit.2.loopexit
stw r2, 0(r4) *** IV.postinc + 0
blr
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23313 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Transforms/Scalar/LoopStrengthReduce.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index f8b208e..29043a1 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -52,7 +52,7 @@ namespace { // isUseOfPostIncrementedValue - True if this should use the // post-incremented version of this IV, not the preincremented version. // This can only be set in special cases, such as the terminating setcc - // instruction for a loop. + // instruction for a loop or uses dominated by the loop. bool isUseOfPostIncrementedValue; IVStrideUse(const SCEVHandle &Offs, Instruction *U, Value *O) @@ -351,8 +351,17 @@ bool LoopStrengthReduce::AddUsersIfInteresting(Instruction *I, Loop *L, if (AddUserToIVUsers) { // Okay, we found a user that we cannot reduce. Analyze the instruction - // and decide what to do with it. - IVUsesByStride[Stride].addUser(Start, User, I); + // and decide what to do with it. If we are a use inside of the loop, use + // the value before incrementation, otherwise use it after incrementation. + if (L->contains(User->getParent())) { + IVUsesByStride[Stride].addUser(Start, User, I); + } else { + // The value used will be incremented by the stride more than we are + // expecting, so subtract this off. + SCEVHandle NewStart = SCEV::getMinusSCEV(Start, Stride); + IVUsesByStride[Stride].addUser(NewStart, User, I); + IVUsesByStride[Stride].Users.back().isUseOfPostIncrementedValue = true; + } } } return true; @@ -387,7 +396,8 @@ namespace { // isUseOfPostIncrementedValue - True if this should use the // post-incremented version of this IV, not the preincremented version. // This can only be set in special cases, such as the terminating setcc - // instruction for a loop. + // instruction for a loop and uses outside the loop that are dominated by + // the loop. bool isUseOfPostIncrementedValue; BasedUser(IVStrideUse &IVSU) @@ -842,7 +852,11 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEVHandle &Stride, Value *RewriteOp = NewPHI; if (User.isUseOfPostIncrementedValue) { RewriteOp = IncV; - User.Inst->moveBefore(LatchBlock->getTerminator()); + + // If this user is in the loop, make sure it is the last thing in the + // loop to ensure it is dominated by the increment. + if (L->contains(User.Inst->getParent())) + User.Inst->moveBefore(LatchBlock->getTerminator()); } SCEVHandle RewriteExpr = SCEVUnknown::get(RewriteOp); |