aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-04-18 11:39:04 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-04-18 11:39:04 +0000
commitedd048e29a3b5bce813f26b5b66f40fbe2f50d54 (patch)
treec5a0950537128282b7fea62dcc5afe5df81856f4 /gcc
parent65833da69d1cb0b57572c2736781d335fced397c (diff)
downloadgcc-edd048e29a3b5bce813f26b5b66f40fbe2f50d54.zip
gcc-edd048e29a3b5bce813f26b5b66f40fbe2f50d54.tar.gz
gcc-edd048e29a3b5bce813f26b5b66f40fbe2f50d54.tar.bz2
re PR tree-optimization/70701 (incomplete value numbering when memcpy-ing from array)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-53.c11
-rw-r--r--gcc/tree-ssa-sccvn.c6
4 files changed, 28 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 51bc8d7..63ec0ee 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
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 ...
(compute_antic): ... here. For partial antic use regular
postorder and scrap iteration.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 582d587..32dc4cd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..34d1ac6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-53.c
@@ -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" } } */
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 8a5b641..e61e033 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -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;