mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-05 13:16:32 +00:00
New method SDep::isNormalMemoryOrBarrier() in ScheduleDAGInstrs.cpp.
Used to iterate over previously added memory dependencies in adjustChainDeps() and iterateChainSucc(). SDep::isCtrl() was previously used in these places, that also gave anti and output edges. The code may be worse if these are followed, because MisNeedChainEdge() will conservatively return true since a non-memory instruction has no memory operands, and a false chain dep will be added. It is also unnecessary since all memory accesses of interest will be reached by memory dependencies, and there is a budget limit for the number of edges traversed. This problem was found on an out-of-tree target with enabled alias analysis. No test case for an in-tree target has been found. Reviewed by Hal Finkel. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225351 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -190,6 +190,12 @@ namespace llvm {
|
|||||||
return getKind() == Order && Contents.OrdKind == Barrier;
|
return getKind() == Order && Contents.OrdKind == Barrier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// isNormalMemoryOrBarrier - Test if this is could be any kind of memory
|
||||||
|
/// dependence.
|
||||||
|
bool isNormalMemoryOrBarrier() const {
|
||||||
|
return (isNormalMemory() || isBarrier());
|
||||||
|
}
|
||||||
|
|
||||||
/// isMustAlias - Test if this is an Order dependence that is marked
|
/// isMustAlias - Test if this is an Order dependence that is marked
|
||||||
/// as "must alias", meaning that the SUnits at either end of the edge
|
/// as "must alias", meaning that the SUnits at either end of the edge
|
||||||
/// have a memory dependence on a known memory location.
|
/// have a memory dependence on a known memory location.
|
||||||
|
|||||||
@@ -614,10 +614,10 @@ iterateChainSucc(AliasAnalysis *AA, const MachineFrameInfo *MFI,
|
|||||||
}
|
}
|
||||||
// Track current depth.
|
// Track current depth.
|
||||||
(*Depth)++;
|
(*Depth)++;
|
||||||
// Iterate over chain dependencies only.
|
// Iterate over memory dependencies only.
|
||||||
for (SUnit::const_succ_iterator I = SUb->Succs.begin(), E = SUb->Succs.end();
|
for (SUnit::const_succ_iterator I = SUb->Succs.begin(), E = SUb->Succs.end();
|
||||||
I != E; ++I)
|
I != E; ++I)
|
||||||
if (I->isCtrl())
|
if (I->isNormalMemoryOrBarrier())
|
||||||
iterateChainSucc (AA, MFI, SUa, I->getSUnit(), ExitSU, Depth, Visited);
|
iterateChainSucc (AA, MFI, SUa, I->getSUnit(), ExitSU, Depth, Visited);
|
||||||
return *Depth;
|
return *Depth;
|
||||||
}
|
}
|
||||||
@@ -644,11 +644,12 @@ static void adjustChainDeps(AliasAnalysis *AA, const MachineFrameInfo *MFI,
|
|||||||
Dep.setLatency(((*I)->getInstr()->mayLoad()) ? LatencyToLoad : 0);
|
Dep.setLatency(((*I)->getInstr()->mayLoad()) ? LatencyToLoad : 0);
|
||||||
(*I)->addPred(Dep);
|
(*I)->addPred(Dep);
|
||||||
}
|
}
|
||||||
// Now go through all the chain successors and iterate from them.
|
|
||||||
// Keep track of visited nodes.
|
// Iterate recursively over all previously added memory chain
|
||||||
|
// successors. Keep track of visited nodes.
|
||||||
for (SUnit::const_succ_iterator J = (*I)->Succs.begin(),
|
for (SUnit::const_succ_iterator J = (*I)->Succs.begin(),
|
||||||
JE = (*I)->Succs.end(); J != JE; ++J)
|
JE = (*I)->Succs.end(); J != JE; ++J)
|
||||||
if (J->isCtrl())
|
if (J->isNormalMemoryOrBarrier())
|
||||||
iterateChainSucc (AA, MFI, SU, J->getSUnit(),
|
iterateChainSucc (AA, MFI, SU, J->getSUnit(),
|
||||||
ExitSU, &Depth, Visited);
|
ExitSU, &Depth, Visited);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user