mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-04 21:30:49 +00:00
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23318 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e4b56572f9
commit
12b50410cd
@ -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
Block a user