Commit 22718afe by Richard Biener Committed by Richard Biener

re PR tree-optimization/60903 (ICE: in verify_loop_structure, at cfgloop.c:1647:…

re PR tree-optimization/60903 (ICE: in verify_loop_structure, at cfgloop.c:1647: : edge from 13 to 14 should be marked irreducible)

2014-04-23  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/60903
	* tree-ssa-loop-im.c (analyze_memory_references): Remove
	commented code block.
	(execute_sm_if_changed): Properly apply IRREDUCIBLE_LOOP
	loop flags to newly created BBs and edges.

	* gcc.dg/torture/pr60903.c: New testcase.

From-SVN: r209694
parent c07d7c02
2014-04-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/60903
* tree-ssa-loop-im.c (analyze_memory_references): Remove
commented code block.
(execute_sm_if_changed): Properly apply IRREDUCIBLE_LOOP
loop flags to newly created BBs and edges.
2014-04-23 Nick Clifton <nickc@redhat.com>
* config/msp430/msp430.c (msp430_handle_option): Move function
......
2014-04-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/60903
* gcc.dg/torture/pr60903.c: New testcase.
2014-04-23 Richard Biener <rguenther@suse.de>
PR middle-end/60895
* g++.dg/torture/pr60895.C: New testcase.
......
/* { dg-do compile } */
extern int a, b, k, q;
void
foo ()
{
if (a)
{
while (q)
{
lbl:
if (a)
{
a = 0;
goto lbl;
}
}
b = k;
}
goto lbl;
}
......@@ -1544,15 +1544,6 @@ analyze_memory_references (void)
struct loop *loop, *outer;
unsigned i, n;
#if 0
/* Initialize bb_loop_postorder with a mapping from loop->num to
its postorder index. */
i = 0;
bb_loop_postorder = XNEWVEC (unsigned, number_of_loops (cfun));
FOR_EACH_LOOP (loop, LI_FROM_INNERMOST)
bb_loop_postorder[loop->num] = i++;
#endif
/* Collect all basic-blocks in loops and sort them after their
loops postorder. */
i = 0;
......@@ -1807,6 +1798,7 @@ execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag)
gimple_stmt_iterator gsi;
gimple stmt;
struct prev_flag_edges *prev_edges = (struct prev_flag_edges *) ex->aux;
bool irr = ex->flags & EDGE_IRREDUCIBLE_LOOP;
/* ?? Insert store after previous store if applicable. See note
below. */
......@@ -1821,8 +1813,9 @@ execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag)
old_dest = ex->dest;
new_bb = split_edge (ex);
then_bb = create_empty_bb (new_bb);
if (current_loops && new_bb->loop_father)
add_bb_to_loop (then_bb, new_bb->loop_father);
if (irr)
then_bb->flags = BB_IRREDUCIBLE_LOOP;
add_bb_to_loop (then_bb, new_bb->loop_father);
gsi = gsi_start_bb (new_bb);
stmt = gimple_build_cond (NE_EXPR, flag, boolean_false_node,
......@@ -1834,9 +1827,12 @@ execute_sm_if_changed (edge ex, tree mem, tree tmp_var, tree flag)
stmt = gimple_build_assign (unshare_expr (mem), tmp_var);
gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
make_edge (new_bb, then_bb, EDGE_TRUE_VALUE);
make_edge (new_bb, old_dest, EDGE_FALSE_VALUE);
then_old_edge = make_edge (then_bb, old_dest, EDGE_FALLTHRU);
make_edge (new_bb, then_bb,
EDGE_TRUE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0));
make_edge (new_bb, old_dest,
EDGE_FALSE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0));
then_old_edge = make_edge (then_bb, old_dest,
EDGE_FALLTHRU | (irr ? EDGE_IRREDUCIBLE_LOOP : 0));
set_immediate_dominator (CDI_DOMINATORS, then_bb, new_bb);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment