From: hubicka Date: Sat, 12 Jun 2010 12:43:02 +0000 (+0000) Subject: PR tree-optimize/44485 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b703d146cddb2a032c7fd57fe58c7ec632e4beff;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@160659 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bfd89e2e70ab..532842e600eb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-06-12 Jan Hubicka + + 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 * targhooks.c (default_function_value): Don't use diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e56ac3af3f05..5041fc569193 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-06-12 Jan Hubicka + + * gcc.c-torture/compile/pc44485.c: New testcase. + 2010-06-12 Janus Weil PR fortran/40117 diff --git a/gcc/testsuite/gcc.c-torture/compile/pc44485.c b/gcc/testsuite/gcc.c-torture/compile/pc44485.c new file mode 100644 index 000000000000..fc959257dd3c --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pc44485.c @@ -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; +} diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index fc2141f48c17..62db25812390 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -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;