On Wed, 21 Apr 2021, Jakub Jelinek wrote:

> Hi!
> 
> The following testcase shows different behavior between -g and -g0
> in constprop_register, if a flags register setter is separated
> from a conditional jump using those flags with -g by a DEBUG_INSN.
> As it uses just NEXT_INSN, for -g it will look at the DEBUG_INSN which is
> not a conditional jump, while otherwise it would look at the conditional
> jump and call cprop_jump.
> 
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
> ok for trunk/11.2/10.4?

OK.

Thanks,
Richard.

> 2021-04-20  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR rtl-optimization/100148
>       * cprop.c (constprop_register): Use next_nondebug_insn instead of
>       NEXT_INSN.
> 
>       * g++.dg/opt/pr100148.C: New test.
> 
> --- gcc/cprop.c.jj    2021-01-04 10:25:39.000000000 +0100
> +++ gcc/cprop.c       2021-04-20 13:48:28.691450016 +0200
> @@ -1007,16 +1007,18 @@ static int
>  constprop_register (rtx from, rtx src, rtx_insn *insn)
>  {
>    rtx sset;
> +  rtx_insn *next_insn;
>  
>    /* Check for reg or cc0 setting instructions followed by
>       conditional branch instructions first.  */
>    if ((sset = single_set (insn)) != NULL
> -      && NEXT_INSN (insn)
> -      && any_condjump_p (NEXT_INSN (insn)) && onlyjump_p (NEXT_INSN (insn)))
> +      && (next_insn = next_nondebug_insn (insn)) != NULL
> +      && any_condjump_p (next_insn)
> +      && onlyjump_p (next_insn))
>      {
>        rtx dest = SET_DEST (sset);
>        if ((REG_P (dest) || CC0_P (dest))
> -       && cprop_jump (BLOCK_FOR_INSN (insn), insn, NEXT_INSN (insn),
> +       && cprop_jump (BLOCK_FOR_INSN (insn), insn, next_insn,
>                        from, src))
>       return 1;
>      }
> --- gcc/testsuite/g++.dg/opt/pr100148.C.jj    2021-04-20 15:32:31.820489909 
> +0200
> +++ gcc/testsuite/g++.dg/opt/pr100148.C       2021-04-20 15:32:06.376770658 
> +0200
> @@ -0,0 +1,27 @@
> +// PR rtl-optimization/100148
> +// { dg-do compile }
> +// { dg-options "-O2 -fno-dce -fno-tree-dce -fno-tree-dominator-opts 
> -fno-tree-sink -fcompare-debug" }
> +
> +int i;
> +enum E { } e, ee;
> +
> +bool
> +baz (int)
> +{
> +  return ee;
> +}
> +
> +bool bar ();
> +bool a, b;
> +
> +void
> +foo ()
> +{
> +  switch (ee)
> +    {
> +    case 0:
> +      e = E (a ? : i);
> +    case 1:
> +      !(b || baz (0) && bar ());
> +    }
> +}
> 
>       Jakub
> 
> 

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

Reply via email to