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:
Jonas Paulsson
2015-01-07 13:38:29 +00:00
parent 650c3a453d
commit 18a7c886c0
2 changed files with 12 additions and 5 deletions

View File

@@ -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.

View File

@@ -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);
} }