re PR tree-optimization/66142 (Loop is not vectorized because not sufficient support...
authorRichard Biener <rguenther@suse.de>
Thu, 28 May 2015 13:24:53 +0000 (13:24 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 28 May 2015 13:24:53 +0000 (13:24 +0000)
2015-05-28  Richard Biener  <rguenther@suse.de>

PR tree-optimization/66142
* tree-ssa-sccvn.c (vn_reference_lookup_3): Handle non-GIMPLE
values better in memcpy destination handling.  Handle non-aliasing
we discover here.

* gcc.dg/tree-ssa/ssa-fre-44.c: Fixup.

From-SVN: r223816

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-44.c
gcc/tree-ssa-sccvn.c

index 0603918fddc88bffef6d243173c1c9ca30b5934f..9e8110443aa8ada0df86345b7e5745c270b0e8bf 100644 (file)
@@ -1,3 +1,10 @@
+2015-05-28  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/66142
+       * tree-ssa-sccvn.c (vn_reference_lookup_3): Handle non-GIMPLE
+       values better in memcpy destination handling.  Handle non-aliasing
+       we discover here.
+
 2015-05-28  Lawrence Velázquez  <vq@larryv.me>
 
        PR target/63810
index 22e6021fb685f6811778fca2baa91e142cb6b45e..ddc74fc274c4bdae50a0afc998d28d6b97111757 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-28  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/66142
+       * gcc.dg/tree-ssa/ssa-fre-44.c: Fixup.
+
 2015-05-28  Lawrence Velázquez  <vq@larryv.me>
 
        PR target/63810
index 74707b27bbd7983a21362fb6eb297bf9d035be08..7d5f7137295a1820a544c62708bc43a415a80236 100644 (file)
@@ -39,7 +39,6 @@ f3 (struct B *x, int y)
   struct A *q = &x[y].u;
   __builtin_memcpy (&q->x, &p.x, sizeof (float));
   __builtin_memcpy (&q->y, &p.y, sizeof (float));
-  *q = p;
   float f = x[y].u.x + x[y].u.y;
   bar (&p);
   return f;
index 03be480b13f503e4b46c4a1fc53b42ed72914ccb..9d2345f41c406f8f047e33f10d4080373ba8172e 100644 (file)
@@ -2028,7 +2028,16 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
       lhs = gimple_call_arg (def_stmt, 0);
       lhs_offset = 0;
       if (TREE_CODE (lhs) == SSA_NAME)
-       lhs = SSA_VAL (lhs);
+       {
+         lhs = SSA_VAL (lhs);
+         if (TREE_CODE (lhs) == SSA_NAME)
+           {
+             gimple def_stmt = SSA_NAME_DEF_STMT (lhs);
+             if (gimple_assign_single_p (def_stmt)
+                 && gimple_assign_rhs_code (def_stmt) == ADDR_EXPR)
+               lhs = gimple_assign_rhs1 (def_stmt);
+           }
+       }
       if (TREE_CODE (lhs) == ADDR_EXPR)
        {
          tree tem = get_addr_base_and_unit_offset (TREE_OPERAND (lhs, 0),
@@ -2039,6 +2048,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
              && tree_fits_uhwi_p (TREE_OPERAND (tem, 1)))
            {
              lhs = TREE_OPERAND (tem, 0);
+             if (TREE_CODE (lhs) == SSA_NAME)
+               lhs = SSA_VAL (lhs);
              lhs_offset += tree_to_uhwi (TREE_OPERAND (tem, 1));
            }
          else if (DECL_P (tem))
@@ -2089,10 +2100,15 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
                  || TREE_OPERAND (lhs, 0) != base)))
        return (void *)-1;
 
-      /* And the access has to be contained within the memcpy destination.  */
       at = offset / BITS_PER_UNIT;
       if (TREE_CODE (base) == MEM_REF)
        at += tree_to_uhwi (TREE_OPERAND (base, 1));
+      /* If the access is completely outside of the memcpy destination
+        area there is no aliasing.  */
+      if (lhs_offset >= at + maxsize / BITS_PER_UNIT
+         || lhs_offset + copy_size <= at)
+       return NULL;
+      /* And the access has to be contained within the memcpy destination.  */
       if (lhs_offset > at
          || lhs_offset + copy_size < at + maxsize / BITS_PER_UNIT)
        return (void *)-1;