Bugfix for missed dependency from store to load in buildSchedGraph().

Background: When handling underlying objects for a store, the vector
of previous mem uses, mapped to the same Value, is afterwards cleared
(regardless of ThisMayAlias). This means that during handling of the
next store using the same Value, adjustChainDeps() must be called,
otherwise a dependency might be missed.

For example, three spill/reload (NonAliasing) memory accesses using
the same Value 'a', with different offsets:

    SU(2): store  @a
    SU(1): store  @a, Offset:1
    SU(0): load   @a

In this case we have:

* SU(1) does not need a dep against SU(0). Therefore,SU(0) ends up in
  RejectMemNodes and is removed from the mem-uses list (AliasMemUses
  or NonAliasMemUses), as this list is cleared.

* SU(2) needs a dep against SU(0). Therefore, SU(2) must check
  RejectMemNodes by calling adjustChainDeps().

Previously, for store SUs, adjustChainDeps() was only called if
MayAlias was true, missing the S(2) to S(0) dependency in the case
above. The fix is to always call adjustChainDeps(), regardless of
MayAlias, since this applies both for AliasMemUses and
NonAliasMemUses.

No testcase found for any in-tree target.

llvm-svn: 228686
This commit is contained in:
Jonas Paulsson 2015-02-10 13:03:32 +00:00
parent cd32254a35
commit afa6813816
1 changed files with 2 additions and 4 deletions

View File

@ -991,11 +991,9 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
// Add dependence on alias chain, if needed. // Add dependence on alias chain, if needed.
if (AliasChain) if (AliasChain)
addChainDependency(AAForDep, MFI, SU, AliasChain, RejectMemNodes); addChainDependency(AAForDep, MFI, SU, AliasChain, RejectMemNodes);
// But we also should check dependent instructions for the }
// SU in question.
adjustChainDeps(AA, MFI, SU, &ExitSU, RejectMemNodes, adjustChainDeps(AA, MFI, SU, &ExitSU, RejectMemNodes,
TrueMemOrderLatency); TrueMemOrderLatency);
}
} else if (MI->mayLoad()) { } else if (MI->mayLoad()) {
bool MayAlias = true; bool MayAlias = true;
if (MI->isInvariantLoad(AA)) { if (MI->isInvariantLoad(AA)) {