From edd048e29a3b5bce813f26b5b66f40fbe2f50d54 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 18 Apr 2016 11:39:04 +0000 Subject: [PATCH] re PR tree-optimization/70701 (incomplete value numbering when memcpy-ing from array) 2016-04-18 Richard Biener 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 | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-53.c | 11 +++++++++++ gcc/tree-ssa-sccvn.c | 6 ++++++ 4 files changed, 28 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-53.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 51bc8d764a1..63ec0ee0bf4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-04-18 Richard Biener + + 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 * tree-ssa-pre.c (postorder, postorder_num): Make locals ... diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 582d5873937..32dc4cdc1db 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-18 Richard Biener + + PR tree-optimization/70701 + * gcc.dg/tree-ssa/ssa-fre-53.c: New testcase. + 2016-04-18 Tom de Vries 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 00000000000..34d1ac6b523 --- /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 8a5b641a70e..e61e03334af 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; -- 2.30.2