From: Richard Guenther Date: Tue, 27 May 2008 13:21:07 +0000 (+0000) Subject: re PR tree-optimization/36339 (not call clobbering variable for non common offset) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a46fc136fc682ea3d0429e6ac1084712fe18b612;p=gcc.git re PR tree-optimization/36339 (not call clobbering variable for non common offset) 2008-05-27 Richard Guenther PR tree-optimization/36339 * tree-ssa-alias.c (set_initial_properties): Escaped pt_anything pointers cause all addressable variables to be call clobbered. * gcc.c-torture/execute/pr36339.c: New testcase. * gcc.dg/tree-ssa/loadpre8.c: XFAIL. From-SVN: r136030 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bbe6eec73f8..b0ccae4f652 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-05-27 Richard Guenther + + PR tree-optimization/36339 + * tree-ssa-alias.c (set_initial_properties): Escaped pt_anything + pointers cause all addressable variables to be call clobbered. + 2008-05-27 Richard Guenther PR tree-optimization/36245 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d1eb120f035..815ab8aca10 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2008-05-27 Richard Guenther + + PR tree-optimization/36339 + * gcc.c-torture/execute/pr36339.c: New testcase. + * gcc.dg/tree-ssa/loadpre8.c: XFAIL. + 2008-05-27 Eric Botcazou * gnat.dg/pack9.ad[sb]: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr36339.c b/gcc/testsuite/gcc.c-torture/execute/pr36339.c new file mode 100644 index 00000000000..c4f36ddcace --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr36339.c @@ -0,0 +1,32 @@ +extern void abort (void); + +typedef unsigned long my_uintptr_t; + +int check_a(my_uintptr_t tagged_ptr); + +int __attribute__((noinline)) try_a(my_uintptr_t x) +{ + my_uintptr_t heap[2]; + my_uintptr_t *hp = heap; + + hp[0] = x; + hp[1] = 0; + return check_a((my_uintptr_t)(void*)((char*)hp + 1)); +} + +int __attribute__((noinline)) check_a(my_uintptr_t tagged_ptr) +{ + my_uintptr_t *hp = (my_uintptr_t*)(void*)((char*)tagged_ptr - 1); + + if (hp[0] == 42 && hp[1] == 0) + return 0; + return -1; +} + +int main(void) +{ + if (try_a(42) < 0) + abort (); + return 0; +} + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loadpre8.c b/gcc/testsuite/gcc.dg/tree-ssa/loadpre8.c index a4d2e50c461..6be2b3ec7fd 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/loadpre8.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/loadpre8.c @@ -93,5 +93,5 @@ rewrite_add_phi_arguments (basic_block bb) get_reaching_def ((get_def_from_ptr (get_phi_result_ptr (phi)))->ssa_name.var); } } -/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre"} } */ +/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre" { xfail *-*-* } } } */ /* { dg-final { cleanup-tree-dump "pre" } } */ diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 7ce016b9096..983e321521d 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -571,6 +571,22 @@ set_initial_properties (struct alias_info *ai) mark_call_clobbered (alias, pi->escape_mask); } } + else if (pi->pt_anything) + { + bitmap_iterator bi; + unsigned int j; + + /* If we do not have the points-to set filled out we + still need to honor that this escaped pointer points + to anything. */ + EXECUTE_IF_SET_IN_BITMAP (gimple_addressable_vars (cfun), + 0, j, bi) + { + tree var = referenced_var (j); + if (!unmodifiable_var_p (var)) + mark_call_clobbered (var, pi->escape_mask); + } + } } /* If the name tag is call clobbered, so is the symbol tag