mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
[AArch64] Make AArch64A57FPLoadBalancing output stable.
Add tie breaker to colorChainSet() sort so that processing order doesn't depend on std::set order, which depends on pointer order, which is unstable from run to run. No test case as this is nearly impossible to reproduce. Phabricator Review: http://reviews.llvm.org/D7265 Patch by Geoff Berry <gberry@codeaurora.org>! llvm-svn: 227606
This commit is contained in:
parent
01bf1add84
commit
a802c82711
@ -272,7 +272,7 @@ public:
|
||||
}
|
||||
|
||||
/// Return true if this chain starts before Other.
|
||||
bool startsBefore(Chain *Other) {
|
||||
bool startsBefore(const Chain *Other) const {
|
||||
return StartInstIdx < Other->StartInstIdx;
|
||||
}
|
||||
|
||||
@ -442,10 +442,17 @@ bool AArch64A57FPLoadBalancing::colorChainSet(std::vector<Chain*> GV,
|
||||
// chains that we cannot change before we look at those we can,
|
||||
// so the parity counter is updated and we know what color we should
|
||||
// change them to!
|
||||
// Final tie-break with instruction order so pass output is stable (i.e. not
|
||||
// dependent on malloc'd pointer values).
|
||||
std::sort(GV.begin(), GV.end(), [](const Chain *G1, const Chain *G2) {
|
||||
if (G1->size() != G2->size())
|
||||
return G1->size() > G2->size();
|
||||
return G1->requiresFixup() > G2->requiresFixup();
|
||||
if (G1->requiresFixup() != G2->requiresFixup())
|
||||
return G1->requiresFixup() > G2->requiresFixup();
|
||||
// Make sure startsBefore() produces a stable final order.
|
||||
assert((G1 == G2 || (G1->startsBefore(G2) ^ G2->startsBefore(G1))) &&
|
||||
"Starts before not total order!");
|
||||
return G1->startsBefore(G2);
|
||||
});
|
||||
|
||||
Color PreferredColor = Parity < 0 ? Color::Even : Color::Odd;
|
||||
|
Loading…
Reference in New Issue
Block a user