+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
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)
/* 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);
+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
--- /dev/null
+/* { 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;
+}