Commit ae762b31 by Sebastian Pop Committed by Jeff Law

re PR middle-end/65048 (ICE in add_phi_args_after_copy_edge, at tree-cfg.c)

	PR tree-optimization/65048
	* tree-ssa-threadupdate.c (valid_jump_thread_path): New.
	(thread_through_all_blocks): Call valid_jump_thread_path.
	Remove invalid FSM jump-thread paths.

	PR tree-optimization/65048
	* gcc.dg/tree-ssa/ssa-dom-thread-9.c: New.

From-SVN: r221007
parent db847fa8
2015-02-26 Sebastian Pop <s.pop@samsung.com>
PR tree-optimization/65048
* tree-ssa-threadupdate.c (valid_jump_thread_path): New.
(thread_through_all_blocks): Call valid_jump_thread_path.
Remove invalid FSM jump-thread paths.
2015-02-26 Jakub Jelinek <jakub@redhat.com> 2015-02-26 Jakub Jelinek <jakub@redhat.com>
* passes.c (ipa_write_summaries_1): Call lto_output_init_mode_table. * passes.c (ipa_write_summaries_1): Call lto_output_init_mode_table.
......
2015-02-26 Sebastian Pop <s.pop@samsung.com>
PR tree-optimization/65048
* gcc.dg/tree-ssa/ssa-dom-thread-9.c: New.
2015-02-26 Uros Bizjak <ubizjak@gmail.com> 2015-02-26 Uros Bizjak <ubizjak@gmail.com>
* lib/gcc-dg.exp (cleanup-final-insns-dump): New procedure. * lib/gcc-dg.exp (cleanup-final-insns-dump): New procedure.
......
/* PR 65048 */
/* { dg-do compile } */
/* { dg-options "-O3" } */
int a, b, c, d;
void fn (void);
int
foo (x)
{
switch (x)
{
case 'A':
return 'T';
case 'U':
return 'A';
}
}
void
bar (int x, int y)
{
switch (c)
{
case 'U':
switch (x)
{
default:
fn ();
case 'G':
switch (y)
{
case 'A':
d = 7;
}
}
}
}
void
baz (void)
{
while (1)
{
a = foo ();
b = foo ();
bar (a, b);
}
}
...@@ -2473,6 +2473,21 @@ duplicate_seme_region (edge entry, edge exit, ...@@ -2473,6 +2473,21 @@ duplicate_seme_region (edge entry, edge exit,
return true; return true;
} }
/* Return true when PATH is a valid jump-thread path. */
static bool
valid_jump_thread_path (vec<jump_thread_edge *> *path)
{
unsigned len = path->length ();
/* Check that the path is connected. */
for (unsigned int j = 0; j < len - 1; j++)
if ((*path)[j]->e->dest != (*path)[j+1]->e->src)
return false;
return true;
}
/* Walk through all blocks and thread incoming edges to the appropriate /* Walk through all blocks and thread incoming edges to the appropriate
outgoing edge for each edge pair recorded in THREADED_EDGES. outgoing edge for each edge pair recorded in THREADED_EDGES.
...@@ -2505,12 +2520,25 @@ thread_through_all_blocks (bool may_peel_loop_headers) ...@@ -2505,12 +2520,25 @@ thread_through_all_blocks (bool may_peel_loop_headers)
vec<jump_thread_edge *> *path = paths[i]; vec<jump_thread_edge *> *path = paths[i];
edge entry = (*path)[0]->e; edge entry = (*path)[0]->e;
if ((*path)[0]->type != EDGE_FSM_THREAD /* Only code-generate FSM jump-threads in this loop. */
/* Do not jump-thread twice from the same block. */ if ((*path)[0]->type != EDGE_FSM_THREAD)
|| bitmap_bit_p (threaded_blocks, entry->src->index)) { {
i++; i++;
continue; continue;
} }
/* Do not jump-thread twice from the same block. */
if (bitmap_bit_p (threaded_blocks, entry->src->index)
/* Verify that the jump thread path is still valid: a
previous jump-thread may have changed the CFG, and
invalidated the current path. */
|| !valid_jump_thread_path (path))
{
/* Remove invalid FSM jump-thread paths. */
delete_jump_thread_path (path);
paths.unordered_remove (i);
continue;
}
unsigned len = path->length (); unsigned len = path->length ();
edge exit = (*path)[len - 1]->e; edge exit = (*path)[len - 1]->e;
......
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