diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f4c65af823d..2c7195401c8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-04-11 Andrew Pinski + + * tree-ssa-alias.c (may_alias_p): If the variable + is a global variable and the pointer is parameter + and -fargument-noalias-global is used, then + the pointer cannot alias the variable. + 2005-04-11 James A. Morrison * config/sparc/sparc.c: Use gcc_assert and gcc_unreachable. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 50d11b6abb4..ff03dbee86b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-04-11 Andrew Pinski + + * gcc.dg/tree-ssa/alias-1.c: New test. + 2005-04-11 Diego Novillo PR tree-optimization/20920 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-1.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-1.c new file mode 100644 index 00000000000..4e6cc5ad448 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/alias-1.c @@ -0,0 +1,16 @@ +/* { dg-options "-O2 -fargument-noalias-global -fdump-tree-optimizated" } */ +int f; +void link_error (); + +void g(int *i) +{ + *i = 0; + f = 1; + if (*i != 0) + link_error (); +} + + +/* We should have removed the link_error on the tree level as we told GCC + that *i cannot point to f via the option -fargument-noalias-global. */ +/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized"} } */ diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index de39ed128f4..0f7001757c5 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -1708,6 +1708,16 @@ may_alias_p (tree ptr, HOST_WIDE_INT mem_alias_set, alias_stats.simple_resolved++; return false; } + + /* If -fargument-noalias-global is >1, pointer arguments may + not point to global variables. */ + if (flag_argument_noalias > 1 && is_global_var (var) + && TREE_CODE (ptr) == PARM_DECL) + { + alias_stats.alias_noalias++; + alias_stats.simple_resolved++; + return false; + } m_ann = var_ann (mem);