diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2006-08-22 14:04:16 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@gcc.gnu.org> | 2006-08-22 14:04:16 +0000 |
commit | ca8587095ee88f587d9bd2a115cbe6c05ffe2960 (patch) | |
tree | 81bb3dbcd2eb11bcbda0b5066d2c8a4cd44d8a05 /gcc | |
parent | 883259c6d3071d35451cd34353191565bc4cee34 (diff) | |
download | gcc-ca8587095ee88f587d9bd2a115cbe6c05ffe2960.zip gcc-ca8587095ee88f587d9bd2a115cbe6c05ffe2960.tar.gz gcc-ca8587095ee88f587d9bd2a115cbe6c05ffe2960.tar.bz2 |
re PR tree-optimization/28003 (optimizer bug)
2006-08-22 Daniel Berlin <dberlin@dberlin.org>
PR tree-optimization/28003
* tree-ssa-alias.c (compute_may_aliases): Compute call clobbered
before grouping aliases.
From-SVN: r116323
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr28003.C | 31 | ||||
-rw-r--r-- | gcc/tree-ssa-alias.c | 6 |
3 files changed, 40 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 136ba9d..3e4e388 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-08-22 Daniel Berlin <dberlin@dberlin.org> + + PR tree-optimization/28003 + * tree-ssa-alias.c (compute_may_aliases): Compute call clobbered + before grouping aliases. + 2006-08-22 Roger Sayle <roger@eyesopen.com> * config/i386/i386.c (ix86_value_regno): Don't return FIRST_MMX_REG diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr28003.C b/gcc/testsuite/g++.dg/tree-ssa/pr28003.C new file mode 100644 index 0000000..ff260bc --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr28003.C @@ -0,0 +1,31 @@ +// PR tree-optimization/28003 +// Alias grouping needs to be computed after call clobbering, because it +// changes around the tags and variables in a way that makes our +// call clobbering computation incorrect. +// { dg-do run } +// { dg-options "-O2" } +extern "C" void abort(void); +struct A +{ + int i, j[9]; + A() : i(1) { j[0]=j[1]=j[2]=j[3]=j[4]=j[5]=j[6]=j[7]=j[8]=0; } +}; + +struct B +{ + A a; +}; + +B b[] = +{ + {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, + {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, + {}, {}, {}, {}, {} +}; + +int main() +{ + if (1 - b[sizeof(b)/sizeof(B) - 1].a.i != 0) + abort(); + return 0; +} diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index cf5ed4e..d3c5700 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -678,14 +678,14 @@ compute_may_aliases (void) /* Compute type-based flow-insensitive aliasing for all the type memory tags. */ compute_flow_insensitive_aliasing (ai); + + /* Compute call clobbering information. */ + compute_call_clobbered (ai); /* Determine if we need to enable alias grouping. */ if (ai->total_alias_vops >= MAX_ALIASED_VOPS) group_aliases (ai); - /* Compute call clobbering information. */ - compute_call_clobbered (ai); - /* If the program has too many call-clobbered variables and/or function calls, create .GLOBAL_VAR and use it to model call-clobbering semantics at call sites. This reduces the number of virtual operands |