re PR target/63347 (m68k misoptimisation with -fschedule-insns)
authorJeff Law <law@redhat.com>
Wed, 11 Feb 2015 23:29:11 +0000 (16:29 -0700)
committerJeff Law <law@gcc.gnu.org>
Wed, 11 Feb 2015 23:29:11 +0000 (16:29 -0700)
PR target/63347
* haifa-sched.c (prune_ready_list): If we have a SCHED_GROUP_P insn
that needs to be queued, just queue it for a single cycle.

PR target/63347
* gcc.target/m68k/pr63347.c: New test.

From-SVN: r220632

gcc/ChangeLog
gcc/haifa-sched.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/m68k/pr63347.c [new file with mode: 0644]

index d8952092c436ac21a4a45fe2c3219b2fb9165c68..c9ac04539cc30dfbdb8f9d5739451da2572f162a 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-11  Jeff Law  <law@redhat.com>
+
+       PR target/63347
+       * haifa-sched.c (prune_ready_list): If we have a SCHED_GROUP_P insn
+       that needs to be queued, just queue it for a single cycle.
+
 2015-02-11  Jan Hubicka  <hubicka@ucw.cz>
 
        * ipa.c (symbol_table::remove_unreachable_nodes): Avoid releasing
index 75d24217dbe187530e65fa2e874db9a081121a2c..64c8c9c1f70bb7a685098f64249848d933c22482 100644 (file)
@@ -6291,7 +6291,15 @@ prune_ready_list (state_t temp_state, bool first_cycle_insn_p,
              if (SCHED_GROUP_P (insn) && cost > min_cost_group)
                min_cost_group = cost;
              ready_remove (&ready, i);
-             queue_insn (insn, cost, reason);
+             /* Normally we'd want to queue INSN for COST cycles.  However,
+                if SCHED_GROUP_P is set, then we must ensure that nothing
+                else comes between INSN and its predecessor.  If there is
+                some other insn ready to fire on the next cycle, then that
+                invariant would be broken.
+
+                So when SCHED_GROUP_P is set, just queue this insn for a
+                single cycle.  */
+             queue_insn (insn, SCHED_GROUP_P (insn) ? 1 : cost, reason);
              if (i + 1 < n)
                break;
            }
index c62cc2372e5e0ee795213d295b5c41a014d9433f..ee5be51b54a189ca2e7e571064bb70997d6438fc 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-11  Jeff Law  <law@redhat.com>
+
+       PR target/63347
+       * gcc.target/m68k/pr63347.c: New test.
+
 2015-02-11  Marek Polacek  <polacek@redhat.com>
 
        * g++.dg/ubsan/shift-1.C: New test.
diff --git a/gcc/testsuite/gcc.target/m68k/pr63347.c b/gcc/testsuite/gcc.target/m68k/pr63347.c
new file mode 100644 (file)
index 0000000..1d23e9a
--- /dev/null
@@ -0,0 +1,46 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mcpu=5208" } */
+
+#include <stdlib.h>
+
+void __attribute__ ((noinline))
+oof()
+{
+  asm volatile ("" ::: "memory");
+}
+int print_info(unsigned int *ip_addr)
+{
+    int invalid = 0;
+
+    if (ip_addr) {
+        unsigned int haddr = *ip_addr;
+        oof("stuff");
+        if (0x0 == haddr) {
+            invalid = 1;
+        }
+        oof("stuff2");
+    } else {
+        invalid = 1;
+    }
+
+    return invalid;
+}
+
+int main(int argc, char *argv[])
+{
+    unsigned int myaddr;
+    int ret;
+
+    myaddr = 0x0;
+    ret = print_info(&myaddr);
+    if (!ret)
+        abort ();
+
+    myaddr = 0x01020304;
+    ret = print_info(&myaddr);
+    if (ret)
+        abort ();
+    exit (0);
+}
+
+