mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +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);
|
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user