diff options
author | Richard Guenther <rguenther@suse.de> | 2006-05-07 21:03:55 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2006-05-07 21:03:55 +0000 |
commit | 18455d174e20136859caf15b360c6ba941fb6688 (patch) | |
tree | 73589bc29516aec8ae6263c78c3d383887aaa764 /gcc | |
parent | e716a54401ce2848a0143d5e02a5b9f11015886a (diff) | |
download | gcc-18455d174e20136859caf15b360c6ba941fb6688.zip gcc-18455d174e20136859caf15b360c6ba941fb6688.tar.gz gcc-18455d174e20136859caf15b360c6ba941fb6688.tar.bz2 |
re PR middle-end/27409 (ICE in get_constraint_for_component_ref)
2006-05-07 Richard Guenther <rguenther@suse.de>
PR tree-optimization/27409
* tree-ssa-structalias.c (get_constraint_for_component_ref):
Do not try to find zero-sized subvars.
* gcc.dg/torture/pr27409.c: New testcase.
From-SVN: r113607
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr27409.c | 17 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 9 |
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bc21174..7f3cd34 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2006-05-07 Richard Guenther <rguenther@suse.de> + PR tree-optimization/27409 + * tree-ssa-structalias.c (get_constraint_for_component_ref): + Do not try to find zero-sized subvars. + +2006-05-07 Richard Guenther <rguenther@suse.de> + PR tree-optimization/27136 * tree-ssa-loop-niter.c (get_val_for): Correct function comment, assert requirements. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5ac84b0..7041216 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-05-07 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/27409 + * gcc.dg/torture/pr27409.c: New testcase. + 2006-05-07 Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de> PR fortran/27457 diff --git a/gcc/testsuite/gcc.dg/torture/pr27409.c b/gcc/testsuite/gcc.dg/torture/pr27409.c new file mode 100644 index 0000000..430e6c8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr27409.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ + +typedef struct { + struct { } z; +} thang_t; + +struct { + short e; + thang_t f; + int g; +} my_struct; + +void function(int blaz) +{ + thang_t *fp = &my_struct.f; + foo(fp); +} diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index c5b6cab..26dbd0d 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -2378,7 +2378,8 @@ get_constraint_for_component_ref (tree t, VEC(ce_s, heap) **results) ignore this constraint. When we handle pointer subtraction, we may have to do something cute here. */ - if (result->offset < get_varinfo (result->var)->fullsize) + if (result->offset < get_varinfo (result->var)->fullsize + && bitmaxsize != 0) { /* It's also not true that the constraint will actually start at the right offset, it may start in some padding. We only care about @@ -2400,6 +2401,12 @@ get_constraint_for_component_ref (tree t, VEC(ce_s, heap) **results) embedded in a struct resulting in accessing *only* padding. */ gcc_assert (curr || ref_contains_array_ref (orig_t)); } + else if (bitmaxsize == 0) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "Access to zero-sized part of variable," + "ignoring\n"); + } else if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "Access to past the end of variable, ignoring\n"); |