mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-23 01:24:30 +00:00
LSR IVChain improvement.
Handle chains in which the same offset is used for both loads and stores to the same array. Fixes rdar://11410078. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174789 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -2537,6 +2537,7 @@ void LSRInstance::ChainInstruction(Instruction *UserInst, Instruction *IVOper,
|
||||
// Add this IV user to the end of the chain.
|
||||
IVChainVec[ChainIdx].add(IVInc(UserInst, IVOper, LastIncExpr));
|
||||
}
|
||||
IVChain &Chain = IVChainVec[ChainIdx];
|
||||
|
||||
SmallPtrSet<Instruction*,4> &NearUsers = ChainUsersVec[ChainIdx].NearUsers;
|
||||
// This chain's NearUsers become FarUsers.
|
||||
@ -2554,8 +2555,19 @@ void LSRInstance::ChainInstruction(Instruction *UserInst, Instruction *IVOper,
|
||||
for (Value::use_iterator UseIter = IVOper->use_begin(),
|
||||
UseEnd = IVOper->use_end(); UseIter != UseEnd; ++UseIter) {
|
||||
Instruction *OtherUse = dyn_cast<Instruction>(*UseIter);
|
||||
if (!OtherUse || OtherUse == UserInst)
|
||||
if (!OtherUse)
|
||||
continue;
|
||||
// Uses in the chain will no longer be uses if the chain is formed.
|
||||
// Include the head of the chain in this iteration (not Chain.begin()).
|
||||
IVChain::const_iterator IncIter = Chain.Incs.begin();
|
||||
IVChain::const_iterator IncEnd = Chain.Incs.end();
|
||||
for( ; IncIter != IncEnd; ++IncIter) {
|
||||
if (IncIter->UserInst == OtherUse)
|
||||
break;
|
||||
}
|
||||
if (IncIter != IncEnd)
|
||||
continue;
|
||||
|
||||
if (SE.isSCEVable(OtherUse->getType())
|
||||
&& !isa<SCEVUnknown>(SE.getSCEV(OtherUse))
|
||||
&& IU.isIVUserOrOperand(OtherUse)) {
|
||||
|
Reference in New Issue
Block a user