forked from OSchip/llvm-project
Fix a regression from last night, which caused this pass to create invalid
code for IV uses outside of loops that are not dominated by the latch block. We should only convert these uses to use the post-inc value if they ARE dominated by the latch block. Also use a new LoopInfo method to simplify some code. This fixes Transforms/LoopStrengthReduce/2005-09-12-UsesOutOutsideOfLoop.ll llvm-svn: 23318
This commit is contained in:
parent
2ee807c70f
commit
8048b85e8f
|
@ -353,7 +353,11 @@ bool LoopStrengthReduce::AddUsersIfInteresting(Instruction *I, Loop *L,
|
|||
// Okay, we found a user that we cannot reduce. Analyze the instruction
|
||||
// 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())) {
|
||||
if (L->contains(User->getParent()) ||
|
||||
// Alternatively, if we are a use outside of the loop, but is not
|
||||
// dominated by the latch block, we have to use the preincremented
|
||||
// value.
|
||||
!DS->dominates(L->getLoopLatch(), User->getParent())) {
|
||||
IVUsesByStride[Stride].addUser(Start, User, I);
|
||||
} else {
|
||||
// The value used will be incremented by the stride more than we are
|
||||
|
@ -784,13 +788,7 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEVHandle &Stride,
|
|||
Instruction *PreInsertPt = Preheader->getTerminator();
|
||||
Instruction *PhiInsertBefore = L->getHeader()->begin();
|
||||
|
||||
assert(isa<PHINode>(PhiInsertBefore) &&
|
||||
"How could this loop have IV's without any phis?");
|
||||
PHINode *SomeLoopPHI = cast<PHINode>(PhiInsertBefore);
|
||||
assert(SomeLoopPHI->getNumIncomingValues() == 2 &&
|
||||
"This loop isn't canonicalized right");
|
||||
BasicBlock *LatchBlock =
|
||||
SomeLoopPHI->getIncomingBlock(SomeLoopPHI->getIncomingBlock(0) == Preheader);
|
||||
BasicBlock *LatchBlock = L->getLoopLatch();
|
||||
|
||||
// Create a new Phi for this base, and stick it in the loop header.
|
||||
const Type *ReplacedTy = CommonExprs->getType();
|
||||
|
|
Loading…
Reference in New Issue