]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[ree] PR rtl-optimization/78038: Handle global register dataflow definitions in ree
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Fri, 2 Dec 2016 12:22:54 +0000 (12:22 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Fri, 2 Dec 2016 12:22:54 +0000 (12:22 +0000)
2016-12-02  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

Backport from mainline
2016-10-21  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>

PR rtl-optimization/78038
* ree.c (get_defs): Return NULL if a defining insn for REG cannot
be deduced to set REG through the RTL structure.
(make_defs_and_copies_lists): Return false on a failing get_defs call.

* gcc.target/aarch64/pr78038.c: New test.

From-SVN: r243175

gcc/ChangeLog
gcc/ree.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/pr78038.c [new file with mode: 0644]

index 3e86e38aadc9378d54bae52ff7076bb7a0769d88..382004e3e2539b6580e4e2d64d99732a3946bc0d 100644 (file)
@@ -1,3 +1,13 @@
+2016-12-02  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       Backport from mainline
+       2016-10-21  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR rtl-optimization/78038
+       * ree.c (get_defs): Return NULL if a defining insn for REG cannot
+       be deduced to set REG through the RTL structure.
+       (make_defs_and_copies_lists): Return false on a failing get_defs call.
+
 2016-12-02  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
        Backport from mainline
index 48765b6aaabbba2e80116060190a5e7bc81ab87e..69dfe90af154bc25ab44df94ab6cd59f0c314f06 100644 (file)
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -529,6 +529,14 @@ get_defs (rtx_insn *insn, rtx reg, vec<rtx_insn *> *dest)
         return NULL;
       if (DF_REF_INSN_INFO (ref_link->ref) == NULL)
         return NULL;
+      /* As global regs are assumed to be defined at each function call
+        dataflow can report a call_insn as being a definition of REG.
+        But we can't do anything with that in this pass so proceed only
+        if the instruction really sets REG in a way that can be deduced
+        from the RTL structure.  */
+      if (global_regs[REGNO (reg)]
+         && !set_of (reg, DF_REF_INSN (ref_link->ref)))
+       return NULL;
     }
 
   if (dest)
@@ -627,7 +635,7 @@ make_defs_and_copies_lists (rtx_insn *extend_insn, const_rtx set_pat,
 
   /* Initialize the work list.  */
   if (!get_defs (extend_insn, src_reg, &state->work_list))
-    gcc_unreachable ();
+    return false;
 
   is_insn_visited = XCNEWVEC (bool, max_insn_uid);
 
index cb846e6d9b93c788b1a005cf3aeab10beb702f28..ab1f24dbca59d1b37c97afc08a12b77c372bfc86 100644 (file)
@@ -1,3 +1,11 @@
+2016-12-02  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       Backport from mainline
+       2016-10-21  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR rtl-optimization/78038
+       * gcc.target/aarch64/pr78038.c: New test.
+
 2016-12-02  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
        Backport from mainline
diff --git a/gcc/testsuite/gcc.target/aarch64/pr78038.c b/gcc/testsuite/gcc.target/aarch64/pr78038.c
new file mode 100644 (file)
index 0000000..76d97d3
--- /dev/null
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* PR rtl-optimization/78038.
+   Make sure ree can gracefully handle extensions of the global
+   variable register after a call.  */
+
+typedef void (*test_fptr_t) (void);
+void
+test_f (void)
+{
+}
+test_fptr_t test_fptr = test_f;
+
+struct test2_s
+{
+  int f;
+};
+
+register struct test2_s *g __asm__("x28");
+
+void
+do_something ()
+{
+  test_fptr ();
+  struct test2_s *p1 = 0;
+  *p1 = *g;
+}