haifa-sched: fix autopref_rank_for_schedule qsort comparator
authorAlexander Monakov <amonakov@ispras.ru>
Wed, 27 Sep 2017 17:16:53 +0000 (20:16 +0300)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Wed, 27 Sep 2017 17:16:53 +0000 (20:16 +0300)
* haifa-sched.c (autopref_rank_for_schedule): Order 'irrelevant' insns
first, always call autopref_rank_data otherwise.

From-SVN: r253235

gcc/ChangeLog
gcc/haifa-sched.c

index c70af4f60ffa11e1be4d1f5eb48e329f4f7e6e27..6f2e0acbbeb19bd294a17d8c3fc724705369b84c 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-27  Alexander Monakov  <amonakov@ispras.ru>
+
+       * haifa-sched.c (autopref_rank_for_schedule): Order 'irrelevant' insns
+       first, always call autopref_rank_data otherwise.
+
 2017-09-27  Richard Biener  <rguenther@suse.de>
 
        * graphite-scop-detection.c (find_scop_parameters): Move
index d1378d0465f8ffcec6bf409d211026f2359cd19c..549e8961411ecd0a04ac3b24ba78b5d53e63258a 100644 (file)
@@ -5707,7 +5707,8 @@ autopref_rank_data (autopref_multipass_data_t data1,
 static int
 autopref_rank_for_schedule (const rtx_insn *insn1, const rtx_insn *insn2)
 {
-  for (int write = 0; write < 2; ++write)
+  int r = 0;
+  for (int write = 0; write < 2 && !r; ++write)
     {
       autopref_multipass_data_t data1
        = &INSN_AUTOPREF_MULTIPASS_DATA (insn1)[write];
@@ -5716,21 +5717,20 @@ autopref_rank_for_schedule (const rtx_insn *insn1, const rtx_insn *insn2)
 
       if (data1->status == AUTOPREF_MULTIPASS_DATA_UNINITIALIZED)
        autopref_multipass_init (insn1, write);
-      if (data1->status == AUTOPREF_MULTIPASS_DATA_IRRELEVANT)
-       continue;
 
       if (data2->status == AUTOPREF_MULTIPASS_DATA_UNINITIALIZED)
        autopref_multipass_init (insn2, write);
-      if (data2->status == AUTOPREF_MULTIPASS_DATA_IRRELEVANT)
-       continue;
 
-      if (!rtx_equal_p (data1->base, data2->base))
-       continue;
+      int irrel1 = data1->status == AUTOPREF_MULTIPASS_DATA_IRRELEVANT;
+      int irrel2 = data2->status == AUTOPREF_MULTIPASS_DATA_IRRELEVANT;
 
-      return autopref_rank_data (data1, data2);
+      if (!irrel1 && !irrel2)
+       r = autopref_rank_data (data1, data2);
+      else
+       r = irrel2 - irrel1;
     }
 
-  return 0;
+  return r;
 }
 
 /* True if header of debug dump was printed.  */