On 25/03/2020 07:21, Jakub Jelinek via Gcc-patches wrote:
> Hi!
> 
> The following testcase ICEs, because arm_gen_discompare_reg creates invalid
> RTL which then propagates into DEBUG_INSNs and ICEs while handling them.
> The problem is that this function emits
> (insn 18 17 19 2 (set (reg:CC_DNE 100 cc)
>         (compare (ior:SI (ne:SI (subreg:SI (reg:DI 129) 0)
>                     (subreg:SI (reg:DI 114 [ _2 ]) 0))
>                 (ne:SI (subreg:SI (reg:DI 129) 4)
>                     (subreg:SI (reg:DI 114 [ _2 ]) 4)))
>             (const_int 0 [0]))) "pr94292.c":7:11 325 {*cmp_ior}
>      (nil))
> and the invalid thing is that the COMPARE has VOIDmode.  Setting a
> non-VOIDmode SET_DEST to VOIDmode SET_SRC is only valid if the SET_SRC is
> CONST_INT/CONST_DOUBLE.
> The following patch fixes it by giving the COMPARE the same mode as it gives
> to the SET_DEST cc register.

Ooops!

> 
> Bootstrapped/regtested on armv7hl-linux-gnueabi, ok for trunk?
> 
> 2020-03-25  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR target/94292
>       * config/arm/arm.c (arm_gen_discompare_reg): Set mode of COMPARE to
>       mode rather than VOIDmode.
> 

It's arm_gen_dicompare_reg (no 's').  Similarly in the summary line and
elsewhere in the description.

>       * gcc.dg/pr94292.c: New test.

Otherwise, OK.

R.

> 
> --- gcc/config/arm/arm.c.jj   2020-03-18 19:25:33.000000000 +0100
> +++ gcc/config/arm/arm.c      2020-03-24 13:14:38.568689174 +0100
> @@ -15763,7 +15763,7 @@ arm_gen_dicompare_reg (rtx_code code, rt
>       cc_reg = gen_rtx_REG (mode, CC_REGNUM);
>  
>       emit_insn (gen_rtx_SET (cc_reg,
> -                             gen_rtx_COMPARE (VOIDmode, conjunction,
> +                             gen_rtx_COMPARE (mode, conjunction,
>                                                const0_rtx)));
>       return cc_reg;
>        }
> --- gcc/testsuite/gcc.dg/pr94292.c.jj 2020-03-24 13:07:12.694449518 +0100
> +++ gcc/testsuite/gcc.dg/pr94292.c    2020-03-24 13:06:53.720737198 +0100
> @@ -0,0 +1,13 @@
> +/* PR target/94292 */
> +/* { dg-do compile } */
> +/* { dg-options "-O1 -g -fno-tree-dce" } */
> +
> +unsigned short a;
> +unsigned long long b;
> +
> +long long
> +foo (int d)
> +{
> +  d >>= a != (unsigned long long) -a;
> +  return a + b;
> +}
> 
>       Jakub
> 

Reply via email to