[PATCH] Fix PR58554
Richard Biener
rguenther@suse.de
Mon Sep 30 13:07:00 GMT 2013
This fixes PR58554, pattern recognition in loop distribution now
needs to check whether all stmts are unconditionally executed.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard.
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.
Index: gcc/tree-loop-distribution.c
===================================================================
*** gcc/tree-loop-distribution.c (revision 203028)
--- gcc/tree-loop-distribution.c (working copy)
*************** classify_partition (loop_p loop, struct
*** 1206,1212 ****
&& !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))
return;
partition->kind = PKIND_MEMSET;
partition->main_dr = single_store;
--- 1206,1214 ----
&& !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)
! || !dominated_by_p (CDI_DOMINATORS,
! loop->latch, gimple_bb (stmt)))
return;
partition->kind = PKIND_MEMSET;
partition->main_dr = single_store;
*************** classify_partition (loop_p loop, struct
*** 1222,1228 ****
if (!adjacent_dr_p (single_store)
|| !adjacent_dr_p (single_load)
|| !operand_equal_p (DR_STEP (single_store),
! DR_STEP (single_load), 0))
return;
/* Now check that if there is a dependence this dependence is
of a suitable form for memmove. */
--- 1224,1232 ----
if (!adjacent_dr_p (single_store)
|| !adjacent_dr_p (single_load)
|| !operand_equal_p (DR_STEP (single_store),
! 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. */
*************** out:
*** 1719,1724 ****
--- 1723,1729 ----
{
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);
Index: gcc/testsuite/gcc.dg/torture/pr58554.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr58554.c (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr58554.c (working copy)
***************
*** 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;
+ }
More information about the Gcc-patches
mailing list