re PR tree-optimization/30984 (ICE with computed goto and constants)

* tree-cfg.c (find_taken_edge): Tighten conditions for
        optimizing computed gotos.

        * PR tree-optimization/30984
        * gcc.c-torture/pr30984.c: New test.

From-SVN: r123067
This commit is contained in:
Jeff Law 2007-03-19 13:52:19 -06:00 committed by Jeff Law
parent 7270dd8e8d
commit 1799efef2c
4 changed files with 29 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2007-03-19 Jeff Law <law@redhat.com>
* tree-cfg.c (find_taken_edge): Tighten conditions for
optimizing computed gotos.
2007-03-19 Michael Matz <matz@suse.de>
* builtins.c (expand_builtin_sync_operation,

View File

@ -1,3 +1,8 @@
2007-03-19 Jeff Law <law@redhat.com>
* PR tree-optimization/30984
* gcc.c-torture/pr30984.c: New test.
2007-03-19 Andrew Pinski <andrew_pinski@playstation.sony.com>
Richard Guenther <rguenther@suse.de>

View File

@ -0,0 +1,7 @@
int fs_exec(int ino)
{
void *src = 0;
if (ino)
src = (void*)0xe000;
goto *src;
}

View File

@ -2039,7 +2039,18 @@ find_taken_edge (basic_block bb, tree val)
return find_taken_edge_switch_expr (bb, val);
if (computed_goto_p (stmt))
return find_taken_edge_computed_goto (bb, TREE_OPERAND( val, 0));
{
/* Only optimize if the argument is a label, if the argument is
not a label then we can not construct a proper CFG.
It may be the case that we only need to allow the LABEL_REF to
appear inside an ADDR_EXPR, but we also allow the LABEL_REF to
appear inside a LABEL_EXPR just to be safe. */
if ((TREE_CODE (val) == ADDR_EXPR || TREE_CODE (val) == LABEL_EXPR)
&& TREE_CODE (TREE_OPERAND (val, 0)) == LABEL_DECL)
return find_taken_edge_computed_goto (bb, TREE_OPERAND (val, 0));
return NULL;
}
gcc_unreachable ();
}