Commit 0d47cee6 by Kyrylo Tkachov Committed by Kyrylo Tkachov

[ree] PR rtl-optimization/78038: Handle global register dataflow definitions in ree

	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
parent a20d03c8
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
......
......@@ -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);
......
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
......
/* { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment