diff options
author | Richard Guenther <rguenther@suse.de> | 2011-02-01 09:47:21 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-02-01 09:47:21 +0000 |
commit | 3fd3b156d6c93cf263616ab400691d1a3aedf07d (patch) | |
tree | 7d8501382557fc2411e882ec6b7f73fbd06eabac /gcc | |
parent | 3eaa6afc66b55971d1e5ee4ccfbf4062f7ce44c5 (diff) | |
download | gcc-3fd3b156d6c93cf263616ab400691d1a3aedf07d.zip gcc-3fd3b156d6c93cf263616ab400691d1a3aedf07d.tar.gz gcc-3fd3b156d6c93cf263616ab400691d1a3aedf07d.tar.bz2 |
re PR tree-optimization/47541 (For integer pointers, the value of ++*p is not written back to memory)
2011-02-01 Richard Guenther <rguenther@suse.de>
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: r169468
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr47541.C | 27 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 13 |
4 files changed, 51 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 90e4c78..e5ed1d8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-02-01 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/47541 + * tree-ssa-structalias.c (push_fields_onto_fieldstack): Make + sure to have a field at offset zero. + 2011-01-31 Joseph Myers <joseph@codesourcery.com> * config/arc/arc.opt (EB, EL): New Driver options. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 17bb107..8164cf4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-02-01 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/47541 + * g++.dg/torture/pr47541.C: New testcase. + 2011-01-31 Janus Weil <janus@gcc.gnu.org> PR fortran/47455 diff --git a/gcc/testsuite/g++.dg/torture/pr47541.C b/gcc/testsuite/g++.dg/torture/pr47541.C new file mode 100644 index 0000000..350a051 --- /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 cf1e817..97719ff 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -5083,6 +5083,19 @@ push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack, if (!VEC_empty (fieldoff_s, *fieldstack)) pair = VEC_last (fieldoff_s, *fieldstack); + /* If there isn't anything at offset zero, create sth. */ + 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->must_have_pointers = 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; |