From f35ea97de898081cb04ceaa6bca97d2b719e7c47 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 11 May 2016 14:04:32 +0000 Subject: [PATCH] re PR tree-optimization/71055 (FAIL: gcc.dg/torture/pr53663-1.c -Os execution test) 2016-05-11 Richard Biener PR tree-optimization/71055 * tree-ssa-sccvn.c (vn_reference_lookup_3): When native-interpreting sth with precision not equal to access size verify we don't chop off bits. * gcc.dg/torture/pr71055.c: New testcase. From-SVN: r236122 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr71055.c | 18 ++++++++++++++++++ gcc/tree-ssa-sccvn.c | 24 ++++++++++++++++++++++-- 4 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr71055.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 23327327043..740a3f4fc2b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-05-11 Richard Biener + + PR tree-optimization/71055 + * tree-ssa-sccvn.c (vn_reference_lookup_3): When native-interpreting + sth with precision not equal to access size verify we don't chop + off bits. + 2016-05-11 Richard Biener PR debug/71057 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4f7f0f86788..91703474055 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-05-11 Richard Biener + + PR tree-optimization/71055 + * gcc.dg/torture/pr71055.c: New testcase. + 2016-05-11 Richard Biener PR debug/71057 diff --git a/gcc/testsuite/gcc.dg/torture/pr71055.c b/gcc/testsuite/gcc.dg/torture/pr71055.c new file mode 100644 index 00000000000..7fe5a71ce06 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr71055.c @@ -0,0 +1,18 @@ +/* { dg-do run } */ + +extern void abort (void); +union U { int i; _Bool b; char c; }; +void __attribute__((noinline,noclone)) +foo (union U *u) +{ + if (u->c != 0) + abort (); +} +int main() +{ + union U u; + u.i = 10; + u.b = 0; + foo (&u); + return 0; +} diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 63441178dea..1567fb96afb 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -1907,14 +1907,34 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_, buffer, sizeof (buffer)); if (len > 0) { - tree val = native_interpret_expr (vr->type, + tree type = vr->type; + /* Make sure to interpret in a type that has a range + covering the whole access size. */ + if (INTEGRAL_TYPE_P (vr->type) + && ref->size != TYPE_PRECISION (vr->type)) + type = build_nonstandard_integer_type (ref->size, + TYPE_UNSIGNED (type)); + tree val = native_interpret_expr (type, buffer + ((offset - offset2) / BITS_PER_UNIT), ref->size / BITS_PER_UNIT); + /* If we chop off bits because the types precision doesn't + match the memory access size this is ok when optimizing + reads but not when called from the DSE code during + elimination. */ + if (val + && type != vr->type) + { + if (! int_fits_type_p (val, vr->type)) + val = NULL_TREE; + else + val = fold_convert (vr->type, val); + } + if (val) return vn_reference_lookup_or_insert_for_pieces - (vuse, vr->set, vr->type, vr->operands, val); + (vuse, vr->set, vr->type, vr->operands, val); } } } -- 2.30.2