mirror of git://gcc.gnu.org/git/gcc.git
re PR tree-optimization/44485 (ICE in get_expr_operands, at tree-ssa-operands.c:1020)
PR tree-optimize/44485 * tree-cfgcleanup.c (fixup_noreturn_call): Remove basic blocks containing use of return value of noreturn function. * gcc.c-torture/compile/pc44485.c: New testcase. From-SVN: r160659
This commit is contained in:
parent
153a30276e
commit
02d635a2f8
|
@ -1,3 +1,9 @@
|
|||
2010-06-12 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
PR tree-optimize/44485
|
||||
* tree-cfgcleanup.c (fixup_noreturn_call): Remove basic blocks containing
|
||||
use of return value of noreturn function.
|
||||
|
||||
2010-06-12 Anatoly Sokolov <aesok@post.ru>
|
||||
|
||||
* targhooks.c (default_function_value): Don't use
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2010-06-12 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* gcc.c-torture/compile/pc44485.c: New testcase.
|
||||
|
||||
2010-06-12 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/40117
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
static int
|
||||
foo (int si1, int si2)
|
||||
{
|
||||
return si1 > 0 && si2 > 0 && si1 > -si2 || si1 < 0 && si2 < 0
|
||||
&& si1 < -si2 ? : si1 + si2;
|
||||
}
|
||||
|
||||
struct S0
|
||||
{
|
||||
unsigned short f1;
|
||||
};
|
||||
int g_4;
|
||||
struct S0 g_54 = {
|
||||
3428
|
||||
};
|
||||
|
||||
int
|
||||
func_21 (int * p_22, int * const int32p_24, unsigned p_25,
|
||||
const int * p_26);
|
||||
|
||||
void int324 (unsigned p_15, int * p_16, int * p_17, int * p_18)
|
||||
{
|
||||
if (foo (g_4, func_21 (p_18, &g_4, 0, 0)))
|
||||
{
|
||||
for (g_54.f1; g_54.f1; g_54.f1 += 1)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
func_21 (int * p_22, int * const int32p_24, unsigned p_25,
|
||||
const int * p_26)
|
||||
{
|
||||
for (0; 1; p_25 += 1)
|
||||
lbl_29:if (p_25)
|
||||
goto lbl_28;
|
||||
lbl_28:for (p_25 = 0; p_25 < 9; p_25 += 1)
|
||||
if (p_25)
|
||||
goto lbl_29;
|
||||
unsigned short l_53;
|
||||
for (0; l_53; l_53 = foo)
|
||||
{
|
||||
}
|
||||
return 0;
|
||||
}
|
|
@ -559,18 +559,34 @@ fixup_noreturn_call (gimple stmt)
|
|||
{
|
||||
tree op = gimple_call_lhs (stmt);
|
||||
gimple_call_set_lhs (stmt, NULL_TREE);
|
||||
|
||||
/* We need to remove SSA name to avoid checking.
|
||||
All uses are dominated by the noreturn and thus will
|
||||
be removed afterwards. */
|
||||
be removed afterwards.
|
||||
We proactively remove affected non-PHI statements to avoid
|
||||
fixup_cfg from trying to update them and crashing. */
|
||||
if (TREE_CODE (op) == SSA_NAME)
|
||||
{
|
||||
use_operand_p use_p;
|
||||
imm_use_iterator iter;
|
||||
gimple use_stmt;
|
||||
bitmap_iterator bi;
|
||||
unsigned int bb_index;
|
||||
|
||||
bitmap blocks = BITMAP_ALLOC (NULL);
|
||||
|
||||
FOR_EACH_IMM_USE_STMT (use_stmt, iter, op)
|
||||
FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
|
||||
SET_USE (use_p, error_mark_node);
|
||||
{
|
||||
if (gimple_code (use_stmt) != GIMPLE_PHI)
|
||||
bitmap_set_bit (blocks, gimple_bb (use_stmt)->index);
|
||||
else
|
||||
FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
|
||||
SET_USE (use_p, error_mark_node);
|
||||
}
|
||||
EXECUTE_IF_SET_IN_BITMAP (blocks, 0, bb_index, bi)
|
||||
delete_basic_block (BASIC_BLOCK (bb_index));
|
||||
BITMAP_FREE (blocks);
|
||||
release_ssa_name (op);
|
||||
}
|
||||
update_stmt (stmt);
|
||||
changed = true;
|
||||
|
|
Loading…
Reference in New Issue