From bed3fd4637d24e27b61fbd7f366e98a211080a0b Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 25 Apr 2017 12:15:44 +0000 Subject: [PATCH] re PR tree-optimization/80492 (Wrong code when unrolling a loop with inline asm and local regs) 2017-04-25 Richard Biener 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 --- gcc/ChangeLog | 8 ++++++++ gcc/alias.c | 12 ++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr80492.c | 20 ++++++++++++++++++++ gcc/tree-ssa-alias.c | 7 +++++-- 5 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr80492.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2f4164737c1..41567792b6b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-04-25 Richard Biener + + 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 * config/arc/arc.c (LEGITIMATE_OFFSET_ADDRESS_P): Delete macro. diff --git a/gcc/alias.c b/gcc/alias.c index efd89ce1679..e16e3501522 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -2046,6 +2046,18 @@ compare_base_decls (tree base1, tree base2) if (base1 == base2) 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 decls are unique. */ if (!decl_in_symtab_p (base1) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fd6b9fa902b..576838e0d41 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-04-25 Richard Biener + + PR tree-optimization/80492 + * gcc.dg/pr80492.c: New testcase. + 2017-04-25 Senthil Kumar Selvaraj * gcc.dg/attr-alloc_size-10.c: Ignore overflow warnings diff --git a/gcc/testsuite/gcc.dg/pr80492.c b/gcc/testsuite/gcc.dg/pr80492.c new file mode 100644 index 00000000000..1721b2dee39 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr80492.c @@ -0,0 +1,20 @@ +/* { 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" } } */ diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 3f0c650475d..0dcb273e5c2 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -1096,13 +1096,16 @@ decl_refs_may_alias_p (tree ref1, tree base1, { 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 (compare_base_decls (base1, base2) == 0) + if (cmp == 0) return false; /* If both references are based on the same variable, they cannot alias if 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; /* For components with variable position, the above test isn't sufficient, -- 2.30.2