On Wed, Oct 1, 2014 at 8:57 PM, Vladimir Makarov <vmaka...@redhat.com> wrote:

> The problem is in code introduced by Bernd in IRA and caller-saves.c in
> 2012.  It is basically an optimization for functions returning always the
> same result as one argument (e.g. memcpy returning 1st argument).
>
> There are two possible solutions.  First one is to prohibit the
> optimizations when there is a parallel in SET.  Second one is to go deeper
> if the call result is guaranteed in the first element which is true for the
> patch.

I suspect that the first solution will regress
gcc.target/i386/retarg.c on i686 - that testcase test if referred
optimization is effective. All things equal, I think we should go with
the second solution.

> For the first solution, the patch would be
>
> Index: lra-constraints.c
> ===================================================================
> --- lra-constraints.c   (revision 215748)
> +++ lra-constraints.c   (working copy)
> @@ -5348,16 +5348,19 @@
>                   if (GET_CODE (pat) == PARALLEL)
>                     pat = XVECEXP (pat, 0, 0);
>                   dest = SET_DEST (pat);
> -                 start_sequence ();
> -                 emit_move_insn (cheap, copy_rtx (dest));
> -                 restore = get_insns ();
> -                 end_sequence ();
> -                 lra_process_new_insns (curr_insn, NULL, restore,
> -                                        "Inserting call parameter
> restore");
> -                 /* We don't need to save/restore of the pseudo from
> -                    this call.  */
> -                 usage_insns[regno].calls_num = calls_num;
> -                 bitmap_set_bit (&check_only_regs, regno);
> +                 if (REG_P (dest))
> +                   {
> +                     start_sequence ();
> +                     emit_move_insn (cheap, copy_rtx (dest));
> +                     restore = get_insns ();
> +                     end_sequence ();
> +                     lra_process_new_insns (curr_insn, NULL, restore,
> +                                            "Inserting call parameter
> restore");
> +                     /* We don't need to save/restore of the pseudo
> +                        from this call.  */
> +                     usage_insns[regno].calls_num = calls_num;
> +                     bitmap_set_bit (&check_only_regs, regno);
> +                   }
>                 }
>             }
>           to_inherit_num = 0;
>
>
> For the second solution, the patch is
>
>
> Index: lra-constraints.c
> ===================================================================
> --- lra-constraints.c   (revision 215748)
> +++ lra-constraints.c   (working copy)
> @@ -5348,16 +5348,25 @@
>                   if (GET_CODE (pat) == PARALLEL)
>                     pat = XVECEXP (pat, 0, 0);
>                   dest = SET_DEST (pat);
> -                 start_sequence ();
> -                 emit_move_insn (cheap, copy_rtx (dest));
> -                 restore = get_insns ();
> -                 end_sequence ();
> -                 lra_process_new_insns (curr_insn, NULL, restore,
> -                                        "Inserting call parameter
> restore");
> -                 /* We don't need to save/restore of the pseudo from
> -                    this call.  */
> -                 usage_insns[regno].calls_num = calls_num;
> -                 bitmap_set_bit (&check_only_regs, regno);
> +                 if (GET_CODE (dest) == PARALLEL)
> +                   {
> +                     dest = XVECEXP (dest, 0, 0);
> +                     if (GET_CODE (dest) == EXPR_LIST)
> +                       dest = XEXP (dest, 0);
> +                   }
> +                 if (REG_P (dest))
> +                   {
> +                     start_sequence ();
> +                     emit_move_insn (cheap, copy_rtx (dest));
> +                     restore = get_insns ();
> +                     end_sequence ();
> +                     lra_process_new_insns (curr_insn, NULL, restore,
> +                                            "Inserting call parameter
> restore");
> +                     /* We don't need to save/restore of the pseudo from
> +                        this call.      */
> +                     usage_insns[regno].calls_num = calls_num;
> +                     bitmap_set_bit (&check_only_regs, regno);
> +                   }
>                 }
>             }
>
>
> The first patch is safer but the second one is ok too.  I have no particular
> preferences.  Whatever we choose, analogous code in caller-saves.c should be
> changed too.

Uros.

Reply via email to