mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01: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. llvm-svn: 225351
This commit is contained in:
parent
d3bd7333a3
commit
15765716a6
@ -190,6 +190,12 @@ namespace llvm {
|
||||
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
|
||||
/// as "must alias", meaning that the SUnits at either end of the edge
|
||||
/// have a memory dependence on a known memory location.
|
||||
|
@ -614,10 +614,10 @@ iterateChainSucc(AliasAnalysis *AA, const MachineFrameInfo *MFI,
|
||||
}
|
||||
// Track current 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();
|
||||
I != E; ++I)
|
||||
if (I->isCtrl())
|
||||
if (I->isNormalMemoryOrBarrier())
|
||||
iterateChainSucc (AA, MFI, SUa, I->getSUnit(), ExitSU, Depth, Visited);
|
||||
return *Depth;
|
||||
}
|
||||
@ -644,11 +644,12 @@ static void adjustChainDeps(AliasAnalysis *AA, const MachineFrameInfo *MFI,
|
||||
Dep.setLatency(((*I)->getInstr()->mayLoad()) ? LatencyToLoad : 0);
|
||||
(*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(),
|
||||
JE = (*I)->Succs.end(); J != JE; ++J)
|
||||
if (J->isCtrl())
|
||||
if (J->isNormalMemoryOrBarrier())
|
||||
iterateChainSucc (AA, MFI, SU, J->getSUnit(),
|
||||
ExitSU, &Depth, Visited);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user