[ree] PR rtl-optimization/78038: Handle global register dataflow definitions in ree
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Fri, 21 Oct 2016 07:55:30 +0000 (07:55 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Fri, 21 Oct 2016 07:55:30 +0000 (07:55 +0000)
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: r241395

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

index 73370949f369326fe440d6eac60b43338662a088..bd7e9680d8c37237b398dc07c555e748ac137ef1 100644 (file)
@@ -1,3 +1,10 @@
+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-10-21  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/78051
index 4ab2ad088c363caaaae8abaad375ec5a78bf13ea..374988e792e27fc342518e8e98af618bc595dbce 100644 (file)
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -482,6 +482,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)
@@ -580,7 +588,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 8033762d6ca2b375caaf23e0fdc215f5493b5f1c..2f32252f91f0edc5291406126ea5fd793c03ae0a 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-21  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR rtl-optimization/78038
+       * gcc.target/aarch64/pr78038.c: New test.
+
 2016-10-21  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/78051
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;
+}