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> 2010-06-12 Anatoly Sokolov <aesok@post.ru>
* targhooks.c (default_function_value): Don't use * 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> 2010-06-12 Janus Weil <janus@gcc.gnu.org>
PR fortran/40117 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) ...@@ -559,18 +559,34 @@ fixup_noreturn_call (gimple stmt)
{ {
tree op = gimple_call_lhs (stmt); tree op = gimple_call_lhs (stmt);
gimple_call_set_lhs (stmt, NULL_TREE); gimple_call_set_lhs (stmt, NULL_TREE);
/* We need to remove SSA name to avoid checking. /* We need to remove SSA name to avoid checking.
All uses are dominated by the noreturn and thus will 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) if (TREE_CODE (op) == SSA_NAME)
{ {
use_operand_p use_p; use_operand_p use_p;
imm_use_iterator iter; imm_use_iterator iter;
gimple use_stmt; 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_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); update_stmt (stmt);
changed = true; 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