Hello,I noticed that in some cases we were failing to find aliasing information because we were only looking at an SSA_NAME variable, missing the fact that it was really an ADDR_EXPR. The attached patch passes bootstrap+testsuite, does it make sense? (I am a bit afraid of losing some type information for instance)
I didn't investigate the 2 tests where I had to remove dg-bogus, because removing dg-bogus sounds like a bonus...
2013-10-25 Marc Glisse <marc.gli...@inria.fr> gcc/ * tree-ssa-alias.c (ao_ref_init_from_ptr_and_size): Look for an ADDR_EXPR in the defining statement. gcc/testsuite/ * gcc.dg/tree-ssa/alias-23.c: New file. * gcc.dg/vect/vect-ivdep-1.c: Remove dg-bogus. * gfortran.dg/vect/vect-do-concurrent-1.f90: Likewise. -- Marc Glisse
Index: gcc/testsuite/gcc.dg/tree-ssa/alias-23.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/alias-23.c (revision 0) +++ gcc/testsuite/gcc.dg/tree-ssa/alias-23.c (working copy) @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +typedef struct A { int i; double d; } A; + +void f1 (const char *c) +{ + A *s = (A*) __builtin_malloc (sizeof (A)); + double *p = &s->d; + s->i = 42; + __builtin_memcpy (p, c, sizeof (double)); + int j = s->i; + if (j != 42) __builtin_abort(); +} + +/* { dg-final { scan-tree-dump-not "abort" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ + Property changes on: gcc/testsuite/gcc.dg/tree-ssa/alias-23.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Author Date Id Revision URL \ No newline at end of property Index: gcc/testsuite/gcc.dg/vect/vect-ivdep-1.c =================================================================== --- gcc/testsuite/gcc.dg/vect/vect-ivdep-1.c (revision 204044) +++ gcc/testsuite/gcc.dg/vect/vect-ivdep-1.c (working copy) @@ -8,12 +8,11 @@ void foo(int n, int *a, int *b, int *c, int *d, int *e) { int i, j; #pragma GCC ivdep for (i = 0; i < n; ++i) { a[i] = b[i] + c[i]; } } /* { dg-message "loop vectorized" "" { target *-*-* } 0 } */ /* { dg-bogus "version" "" { target *-*-* } 0 } */ -/* { dg-bogus "alias" "" { target *-*-* } 0 } */ /* { dg-final { cleanup-tree-dump "vect" } } */ Index: gcc/testsuite/gfortran.dg/vect/vect-do-concurrent-1.f90 =================================================================== --- gcc/testsuite/gfortran.dg/vect/vect-do-concurrent-1.f90 (revision 204044) +++ gcc/testsuite/gfortran.dg/vect/vect-do-concurrent-1.f90 (working copy) @@ -6,12 +6,11 @@ subroutine test(n, a, b, c) integer, value :: n real, contiguous, pointer :: a(:), b(:), c(:) integer :: i do concurrent (i = 1:n) a(i) = b(i) + c(i) end do end subroutine test ! { dg-message "loop vectorized" "" { target *-*-* } 0 } ! { dg-bogus "version" "" { target *-*-* } 0 } -! { dg-bogus "alias" "" { target *-*-* } 0 } ! { dg-final { cleanup-tree-dump "vect" } } Index: gcc/tree-ssa-alias.c =================================================================== --- gcc/tree-ssa-alias.c (revision 204044) +++ gcc/tree-ssa-alias.c (working copy) @@ -561,20 +561,29 @@ ao_ref_alias_set (ao_ref *ref) /* Init an alias-oracle reference representation from a gimple pointer PTR and a gimple size SIZE in bytes. If SIZE is NULL_TREE the the size is assumed to be unknown. The access is assumed to be only to or after of the pointer target, not before it. */ void ao_ref_init_from_ptr_and_size (ao_ref *ref, tree ptr, tree size) { HOST_WIDE_INT t1, t2; ref->ref = NULL_TREE; + if (TREE_CODE (ptr) == SSA_NAME) + { + gimple stmt = SSA_NAME_DEF_STMT (ptr); + if (gimple_assign_single_p (stmt) + && !gimple_has_volatile_ops (stmt) + && gimple_assign_rhs_code (stmt) == ADDR_EXPR) + ptr = gimple_assign_rhs1 (stmt); + } + if (TREE_CODE (ptr) == ADDR_EXPR) ref->base = get_ref_base_and_extent (TREE_OPERAND (ptr, 0), &ref->offset, &t1, &t2); else { ref->base = build2 (MEM_REF, char_type_node, ptr, null_pointer_node); ref->offset = 0; } if (size