arm: Fix ICE caused by arm_gen_dicompare_reg [PR94292]
authorJakub Jelinek <jakub@redhat.com>
Wed, 25 Mar 2020 18:06:45 +0000 (19:06 +0100)
committerJakub Jelinek <jakub@redhat.com>
Wed, 25 Mar 2020 18:06:45 +0000 (19:06 +0100)
The following testcase ICEs, because arm_gen_dicompare_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.

2020-03-25  Jakub Jelinek  <jakub@redhat.com>

PR target/94292
* config/arm/arm.c (arm_gen_dicompare_reg): Set mode of COMPARE to
mode rather than VOIDmode.

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

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr94292.c [new file with mode: 0644]

index f9ba7519f1251db638f4630c607b188d1393277b..06b06ab68de79bbc4ef9e2df3141661186f239c2 100644 (file)
@@ -1,3 +1,9 @@
+2020-03-25  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/94292
+       * config/arm/arm.c (arm_gen_dicompare_reg): Set mode of COMPARE to
+       mode rather than VOIDmode.
+
 2020-03-25  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/94004
index 9b799084d440dc548ba0fe0d6ee9ab7351d7f846..d5207e0d8f07f9be5265fc6d175c148c6cdd53cb 100644 (file)
@@ -15763,7 +15763,7 @@ arm_gen_dicompare_reg (rtx_code code, rtx x, rtx y, rtx scratch)
        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;
       }
index 855edb686fbc6c0487abae80129363fd186a647a..fe8460c76647eafd094f77a19346ed61ad70d8a4 100644 (file)
@@ -1,3 +1,8 @@
+2020-03-25  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/94292
+       * gcc.dg/pr94292.c: New test.
+
 2020-03-25  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/94004
diff --git a/gcc/testsuite/gcc.dg/pr94292.c b/gcc/testsuite/gcc.dg/pr94292.c
new file mode 100644 (file)
index 0000000..dd2a29c
--- /dev/null
@@ -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;
+}