diff options
author | Richard Biener <rguenther@suse.de> | 2013-06-24 10:22:22 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-06-24 10:22:22 +0000 |
commit | 3dbc97a91e0151bdbe4749b2e8fc427f3fb687e0 (patch) | |
tree | a40cd40d70e99d651b36e5b81eefc95c7b9e7bc2 /gcc | |
parent | 03a8a2d57d28617d60d499a359a60a3258144065 (diff) | |
download | gcc-3dbc97a91e0151bdbe4749b2e8fc427f3fb687e0.zip gcc-3dbc97a91e0151bdbe4749b2e8fc427f3fb687e0.tar.gz gcc-3dbc97a91e0151bdbe4749b2e8fc427f3fb687e0.tar.bz2 |
re PR tree-optimization/57488 (loop terminates early at -O3)
2013-06-24 Richard Biener <rguenther@suse.de>
PR tree-optimization/57488
* tree-ssa-pre.c (insert): Clear NEW sets before each iteration.
* gcc.dg/torture/pr57488.c: New testcase.
From-SVN: r200363
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr57488.c | 58 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.c | 6 |
4 files changed, 74 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d10b846..51d549f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2013-06-24 Richard Biener <rguenther@suse.de> + + PR tree-optimization/57488 + * tree-ssa-pre.c (insert): Clear NEW sets before each iteration. + 2013-06-24 Alan Modra <amodra@gmail.com> * config/rs6000/rs6000.c (vspltis_constant): Correct for little-endian. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d130644..bb5eaa7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-06-24 Richard Biener <rguenther@suse.de> + + PR tree-optimization/57488 + * gcc.dg/torture/pr57488.c: New testcase. + 2013-06-24 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> Dominique d'Humieres <dominiq@lps.ens.fr> diff --git a/gcc/testsuite/gcc.dg/torture/pr57488.c b/gcc/testsuite/gcc.dg/torture/pr57488.c new file mode 100644 index 0000000..7eda364 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr57488.c @@ -0,0 +1,58 @@ +/* { dg-do run } */ + +extern void abort (void); + +int i, j, *pj = &j, **ppj = &pj; +int x, *px = &x; + +short s, *ps = &s, k; + +unsigned short u, *pu = &u, **ppu = &pu; + +char c, *pc = &c; + +unsigned char v = 48; + +static int +bar (int p) +{ + p = k; + *px = **ppu = i; + *ppj = &p; + if (**ppj) + *pj = p; + return p; +} + +void __attribute__((noinline)) +foo () +{ + for (; i <= 3; i++) + for (; j; j--); + + u ^= bar (*pj); + + for (k = 1; k >= 0; k--) + { + int l; + bar (0); + for (l = 1; l < 5; l++) + { + int m; + for (m = 6; m; m--) + { + v--; + *ps = *pc; + } + } + } +} + +int +main () +{ + foo (); + if (v != 0) + abort (); + return 0; +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 345ebcc..642a343 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -3665,6 +3665,12 @@ insert (void) if (dump_file && dump_flags & TDF_DETAILS) fprintf (dump_file, "Starting insert iteration %d\n", num_iterations); new_stuff = insert_aux (ENTRY_BLOCK_PTR); + + /* Clear the NEW sets before the next iteration. We have already + fully propagated its contents. */ + if (new_stuff) + FOR_ALL_BB (bb) + bitmap_set_free (NEW_SETS (bb)); } statistics_histogram_event (cfun, "insert iterations", num_iterations); } |