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.
+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
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;
}
+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
--- /dev/null
+/* 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;
+}