Commit bed3fd46 by Richard Biener Committed by Richard Biener

re PR tree-optimization/80492 (Wrong code when unrolling a loop with inline asm and local regs)

2017-04-25  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/80492
	* alias.c (compare_base_decls): Handle registers with asm
	specification conservatively.
	* tree-ssa-alias.c (decl_refs_may_alias_p): Handle
	compare_base_decls returning dont-know properly.

	* gcc.dg/pr80492.c: New testcase.

From-SVN: r247208
parent ca0b6141
2017-04-25 Richard Biener <rguenther@suse.de>
PR tree-optimization/80492
* alias.c (compare_base_decls): Handle registers with asm
specification conservatively.
* tree-ssa-alias.c (decl_refs_may_alias_p): Handle
compare_base_decls returning dont-know properly.
2017-04-25 Claudiu Zissulescu <claziss@synopsys.com> 2017-04-25 Claudiu Zissulescu <claziss@synopsys.com>
* config/arc/arc.c (LEGITIMATE_OFFSET_ADDRESS_P): Delete macro. * config/arc/arc.c (LEGITIMATE_OFFSET_ADDRESS_P): Delete macro.
......
...@@ -2046,6 +2046,18 @@ compare_base_decls (tree base1, tree base2) ...@@ -2046,6 +2046,18 @@ compare_base_decls (tree base1, tree base2)
if (base1 == base2) if (base1 == base2)
return 1; return 1;
/* If we have two register decls with register specification we
cannot decide unless their assembler name is the same. */
if (DECL_REGISTER (base1)
&& DECL_REGISTER (base2)
&& DECL_ASSEMBLER_NAME_SET_P (base1)
&& DECL_ASSEMBLER_NAME_SET_P (base2))
{
if (DECL_ASSEMBLER_NAME (base1) == DECL_ASSEMBLER_NAME (base2))
return 1;
return -1;
}
/* Declarations of non-automatic variables may have aliases. All other /* Declarations of non-automatic variables may have aliases. All other
decls are unique. */ decls are unique. */
if (!decl_in_symtab_p (base1) if (!decl_in_symtab_p (base1)
......
2017-04-25 Richard Biener <rguenther@suse.de>
PR tree-optimization/80492
* gcc.dg/pr80492.c: New testcase.
2017-04-25 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> 2017-04-25 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
* gcc.dg/attr-alloc_size-10.c: Ignore overflow warnings * gcc.dg/attr-alloc_size-10.c: Ignore overflow warnings
......
/* { dg-do compile } */
/* { dg-options "-w -O2 -fdump-tree-optimized" } */
static __inline__ __attribute__((__always_inline__))
void syscall_7 (int val)
{
register int reg __asm ("4") = val;
__asm __volatile__ ("/* Some Code %0 */" :: "r" (reg));
}
void do_syscalls (void)
{
for (int s = 0; s < 2; s++)
{
syscall_7 (0);
syscall_7 (1);
}
}
/* { dg-final { scan-tree-dump-times "reg = " 4 "optimized" } } */
...@@ -1096,13 +1096,16 @@ decl_refs_may_alias_p (tree ref1, tree base1, ...@@ -1096,13 +1096,16 @@ decl_refs_may_alias_p (tree ref1, tree base1,
{ {
gcc_checking_assert (DECL_P (base1) && DECL_P (base2)); gcc_checking_assert (DECL_P (base1) && DECL_P (base2));
int cmp = compare_base_decls (base1, base2);
/* If both references are based on different variables, they cannot alias. */ /* If both references are based on different variables, they cannot alias. */
if (compare_base_decls (base1, base2) == 0) if (cmp == 0)
return false; return false;
/* If both references are based on the same variable, they cannot alias if /* If both references are based on the same variable, they cannot alias if
the accesses do not overlap. */ the accesses do not overlap. */
if (!ranges_overlap_p (offset1, max_size1, offset2, max_size2)) if (cmp == 1
&& !ranges_overlap_p (offset1, max_size1, offset2, max_size2))
return false; return false;
/* For components with variable position, the above test isn't sufficient, /* For components with variable position, the above test isn't sufficient,
......
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