aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-03-25 19:06:45 +0100
committerJakub Jelinek <jakub@redhat.com>2020-03-25 19:06:45 +0100
commit6e4cd3cd259af2b5e04986a3f2222528a4f9f762 (patch)
treeafd4ccab92b1baa6322728fc5eecf170fadde9fc /gcc
parentb5228b1bc8cb81be494f5b5faa68b6b859ce0227 (diff)
downloadgcc-6e4cd3cd259af2b5e04986a3f2222528a4f9f762.zip
gcc-6e4cd3cd259af2b5e04986a3f2222528a4f9f762.tar.gz
gcc-6e4cd3cd259af2b5e04986a3f2222528a4f9f762.tar.bz2
arm: Fix ICE caused by arm_gen_dicompare_reg [PR94292]
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/arm/arm.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr94292.c13
4 files changed, 25 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f9ba751..06b06ab 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 9b79908..d5207e0 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -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;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 855edb6..fe8460c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..dd2a29c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr94292.c
@@ -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;
+}