[PATCH] AArch64: Make AArch64A57FPLoadBalancing output stable.
Chad Rosier
mcrosier at codeaurora.org
Fri Jan 30 06:38:00 PST 2015
Hi James,
In discussing this with Geoff, I believe the underlying issue is that
we're sorting based on pointer values, which change from run to run. This
is what is introducing the non-determinism.
IIRC, the difference between std::sort and std::stable_sort is that
std::stable_sort guarantees the order of non-unique elements to be
preserved. Sanjin and Geoff have both indicated to me that the elements
in the vector are unique (I didn't verify), so std::sort wouldn't really
the problem in this case.
Geoff/James, feel free to correct me if I misspoke.
Chad
> Hi Geoff,
>
> Thanks for fixing this! It looks ok as-is, but wouldn't switching simply
> from std::sort to std::stable_sort solve the problem easier? Stable_sort
> is
> used for this reason in other areas of the compiler.
>
> Cheers,
>
> James
> On Fri, 30 Jan 2015 at 03:51, Geoff Berry <gberry at codeaurora.org> wrote:
>
>> Hi jmolloy, mcrosier, apazos,
>>
>> 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.
>>
>> REPOSITORY
>> rL LLVM
>>
>> http://reviews.llvm.org/D7265
>>
>> Files:
>> lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp
>>
>> Index: lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp
>> ===================================================================
>> --- lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp
>> +++ lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp
>> @@ -259,7 +259,7 @@
>> }
>>
>> /// Return true if this chain starts before Other.
>> - bool startsBefore(Chain *Other) {
>> + bool startsBefore(const Chain *Other) const {
>> return StartInstIdx < Other->StartInstIdx;
>> }
>>
>> @@ -431,10 +431,17 @@
>> // 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;
>>
>> EMAIL PREFERENCES
>> http://reviews.llvm.org/settings/panel/emailpreferences/
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
More information about the llvm-commits
mailing list