mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-10 07:10:27 +08:00
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
This commit is contained in:
parent
db847fa8f2
commit
ae762b31c4
@ -1,3 +1,10 @@
|
||||
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>
|
||||
|
||||
* passes.c (ipa_write_summaries_1): Call lto_output_init_mode_table.
|
||||
|
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
* lib/gcc-dg.exp (cleanup-final-insns-dump): New procedure.
|
||||
|
50
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-9.c
Normal file
50
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-9.c
Normal file
@ -0,0 +1,50 @@
|
||||
/* 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,
|
||||
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
|
||||
outgoing edge for each edge pair recorded in THREADED_EDGES.
|
||||
|
||||
@ -2505,12 +2520,25 @@ thread_through_all_blocks (bool may_peel_loop_headers)
|
||||
vec<jump_thread_edge *> *path = paths[i];
|
||||
edge entry = (*path)[0]->e;
|
||||
|
||||
if ((*path)[0]->type != EDGE_FSM_THREAD
|
||||
/* Do not jump-thread twice from the same block. */
|
||||
|| bitmap_bit_p (threaded_blocks, entry->src->index)) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
/* Only code-generate FSM jump-threads in this loop. */
|
||||
if ((*path)[0]->type != EDGE_FSM_THREAD)
|
||||
{
|
||||
i++;
|
||||
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 ();
|
||||
edge exit = (*path)[len - 1]->e;
|
||||
|
Loading…
x
Reference in New Issue
Block a user