mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Maintain only one best candidate during combineStack.
This commit is contained in:
parent
79d39d241c
commit
1612648268
@ -496,8 +496,6 @@ Stack StackLayoutGenerator::combineStack(Stack const& _stack1, Stack const& _sta
|
|||||||
return holds_alternative<LiteralSlot>(slot) || holds_alternative<FunctionCallReturnLabelSlot>(slot);
|
return holds_alternative<LiteralSlot>(slot) || holds_alternative<FunctionCallReturnLabelSlot>(slot);
|
||||||
});
|
});
|
||||||
|
|
||||||
std::map<size_t, Stack> sortedCandidates;
|
|
||||||
|
|
||||||
auto evaluate = [&](Stack const& _candidate) -> size_t {
|
auto evaluate = [&](Stack const& _candidate) -> size_t {
|
||||||
size_t numOps = 0;
|
size_t numOps = 0;
|
||||||
Stack testStack = _candidate;
|
Stack testStack = _candidate;
|
||||||
@ -518,7 +516,8 @@ Stack StackLayoutGenerator::combineStack(Stack const& _stack1, Stack const& _sta
|
|||||||
|
|
||||||
// See https://en.wikipedia.org/wiki/Heap's_algorithm
|
// See https://en.wikipedia.org/wiki/Heap's_algorithm
|
||||||
size_t n = candidate.size();
|
size_t n = candidate.size();
|
||||||
sortedCandidates.insert(std::make_pair(evaluate(candidate), candidate));
|
Stack bestCandidate = candidate;
|
||||||
|
size_t bestCost = evaluate(candidate);
|
||||||
std::vector<size_t> c(n, 0);
|
std::vector<size_t> c(n, 0);
|
||||||
size_t i = 1;
|
size_t i = 1;
|
||||||
while (i < n)
|
while (i < n)
|
||||||
@ -529,7 +528,12 @@ Stack StackLayoutGenerator::combineStack(Stack const& _stack1, Stack const& _sta
|
|||||||
std::swap(candidate.front(), candidate[i]);
|
std::swap(candidate.front(), candidate[i]);
|
||||||
else
|
else
|
||||||
std::swap(candidate[c[i]], candidate[i]);
|
std::swap(candidate[c[i]], candidate[i]);
|
||||||
sortedCandidates.insert(std::make_pair(evaluate(candidate), candidate));
|
size_t cost = evaluate(candidate);
|
||||||
|
if (cost < bestCost)
|
||||||
|
{
|
||||||
|
bestCost = cost;
|
||||||
|
bestCandidate = candidate;
|
||||||
|
}
|
||||||
++c[i];
|
++c[i];
|
||||||
// Note that for a proper implementation of the Heap algorithm this would need to revert back to ``i = 1.``
|
// Note that for a proper implementation of the Heap algorithm this would need to revert back to ``i = 1.``
|
||||||
// However, the incorrect implementation produces decent result and the proper version would have n!
|
// However, the incorrect implementation produces decent result and the proper version would have n!
|
||||||
@ -543,7 +547,7 @@ Stack StackLayoutGenerator::combineStack(Stack const& _stack1, Stack const& _sta
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return commonPrefix + sortedCandidates.begin()->second;
|
return commonPrefix + bestCandidate;
|
||||||
}
|
}
|
||||||
|
|
||||||
Stack StackLayoutGenerator::compressStack(Stack _stack)
|
Stack StackLayoutGenerator::compressStack(Stack _stack)
|
||||||
|
Loading…
Reference in New Issue
Block a user