[PATCH] AArch64: Make AArch64A57FPLoadBalancing output stable.

Geoff Berry gberry at codeaurora.org
Fri Jan 30 07:47:51 PST 2015

Hi James,


No, I don’t think just switching to std::stable_sort() would solve the problem.  The elements that are “equal” based on the sort comparison would remain in their original order before the sort, which I believe is determined by the order they occur in the EquivalenceClasses member iterator, which is in turn determined by pointer order since the EquivalenceClasses members are stored in a set<Chain*> in this case.


Hopefully that makes sense.  If so, could you commit this change?






Geoff Berry

Employee of Qualcomm Innovation Center, Inc.

Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project


From: James Molloy [mailto:james at jamesmolloy.co.uk] 
Sent: Friday, January 30, 2015 3:41 AM
To: reviews+D7265+public+9863efb7948c8628 at reviews.llvm.org; gberry at codeaurora.org; james.molloy at arm.com; mcrosier at codeaurora.org; apazos at codeaurora.org
Cc: llvm-commits at cs.uiuc.edu; kanheim at a-bix.com
Subject: Re: [PATCH] AArch64: Make AArch64A57FPLoadBalancing output stable.


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.



On Fri, 30 Jan 2015 at 03:51, Geoff Berry <gberry at codeaurora.org <mailto: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.




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;

llvm-commits mailing list
llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150130/fc5682ce/attachment.html>

More information about the llvm-commits mailing list