PR84068, PR83459: Fix sort order of SCHED_PRESSURE_MODEL
authorWilco Dijkstra <wdijkstr@arm.com>
Thu, 8 Feb 2018 12:29:28 +0000 (12:29 +0000)
committerWilco Dijkstra <wilco@gcc.gnu.org>
Thu, 8 Feb 2018 12:29:28 +0000 (12:29 +0000)
The comparison function for SCHED_PRESSURE_MODEL is incorrect.  If either
instruction is not in target_bb, the ordering is not well defined.
Since all instructions outside the target_bb get the highest model_index,
all we need to do is sort on model_index.  If the model_index is the same
we defer to RFS_DEP_COUNT and/or RFS_TIE.

    gcc/
PR rtl-optimization/84068
PR rtl-optimization/83459
* haifa-sched.c (rank_for_schedule): Fix SCHED_PRESSURE_MODEL sorting.

    gcc/testsuite
PR rtl-optimization/84068
PR rtl-optimization/83459
* gcc.dg/pr84068.c: New test.

From-SVN: r257481

gcc/ChangeLog
gcc/haifa-sched.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr84068.c [new file with mode: 0644]

index 84bf970575bd78a7610a70d509a9b832245c8d4b..c9a9fdb745e3a7d017fa810c50f8111265f6b263 100644 (file)
@@ -1,3 +1,9 @@
+2018-02-08  Wilco Dijkstra  <wdijkstr@arm.com>
+
+       PR rtl-optimization/84068
+       PR rtl-optimization/83459
+       * haifa-sched.c (rank_for_schedule): Fix SCHED_PRESSURE_MODEL sorting.
+
 2018-02-08  Aldy Hernandez  <aldyh@redhat.com>
 
        PR tree-optimization/84224
index ebdec46bf04f1ba07e8b70607602a3bc9e7ec7de..4a899b56173dd7d67db084ed86d24ad865ccadcd 100644 (file)
@@ -2783,12 +2783,11 @@ rank_for_schedule (const void *x, const void *y)
     }
 
   /* Prefer instructions that occur earlier in the model schedule.  */
-  if (sched_pressure == SCHED_PRESSURE_MODEL
-      && INSN_BB (tmp) == target_bb && INSN_BB (tmp2) == target_bb)
+  if (sched_pressure == SCHED_PRESSURE_MODEL)
     {
       diff = model_index (tmp) - model_index (tmp2);
-      gcc_assert (diff != 0);
-      return rfs_result (RFS_PRESSURE_INDEX, diff, tmp, tmp2);
+      if (diff != 0)
+       return rfs_result (RFS_PRESSURE_INDEX, diff, tmp, tmp2);
     }
 
   /* Prefer the insn which has more later insns that depend on it.
index 7179728ed5a32166bdfa663d92bfe009f0006aa2..c2eb50f453cdeaf76cc60a715de862a42306f543 100644 (file)
@@ -1,3 +1,9 @@
+2018-02-08  Wilco Dijkstra  <wdijkstr@arm.com>
+
+       PR rtl-optimization/84068
+       PR rtl-optimization/83459
+       * gcc.dg/pr84068.c: New test.
+
 2018-02-08  Richard Biener  <rguenther@suse.de>
 
        * g++.dg/vect/slp-pr56812.cc: Allow either basic-block or
diff --git a/gcc/testsuite/gcc.dg/pr84068.c b/gcc/testsuite/gcc.dg/pr84068.c
new file mode 100644 (file)
index 0000000..13110d8
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-sched-critical-path-heuristic -fno-sched-rank-heuristic --param=max-sched-extend-regions-iters=5 --param sched-pressure-algorithm=2" } */
+
+#ifdef __SIZEOF_INT128__
+typedef __int128 largeint;
+#else
+typedef long long largeint;
+#endif
+
+largeint a;
+int b;
+
+largeint
+foo (char d, short e, int f)
+{
+  b = __builtin_sub_overflow_p (b, 1, (unsigned long)0);
+  return a + f;
+}