From ca8587095ee88f587d9bd2a115cbe6c05ffe2960 Mon Sep 17 00:00:00 2001 From: Daniel Berlin Date: Tue, 22 Aug 2006 14:04:16 +0000 Subject: [PATCH] re PR tree-optimization/28003 (optimizer bug) 2006-08-22 Daniel Berlin PR tree-optimization/28003 * tree-ssa-alias.c (compute_may_aliases): Compute call clobbered before grouping aliases. From-SVN: r116323 --- gcc/ChangeLog | 6 +++++ gcc/testsuite/g++.dg/tree-ssa/pr28003.C | 31 +++++++++++++++++++++++++ gcc/tree-ssa-alias.c | 6 ++--- 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr28003.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 136ba9dd9d2..3e4e3881136 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-08-22 Daniel Berlin + + PR tree-optimization/28003 + * tree-ssa-alias.c (compute_may_aliases): Compute call clobbered + before grouping aliases. + 2006-08-22 Roger Sayle * 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 00000000000..ff260bcf4b4 --- /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 cf5ed4e1669..d3c5700c873 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