re PR tree-optimization/70701 (incomplete value numbering when memcpy-ing from array)
authorRichard Biener <rguenther@suse.de>
Mon, 18 Apr 2016 11:39:04 +0000 (11:39 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 18 Apr 2016 11:39:04 +0000 (11:39 +0000)
2016-04-18  Richard Biener  <rguenther@suse.de>

PR tree-optimization/70701
* tree-ssa-sccvn.c (vn_reference_lookup_3): Resolve fully constant
references after translating through a memcpy.

* gcc.dg/tree-ssa/ssa-fre-53.c: New testcase.

From-SVN: r235131

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-53.c [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index 51bc8d764a1fe0ddac1c9cd148815fe87496c583..63ec0ee0bf4f93affa58b3a7b9cc8072062febfd 100644 (file)
@@ -1,3 +1,9 @@
+2016-04-18  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/70701
+       * tree-ssa-sccvn.c (vn_reference_lookup_3): Resolve fully constant
+       references after translating through a memcpy.
+
 2016-04-18  Richard Biener  <rguenther@suse.de>
 
        * tree-ssa-pre.c (postorder, postorder_num): Make locals ...
index 582d5873937fd5e84a8ece89b78c691ae1fc438b..32dc4cdc1db3b93498c6fff1e198b11c6aa760aa 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-18  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/70701
+       * gcc.dg/tree-ssa/ssa-fre-53.c: New testcase.
+
 2016-04-18  Tom de Vries  <tom@codesourcery.com>
 
        PR testsuite/70699
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-53.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-53.c
new file mode 100644 (file)
index 0000000..34d1ac6
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fno-tree-forwprop -fdump-tree-fre1" } */
+
+const int a[]={1,2,3};
+int f(){
+    int*b=__builtin_malloc(12);
+    __builtin_memcpy(b,a,12);
+    return b[0];
+}
+
+/* { dg-final { scan-tree-dump "return 1;" "fre1" } } */
index 8a5b641a70e3cedc899b7174812cb39b48960f57..e61e03334af1cb0a2d983309ad9e7bc250e6f2b0 100644 (file)
@@ -2152,6 +2152,12 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
       vr->operands[1] = op;
       vr->hashcode = vn_reference_compute_hash (vr);
 
+      /* Try folding the new reference to a constant.  */
+      tree val = fully_constant_vn_reference_p (vr);
+      if (val)
+       return vn_reference_lookup_or_insert_for_pieces
+                (vuse, vr->set, vr->type, vr->operands, val);
+
       /* Adjust *ref from the new operands.  */
       if (!ao_ref_init_from_vn_reference (&r, vr->set, vr->type, vr->operands))
        return (void *)-1;