On Fri, 21 Jan 2022, Jakub Jelinek wrote:

> Hi!
> 
> cond traps can be created during ce3 after reload (and e.g. PR103028
> recently fixed some ce3 cond trap related bug, so I think often that
> works fine and we shouldn't disable cond traps after RA altogether),
> but it calls prepare_cmp_insn.  This function can fail, so I don't
> see why we couldn't make it work after RA (in most cases it already
> just works).  The first hunk is just an optimization which doesn't
> make sense after RA, so I've guarded it with can_create_pseudo_p.
> The second hunk is just a theoretical case, I don't have a testcase for it.
> prepare_cmp_insn has some other spots that can create pseudos, like when
> both operands have VOIDmode, or when it is BLKmode comparison, or
> not OPTAB_DIRECT, but I think none of that applies to ce3, we punt on
> BLKmode earlier, use OPTAB_DIRECT and shouldn't be comparing two
> VOIDmode CONST_INTs.
> 
> Bootstrapped/regtested on x86_64-linux, i686-linux and powerpc64le-linux,
> ok for trunk?

OK.

Richard.

> 2022-01-21  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR rtl-optimization/102478
>       * optabs.cc (prepare_cmp_insn): If !can_create_pseudo_p (), don't
>       force_reg constants and for -fnon-call-exceptions fail if copy_to_reg
>       would be needed.
> 
>       * gcc.dg/pr102478.c: New test.
> 
> --- gcc/optabs.cc.jj  2022-01-20 11:30:45.586578023 +0100
> +++ gcc/optabs.cc     2022-01-20 16:54:35.439409550 +0100
> @@ -4398,12 +4398,14 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx
>    /* If we are optimizing, force expensive constants into a register.  */
>    if (CONSTANT_P (x) && optimize
>        && (rtx_cost (x, mode, COMPARE, 0, optimize_insn_for_speed_p ())
> -          > COSTS_N_INSNS (1)))
> +          > COSTS_N_INSNS (1))
> +      && can_create_pseudo_p ())
>      x = force_reg (mode, x);
>  
>    if (CONSTANT_P (y) && optimize
>        && (rtx_cost (y, mode, COMPARE, 1, optimize_insn_for_speed_p ())
> -          > COSTS_N_INSNS (1)))
> +          > COSTS_N_INSNS (1))
> +      && can_create_pseudo_p ())
>      y = force_reg (mode, y);
>  
>    /* Don't let both operands fail to indicate the mode.  */
> @@ -4472,6 +4474,8 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx
>       compare and branch in different basic blocks.  */
>    if (cfun->can_throw_non_call_exceptions)
>      {
> +      if (!can_create_pseudo_p () && (may_trap_p (x) || may_trap_p (y)))
> +     goto fail;
>        if (may_trap_p (x))
>       x = copy_to_reg (x);
>        if (may_trap_p (y))
> --- gcc/testsuite/gcc.dg/pr102478.c.jj        2022-01-20 17:00:52.220192056 
> +0100
> +++ gcc/testsuite/gcc.dg/pr102478.c   2022-01-20 17:00:30.917487026 +0100
> @@ -0,0 +1,29 @@
> +/* PR rtl-optimization/102478 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fno-if-conversion -Wno-div-by-zero" } */
> +
> +unsigned a, b, c;
> +
> +void
> +foo (void)
> +{
> +  c |= __builtin_expect (65535 / a, 0) && 0 / 0;
> +  b = 0;
> +}
> +
> +void
> +bar (void)
> +{
> +  if (a <= 65535)
> +    __builtin_trap ();
> +  b = 0;
> +}
> +
> +void
> +baz (void)
> +{
> +  if (a > 65535)
> +    b = 0;
> +  else
> +    __builtin_trap ();
> +}
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)

Reply via email to