mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-25 16:29:20 +00:00
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:
parent
6a7e85c198
commit
d7a3425f06
@ -1485,7 +1485,7 @@ namespace {
|
||||
PrunedTree.insert(QTop.first);
|
||||
|
||||
// Visit each child, pruning as necessary...
|
||||
DenseMap<ValuePair, size_t> BestChildren;
|
||||
std::vector<ValuePairWithDepth> BestChildren;
|
||||
VPPIteratorPair QTopRange = ConnectedPairs.equal_range(QTop.first);
|
||||
for (std::multimap<ValuePair, ValuePair>::iterator K = QTopRange.first;
|
||||
K != QTopRange.second; ++K) {
|
||||
@ -1517,7 +1517,7 @@ namespace {
|
||||
DenseSet<ValuePair> CurrentPairs;
|
||||
|
||||
bool CanAdd = true;
|
||||
for (DenseMap<ValuePair, size_t>::iterator C2
|
||||
for (std::vector<ValuePairWithDepth>::iterator C2
|
||||
= BestChildren.begin(), E2 = BestChildren.end();
|
||||
C2 != E2; ++C2) {
|
||||
if (C2->first.first == C->first.first ||
|
||||
@ -1602,22 +1602,22 @@ namespace {
|
||||
// to an already-selected child. Check for this here, and if a
|
||||
// conflict is found, then remove the previously-selected child
|
||||
// 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();) {
|
||||
if (C2->first.first == C->first.first ||
|
||||
C2->first.first == C->first.second ||
|
||||
C2->first.second == C->first.first ||
|
||||
C2->first.second == C->first.second ||
|
||||
pairsConflict(C2->first, C->first, PairableInstUsers))
|
||||
BestChildren.erase(C2++);
|
||||
C2 = BestChildren.erase(C2);
|
||||
else
|
||||
++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();
|
||||
C != E2; ++C) {
|
||||
size_t DepthF = getDepthFactor(C->first.first);
|
||||
|
Loading…
Reference in New Issue
Block a user