diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-03-25 19:06:45 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-03-25 19:06:45 +0100 |
commit | 6e4cd3cd259af2b5e04986a3f2222528a4f9f762 (patch) | |
tree | afd4ccab92b1baa6322728fc5eecf170fadde9fc /gcc | |
parent | b5228b1bc8cb81be494f5b5faa68b6b859ce0227 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr94292.c | 13 |
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; +} |