PR middle-end/44485 (error_mark instatement)

Richard Guenther richard.guenther@gmail.com
Sat Jun 12 01:16:00 GMT 2010


On Sat, Jun 12, 2010 at 12:54 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
> Hi,
> after function is found noreturn, we have to remove its return value.  Use of the return
> value remains in the caller function body until next removal of unreachable code.  For this
> reason I added code replacing SSA_NAME with error_mark.
>
> This unfortunately triggers ICE when fixup_cfg decide to update on of the statements (this
> happens when the other statement is also call).
>
> THis patch just modify fixup_noreturn_call to remove those basic blocks proactively.
> It also seems to fix the Ada problem with the same symptom.
>
> Bootstrapped/regtested x86_64-linux, seems to make sense?



> Honza
>
> 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;
> }
>
>        PR middle-end/44485
>        * tree-cfgcleanup.c (fixup_noreturn_call): Remove basic block contianing
>        use of return value of function found to be noreturn.
> Index: tree-cfgcleanup.c
> ===================================================================
> --- tree-cfgcleanup.c   (revision 160614)
> +++ tree-cfgcleanup.c   (working copy)
> @@ -559,18 +559,35 @@ 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.

To avoid checking errors?

>         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_head blocks;
> +         bitmap_initialize (&blocks, &bitmap_default_obstack);

I know you like to replace all bitmaps by bitmap_head, but in this
case please use a bitmap and the usual BITMAP_ALLOC/FREE.

Ok with that change.

Thanks,
Richard.

>           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_clear (&blocks);
> +         release_ssa_name (op);
>        }
>       update_stmt (stmt);
>       changed = true;
>



More information about the Gcc-patches mailing list