diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7eac0959fa0..e800af187578 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2015-03-12 Richard Biener + + * tree-cfg.c (gimple_split_block): Remove loop finding stmt + to split on. + * omp-low.c (expand_omp_taskreg): Split block before removing + the stmt. + (expand_omp_target): Likewise. + * ubsan.c (ubsan_expand_null_ifn): Adjust stmt if we replaced it. + * tree-parloops.c (create_call_for_reduction_1): Pass a proper + stmt to split_block. + 2015-03-12 Tom de Vries PR rtl-optimization/64895 diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 75d6707f1987..2d64a74e3eaf 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -5514,8 +5514,8 @@ expand_omp_taskreg (struct omp_region *region) stmt = gsi_stmt (gsi); gcc_assert (stmt && (gimple_code (stmt) == GIMPLE_OMP_PARALLEL || gimple_code (stmt) == GIMPLE_OMP_TASK)); - gsi_remove (&gsi, true); e = split_block (entry_bb, stmt); + gsi_remove (&gsi, true); entry_bb = e->dest; single_succ_edge (entry_bb)->flags = EDGE_FALLTHRU; @@ -8889,8 +8889,8 @@ expand_omp_target (struct omp_region *region) stmt = gsi_stmt (gsi); gcc_assert (stmt && gimple_code (stmt) == gimple_code (entry_stmt)); - gsi_remove (&gsi, true); e = split_block (entry_bb, stmt); + gsi_remove (&gsi, true); entry_bb = e->dest; single_succ_edge (entry_bb)->flags = EDGE_FALLTHRU; diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 006bc08bbcac..e1bc14351baf 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -5683,7 +5683,6 @@ gimple_split_block (basic_block bb, void *stmt) { gimple_stmt_iterator gsi; gimple_stmt_iterator gsi_tgt; - gimple act; gimple_seq list; basic_block new_bb; edge e; @@ -5697,26 +5696,16 @@ gimple_split_block (basic_block bb, void *stmt) FOR_EACH_EDGE (e, ei, new_bb->succs) e->src = new_bb; - if (stmt && gimple_code ((gimple) stmt) == GIMPLE_LABEL) - stmt = NULL; - - /* Move everything from GSI to the new basic block. */ - for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + /* Get a stmt iterator pointing to the first stmt to move. */ + if (!stmt || gimple_code ((gimple) stmt) == GIMPLE_LABEL) + gsi = gsi_after_labels (bb); + else { - act = gsi_stmt (gsi); - if (gimple_code (act) == GIMPLE_LABEL) - continue; - - if (!stmt) - break; - - if (stmt == act) - { - gsi_next (&gsi); - break; - } + gsi = gsi_for_stmt ((gimple) stmt); + gsi_next (&gsi); } - + + /* Move everything from GSI to the new basic block. */ if (gsi_end_p (gsi)) return new_bb; diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c index 5f7c1bc360ab..fbb9eebddcf2 100644 --- a/gcc/tree-parloops.c +++ b/gcc/tree-parloops.c @@ -1111,7 +1111,8 @@ create_call_for_reduction_1 (reduction_info **slot, struct clsn_data *clsn_data) /* Create phi node. */ bb = clsn_data->load_bb; - e = split_block (bb, t); + gsi = gsi_last_bb (bb); + e = split_block (bb, gsi_stmt (gsi)); new_bb = e->dest; tmp_load = create_tmp_var (TREE_TYPE (TREE_TYPE (addr))); diff --git a/gcc/ubsan.c b/gcc/ubsan.c index 98edfe03a25c..0e23d919744d 100644 --- a/gcc/ubsan.c +++ b/gcc/ubsan.c @@ -864,6 +864,7 @@ ubsan_expand_null_ifn (gimple_stmt_iterator *gsip) /* Replace the UBSAN_NULL with a GIMPLE_COND stmt. */ gsi_replace (&gsi, g, false); + stmt = g; } if (check_align)