tree-ssa-alias.c (ao_ref_init_from_ptr_and_size): Look for a POINTER_PLUS_EXPR in...
authorMarc Glisse <marc.glisse@inria.fr>
Wed, 30 Oct 2013 14:33:49 +0000 (15:33 +0100)
committerMarc Glisse <glisse@gcc.gnu.org>
Wed, 30 Oct 2013 14:33:49 +0000 (14:33 +0000)
2013-10-30  Marc Glisse  <marc.glisse@inria.fr>

gcc/
* tree-ssa-alias.c (ao_ref_init_from_ptr_and_size): Look for a
POINTER_PLUS_EXPR in the defining statement.

gcc/testsuite/
* gcc.dg/tree-ssa/alias-24.c: New file.

From-SVN: r204213

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/alias-24.c [new file with mode: 0644]
gcc/tree-ssa-alias.c

index d002ded4e8e295f85a256d4f2b1b909b23a0e723..f62fcdd11f6832a724242c2d4ec4f2f5b60b87bf 100644 (file)
@@ -1,3 +1,8 @@
+2013-10-30  Marc Glisse  <marc.glisse@inria.fr>
+
+       * tree-ssa-alias.c (ao_ref_init_from_ptr_and_size): Look for a
+       POINTER_PLUS_EXPR in the defining statement.
+
 2013-10-30  Vladimir Makarov  <vmakarov@redhat.com>
 
        * regmove.c: Remove.
index 5b14bfb07999931ea3774e5135b51bce14fba8d2..5c5171dd5fcb28960cb9dc07ef34fd1975688ac3 100644 (file)
@@ -1,3 +1,7 @@
+2013-10-30  Marc Glisse  <marc.glisse@inria.fr>
+
+       * gcc.dg/tree-ssa/alias-24.c: New file.
+
 2013-10-30  Vladimir Makarov  <vmakarov@redhat.com>
 
        * gcc.target/i386/fma_double_3.c: Use pattern for
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-24.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-24.c
new file mode 100644 (file)
index 0000000..0edd51f
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+void f (const char *c, int *i)
+{
+  *i = 42;
+  __builtin_memcpy (i + 1, c, sizeof (int));
+  if (*i != 42) __builtin_abort();
+}
+
+extern void keepit ();
+void g (const char *c, int *i)
+{
+  *i = 33;
+  __builtin_memcpy (i - 1, c, 3 * sizeof (int));
+  if (*i != 33) keepit();
+}
+
+/* { dg-final { scan-tree-dump-not "abort" "optimized" } } */
+/* { dg-final { scan-tree-dump "keepit" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
+
index 4db83bd1f983ad75bddd34968cc75f22a6273c8c..efc08c20991973d7ffe0e49de9435cb398664c33 100644 (file)
@@ -566,7 +566,7 @@ ao_ref_alias_set (ao_ref *ref)
 void
 ao_ref_init_from_ptr_and_size (ao_ref *ref, tree ptr, tree size)
 {
-  HOST_WIDE_INT t1, t2;
+  HOST_WIDE_INT t1, t2, extra_offset = 0;
   ref->ref = NULL_TREE;
   if (TREE_CODE (ptr) == SSA_NAME)
     {
@@ -574,6 +574,14 @@ ao_ref_init_from_ptr_and_size (ao_ref *ref, tree ptr, tree size)
       if (gimple_assign_single_p (stmt)
          && gimple_assign_rhs_code (stmt) == ADDR_EXPR)
        ptr = gimple_assign_rhs1 (stmt);
+      else if (is_gimple_assign (stmt)
+              && gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
+              && host_integerp (gimple_assign_rhs2 (stmt), 0)
+              && (t1 = int_cst_value (gimple_assign_rhs2 (stmt))) >= 0)
+       {
+         ptr = gimple_assign_rhs1 (stmt);
+         extra_offset = BITS_PER_UNIT * t1;
+       }
     }
 
   if (TREE_CODE (ptr) == ADDR_EXPR)
@@ -585,10 +593,12 @@ ao_ref_init_from_ptr_and_size (ao_ref *ref, tree ptr, tree size)
                          ptr, null_pointer_node);
       ref->offset = 0;
     }
+  ref->offset += extra_offset;
   if (size
       && host_integerp (size, 0)
-      && TREE_INT_CST_LOW (size) * 8 / 8 == TREE_INT_CST_LOW (size))
-    ref->max_size = ref->size = TREE_INT_CST_LOW (size) * 8;
+      && TREE_INT_CST_LOW (size) * BITS_PER_UNIT / BITS_PER_UNIT
+        == TREE_INT_CST_LOW (size))
+    ref->max_size = ref->size = TREE_INT_CST_LOW (size) * BITS_PER_UNIT;
   else
     ref->max_size = ref->size = -1;
   ref->ref_alias_set = 0;