This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR44393
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 26 Jun 2010 17:51:27 +0200 (CEST)
- Subject: [PATCH] Fix PR44393
Quite some brokeness in loop distribution. This tries to fixup
what I noticed and it happens to fix the PR.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard.
2010-06-26 Richard Guenther <rguenther@suse.de>
PR tree-optimization/44393
* tree-loop-distribution.c (generate_loops_for_partition): Fix
stmt removal and VOP renaming.
(generate_memset_zero): Remove redundant stmt updating.
* tree-flow.h (mark_virtual_ops_in_bb): Remove.
* tree-cfg.c (mark_virtual_ops_in_bb): Likewise.
* gcc.dg/pr44393.c: New testcase.
Index: gcc/tree-loop-distribution.c
===================================================================
*** gcc/tree-loop-distribution.c (revision 161430)
--- gcc/tree-loop-distribution.c (working copy)
*************** generate_loops_for_partition (struct loo
*** 195,212 ****
for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi);)
if (!bitmap_bit_p (partition, x++))
! remove_phi_node (&bsi, true);
else
gsi_next (&bsi);
for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi);)
! if (gimple_code (gsi_stmt (bsi)) != GIMPLE_LABEL
! && !bitmap_bit_p (partition, x++))
! gsi_remove (&bsi, false);
! else
! gsi_next (&bsi);
!
! mark_virtual_ops_in_bb (bb);
}
free (bbs);
--- 195,222 ----
for (bsi = gsi_start_phis (bb); !gsi_end_p (bsi);)
if (!bitmap_bit_p (partition, x++))
! {
! gimple phi = gsi_stmt (bsi);
! if (!is_gimple_reg (gimple_phi_result (phi)))
! mark_virtual_phi_result_for_renaming (phi);
! remove_phi_node (&bsi, true);
! }
else
gsi_next (&bsi);
for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi);)
! {
! gimple stmt = gsi_stmt (bsi);
! if (gimple_code (gsi_stmt (bsi)) != GIMPLE_LABEL
! && !bitmap_bit_p (partition, x++))
! {
! unlink_stmt_vdef (stmt);
! gsi_remove (&bsi, true);
! release_defs (stmt);
! }
! else
! gsi_next (&bsi);
! }
}
free (bbs);
*************** generate_memset_zero (gimple stmt, tree
*** 240,246 ****
gimple_seq stmt_list = NULL, stmts;
gimple fn_call;
tree mem, fn;
- gimple_stmt_iterator i;
struct data_reference *dr = XCNEW (struct data_reference);
location_t loc = gimple_location (stmt);
--- 250,255 ----
*************** generate_memset_zero (gimple stmt, tree
*** 291,303 ****
fn = build_fold_addr_expr (implicit_built_in_decls [BUILT_IN_MEMSET]);
fn_call = gimple_build_call (fn, 3, mem, integer_zero_node, nb_bytes);
gimple_seq_add_stmt (&stmt_list, fn_call);
-
- for (i = gsi_start (stmt_list); !gsi_end_p (i); gsi_next (&i))
- {
- gimple s = gsi_stmt (i);
- update_stmt_if_modified (s);
- }
-
gsi_insert_seq_after (&bsi, stmt_list, GSI_CONTINUE_LINKING);
res = true;
--- 300,305 ----
Index: gcc/tree-flow.h
===================================================================
*** gcc/tree-flow.h (revision 161430)
--- gcc/tree-flow.h (working copy)
*************** extern void end_recording_case_labels (v
*** 486,492 ****
extern basic_block move_sese_region_to_fn (struct function *, basic_block,
basic_block, tree);
void remove_edge_and_dominated_blocks (edge);
- void mark_virtual_ops_in_bb (basic_block);
bool tree_node_can_be_shared (tree);
/* In tree-cfgcleanup.c */
--- 486,491 ----
Index: gcc/tree-cfg.c
===================================================================
*** gcc/tree-cfg.c (revision 161430)
--- gcc/tree-cfg.c (working copy)
*************** move_stmt_r (gimple_stmt_iterator *gsi_p
*** 5792,5812 ****
return NULL_TREE;
}
- /* Marks virtual operands of all statements in basic blocks BBS for
- renaming. */
-
- void
- mark_virtual_ops_in_bb (basic_block bb)
- {
- gimple_stmt_iterator gsi;
-
- for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
- mark_virtual_ops_for_renaming (gsi_stmt (gsi));
-
- for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
- mark_virtual_ops_for_renaming (gsi_stmt (gsi));
- }
-
/* Move basic block BB from function CFUN to function DEST_FN. The
block is moved out of the original linked list and placed after
block AFTER in the new list. Also, the block is removed from the
--- 5812,5817 ----
Index: gcc/testsuite/gcc.dg/pr44393.c
===================================================================
*** gcc/testsuite/gcc.dg/pr44393.c (revision 0)
--- gcc/testsuite/gcc.dg/pr44393.c (revision 0)
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile } */
+ /* { dg-options "-Os -ftree-loop-distribution" } */
+
+ int i;
+ void foo ()
+ {
+ int **pp = 0, *p = 0;
+ while (--i)
+ {
+ *p++ = 0;
+ *pp++ = p;
+ }
+ i = *p;
+ }
+