diff options
author | Richard Biener <rguenther@suse.de> | 2013-09-30 12:22:00 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-09-30 12:22:00 +0000 |
commit | ca406576e5d17d88540d65f62a4393b8f5fe5d8e (patch) | |
tree | 14ae4862a70d9aa3e0fc5cebe6c7a743ce4249e8 /gcc/tree-loop-distribution.c | |
parent | 92d649c492db02b2fa470a1762503120661d0431 (diff) | |
download | gcc-ca406576e5d17d88540d65f62a4393b8f5fe5d8e.zip gcc-ca406576e5d17d88540d65f62a4393b8f5fe5d8e.tar.gz gcc-ca406576e5d17d88540d65f62a4393b8f5fe5d8e.tar.bz2 |
re PR tree-optimization/58554 (Revision 202619 causes runtime failure in CPU2006 benchmark 445.gobmk)
2013-09-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/58554
* tree-loop-distribution.c (classify_partition): Require unconditionally
executed stores for memcpy and memset recognition.
(tree_loop_distribution): Calculate dominance info.
* gcc.dg/torture/pr58554.c: New testcase.
From-SVN: r203031
Diffstat (limited to 'gcc/tree-loop-distribution.c')
-rw-r--r-- | gcc/tree-loop-distribution.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index b7cafea..964131a 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -1206,7 +1206,9 @@ classify_partition (loop_p loop, struct graph *rdg, partition_t partition) && !SSA_NAME_IS_DEFAULT_DEF (rhs) && flow_bb_inside_loop_p (loop, gimple_bb (SSA_NAME_DEF_STMT (rhs)))) return; - if (!adjacent_dr_p (single_store)) + if (!adjacent_dr_p (single_store) + || !dominated_by_p (CDI_DOMINATORS, + loop->latch, gimple_bb (stmt))) return; partition->kind = PKIND_MEMSET; partition->main_dr = single_store; @@ -1222,7 +1224,9 @@ classify_partition (loop_p loop, struct graph *rdg, partition_t partition) if (!adjacent_dr_p (single_store) || !adjacent_dr_p (single_load) || !operand_equal_p (DR_STEP (single_store), - DR_STEP (single_load), 0)) + DR_STEP (single_load), 0) + || !dominated_by_p (CDI_DOMINATORS, + loop->latch, gimple_bb (store))) return; /* Now check that if there is a dependence this dependence is of a suitable form for memmove. */ @@ -1719,6 +1723,7 @@ out: { if (!cd) { + calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_POST_DOMINATORS); cd = new control_dependences (create_edge_list ()); free_dominance_info (CDI_POST_DOMINATORS); |