diff options
author | Richard Guenther <rguenther@suse.de> | 2009-02-10 14:54:13 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-02-10 14:54:13 +0000 |
commit | 7cae94fcba3cc400194fdf025c4b636838d2d12d (patch) | |
tree | 3dc3892cf084cf9a20ddafc9cb440422e5bd6f08 | |
parent | a8800687f548b183c6c28492e2ff455b606d828c (diff) | |
download | gcc-7cae94fcba3cc400194fdf025c4b636838d2d12d.tar.gz |
re PR tree-optimization/39132 (wrong code generated with -ftree-loop-disttribution)
2009-02-10 Richard Guenther <rguenther@suse.de>
PR tree-optimization/39132
* tree-loop-distribution.c (todo): New global var.
(generate_memset_zero): Trigger TODO_rebuild_alias.
(tree_loop_distribution): Return todo.
* gcc.dg/torture/pr39132.c: New testcase.
From-SVN: r144060
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr39132.c | 34 | ||||
-rw-r--r-- | gcc/tree-loop-distribution.c | 9 |
4 files changed, 54 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d18f8cc1c22..d29668a7ff4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-02-10 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/39132 + * tree-loop-distribution.c (todo): New global var. + (generate_memset_zero): Trigger TODO_rebuild_alias. + (tree_loop_distribution): Return todo. + 2009-02-10 H.J. Lu <hongjiu.lu@intel.com> PR target/39119 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 15a7facc31f..02a65b9335e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-02-10 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/39132 + * gcc.dg/torture/pr39132.c: New testcase. + 2009-02-10 H.J. Lu <hongjiu.lu@intel.com> PR target/39119 diff --git a/gcc/testsuite/gcc.dg/torture/pr39132.c b/gcc/testsuite/gcc.dg/torture/pr39132.c new file mode 100644 index 00000000000..f6e2907e0d6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr39132.c @@ -0,0 +1,34 @@ +/* { dg-do run } */ +/* { dg-options "-ftree-loop-distribution" } */ + +extern void abort(void); + +struct epic_private +{ + unsigned int *rx_ring; + unsigned int rx_skbuff[5]; +}; + +int +main (void) +{ + struct epic_private ep; + unsigned int rx_ring[5]; + int i; + + ep.rx_skbuff[0] = 5; + + ep.rx_ring = rx_ring; + + for (i = 0; i < 5; i++) + { + ep.rx_ring[i] = i; + ep.rx_skbuff[i] = 0; + } + + if (ep.rx_skbuff[0] != 0) + abort (); + + return 0; +} + diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 8eca7c02166..080eceacb55 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -77,6 +77,9 @@ static bitmap remaining_stmts; predecessor a node that writes to memory. */ static bitmap upstream_mem_writes; +/* TODOs we need to run after the pass. */ +static unsigned int todo; + /* Update the PHI nodes of NEW_LOOP. NEW_LOOP is a duplicate of ORIG_LOOP. */ @@ -331,6 +334,8 @@ generate_memset_zero (gimple stmt, tree op0, tree nb_iter, if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "generated memset zero\n"); + todo |= TODO_rebuild_alias; + end: free_data_ref (dr); return res; @@ -1206,6 +1211,8 @@ tree_loop_distribution (void) loop_iterator li; int nb_generated_loops = 0; + todo = 0; + FOR_EACH_LOOP (li, loop, 0) { VEC (gimple, heap) *work_list = VEC_alloc (gimple, heap, 3); @@ -1237,7 +1244,7 @@ tree_loop_distribution (void) VEC_free (gimple, heap, work_list); } - return 0; + return todo; } static bool |