Commit 02d635a2 by Jan Hubicka Committed by Jan Hubicka

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
parent 153a3027
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
......
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
......
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;
......
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