Fix the largest offender of determinism in BBVectorize

Iterating over the children of each node in the potential vectorization
plan must happen in a deterministic order (because it affects which children
are erased when two children conflict). There was no need for this data
structure to be a map in the first place, so replacing it with a vector
is a small change.

I believe that this was the last remaining instance if iterating over the
elements of a Dense* container where the iteration order could matter.
There are some remaining iterations over std::*map containers where the order
might matter, but so long as the Value* for instructions in a block increase
with the order of the instructions in the block (or decrease) monotonically,
then this will appear to be deterministic.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167942 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Hal Finkel 2012-11-14 18:38:11 +00:00
parent 6a7e85c198
commit d7a3425f06

View File

@ -1485,7 +1485,7 @@ namespace {
PrunedTree.insert(QTop.first); PrunedTree.insert(QTop.first);
// Visit each child, pruning as necessary... // Visit each child, pruning as necessary...
DenseMap<ValuePair, size_t> BestChildren; std::vector<ValuePairWithDepth> BestChildren;
VPPIteratorPair QTopRange = ConnectedPairs.equal_range(QTop.first); VPPIteratorPair QTopRange = ConnectedPairs.equal_range(QTop.first);
for (std::multimap<ValuePair, ValuePair>::iterator K = QTopRange.first; for (std::multimap<ValuePair, ValuePair>::iterator K = QTopRange.first;
K != QTopRange.second; ++K) { K != QTopRange.second; ++K) {
@ -1517,7 +1517,7 @@ namespace {
DenseSet<ValuePair> CurrentPairs; DenseSet<ValuePair> CurrentPairs;
bool CanAdd = true; bool CanAdd = true;
for (DenseMap<ValuePair, size_t>::iterator C2 for (std::vector<ValuePairWithDepth>::iterator C2
= BestChildren.begin(), E2 = BestChildren.end(); = BestChildren.begin(), E2 = BestChildren.end();
C2 != E2; ++C2) { C2 != E2; ++C2) {
if (C2->first.first == C->first.first || if (C2->first.first == C->first.first ||
@ -1602,22 +1602,22 @@ namespace {
// to an already-selected child. Check for this here, and if a // to an already-selected child. Check for this here, and if a
// conflict is found, then remove the previously-selected child // conflict is found, then remove the previously-selected child
// before adding this one in its place. // before adding this one in its place.
for (DenseMap<ValuePair, size_t>::iterator C2 for (std::vector<ValuePairWithDepth>::iterator C2
= BestChildren.begin(); C2 != BestChildren.end();) { = BestChildren.begin(); C2 != BestChildren.end();) {
if (C2->first.first == C->first.first || if (C2->first.first == C->first.first ||
C2->first.first == C->first.second || C2->first.first == C->first.second ||
C2->first.second == C->first.first || C2->first.second == C->first.first ||
C2->first.second == C->first.second || C2->first.second == C->first.second ||
pairsConflict(C2->first, C->first, PairableInstUsers)) pairsConflict(C2->first, C->first, PairableInstUsers))
BestChildren.erase(C2++); C2 = BestChildren.erase(C2);
else else
++C2; ++C2;
} }
BestChildren.insert(ValuePairWithDepth(C->first, C->second)); BestChildren.push_back(ValuePairWithDepth(C->first, C->second));
} }
for (DenseMap<ValuePair, size_t>::iterator C for (std::vector<ValuePairWithDepth>::iterator C
= BestChildren.begin(), E2 = BestChildren.end(); = BestChildren.begin(), E2 = BestChildren.end();
C != E2; ++C) { C != E2; ++C) {
size_t DepthF = getDepthFactor(C->first.first); size_t DepthF = getDepthFactor(C->first.first);