From: Richard Guenther Date: Tue, 1 Feb 2011 11:27:04 +0000 (+0000) Subject: re PR tree-optimization/47541 (For integer pointers, the value of ++*p is not writte... X-Git-Tag: releases/gcc-4.5.3~255 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=309ab79b2a1621c6a28620ba51ab416ff55c7335;p=thirdparty%2Fgcc.git re PR tree-optimization/47541 (For integer pointers, the value of ++*p is not written back to memory) 2011-02-01 Richard Guenther PR tree-optimization/47541 * tree-ssa-structalias.c (push_fields_onto_fieldstack): Make sure to have a field at offset zero. * g++.dg/torture/pr47541.C: New testcase. From-SVN: r169472 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 88a718615167..27c16ea23b5c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-02-01 Richard Guenther + + PR tree-optimization/47541 + * tree-ssa-structalias.c (push_fields_onto_fieldstack): Make + sure to have a field at offset zero. + 2011-01-31 Nathan Froyd Backport from mainline: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0579a449efad..d8707ade4b75 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-02-01 Richard Guenther + + PR tree-optimization/47541 + * g++.dg/torture/pr47541.C: New testcase. + 2011-01-31 Nathan Froyd Backport from mainline: diff --git a/gcc/testsuite/g++.dg/torture/pr47541.C b/gcc/testsuite/g++.dg/torture/pr47541.C new file mode 100644 index 000000000000..350a05192979 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr47541.C @@ -0,0 +1,27 @@ +/* { dg-do run } */ + +struct Dummy {}; +struct RefCount : public Dummy { + ~RefCount(); /* Has to be non-pod. */ + int *a; + int *b; +}; +RefCount::~RefCount(){} +struct Wrapper : public Dummy { RefCount ref; }; +void __attribute__((noinline,noclone)) +Push(Wrapper ptr) +{ + *ptr.ref.b = 0; +} +extern "C" void abort (void); +int main() +{ + int a = 1, b = 1; + Wrapper x; + x.ref.a = &a; + x.ref.b = &b; + Push(x); + if (b != 0) + abort (); + return 0; +} diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 314705ccbfd1..6716be7bdf2e 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -4309,6 +4309,17 @@ push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack, if (!VEC_empty (fieldoff_s, *fieldstack)) pair = VEC_last (fieldoff_s, *fieldstack); + if (!pair + && offset + foff != 0) + { + pair = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL); + pair->offset = 0; + pair->size = offset + foff; + pair->has_unknown_size = false; + pair->may_have_pointers = false; + pair->only_restrict_pointers = false; + } + if (!DECL_SIZE (field) || !host_integerp (DECL_SIZE (field), 1)) has_unknown_size = true;