From ca406576e5d17d88540d65f62a4393b8f5fe5d8e Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 30 Sep 2013 12:22:00 +0000 Subject: [PATCH] re PR tree-optimization/58554 (Revision 202619 causes runtime failure in CPU2006 benchmark 445.gobmk) 2013-09-30 Richard Biener 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 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr58554.c | 20 ++++++++++++++++++++ gcc/tree-loop-distribution.c | 9 +++++++-- 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr58554.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7c7974845e8..1d4720b014c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2013-09-30 Richard Biener + + 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. + 2013-09-30 Venkataramanan Kumar * config/aarch64/aarch64.h (MCOUNT_NAME): Define. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6d56fa61bfc..75ac73a99de 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-09-30 Richard Biener + + PR tree-optimization/58554 + * gcc.dg/torture/pr58554.c: New testcase. + 2013-09-30 Simon Cook Joern Rennecke diff --git a/gcc/testsuite/gcc.dg/torture/pr58554.c b/gcc/testsuite/gcc.dg/torture/pr58554.c new file mode 100644 index 00000000000..269171ae941 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr58554.c @@ -0,0 +1,20 @@ +/* { dg-do run } */ + +extern void abort (void); +void __attribute__((noinline,noclone)) +clear_board(unsigned char *board, int board_size) +{ + int k; + for (k = 0; k < 421; k++) + if (k < board_size ) + board[k] = 3; +} +int main() +{ + unsigned char board[421]; + board[420] = 1; + clear_board (board, 420); + if (board[420] != 1) + abort (); + return 0; +} diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index b7cafeaa62a..964131a1950 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);