i386: Fix rtl checking ICE in ix86_elim_entry_set_got [PR112837]
Checks
Commit Message
Hi!
The following testcase ICEs with RTL checking, because it sets if
XINT (SET_SRC (set), 1) is UNSPEC_SET_GOT without checking if SET_SRC (set)
is actually an UNSPEC, so any time we see any other insn with PARALLEL
and a SET in it which is not an UNSPEC we ICE during RTL checking or
access there some other union member as if it was an rt_int.
The rest is just small cleanup.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2023-12-04 Jakub Jelinek <jakub@redhat.com>
PR target/112837
* config/i386/i386.cc (ix86_elim_entry_set_got): Before checking
for UNSPEC_SET_GOT check that SET_SRC is UNSPEC. Use SET_SRC and
SET_DEST macros instead of XEXP, rename vec variable to set.
* gcc.dg/pr112837.c: New test.
Jakub
Comments
On Mon, Dec 4, 2023 at 8:41 AM Jakub Jelinek <jakub@redhat.com> wrote:
>
> Hi!
>
> The following testcase ICEs with RTL checking, because it sets if
> XINT (SET_SRC (set), 1) is UNSPEC_SET_GOT without checking if SET_SRC (set)
> is actually an UNSPEC, so any time we see any other insn with PARALLEL
> and a SET in it which is not an UNSPEC we ICE during RTL checking or
> access there some other union member as if it was an rt_int.
> The rest is just small cleanup.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2023-12-04 Jakub Jelinek <jakub@redhat.com>
>
> PR target/112837
> * config/i386/i386.cc (ix86_elim_entry_set_got): Before checking
> for UNSPEC_SET_GOT check that SET_SRC is UNSPEC. Use SET_SRC and
> SET_DEST macros instead of XEXP, rename vec variable to set.
>
> * gcc.dg/pr112837.c: New test.
OK.
Thanks,
Uros.
>
> --- gcc/config/i386/i386.cc.jj 2023-12-03 17:44:51.837530235 +0100
> +++ gcc/config/i386/i386.cc 2023-12-03 23:20:31.117005983 +0100
> @@ -8607,10 +8607,11 @@ ix86_elim_entry_set_got (rtx reg)
> rtx pat = PATTERN (c_insn);
> if (GET_CODE (pat) == PARALLEL)
> {
> - rtx vec = XVECEXP (pat, 0, 0);
> - if (GET_CODE (vec) == SET
> - && XINT (XEXP (vec, 1), 1) == UNSPEC_SET_GOT
> - && REGNO (XEXP (vec, 0)) == REGNO (reg))
> + rtx set = XVECEXP (pat, 0, 0);
> + if (GET_CODE (set) == SET
> + && GET_CODE (SET_SRC (set)) == UNSPEC
> + && XINT (SET_SRC (set), 1) == UNSPEC_SET_GOT
> + && REGNO (SET_DEST (set)) == REGNO (reg))
> delete_insn (c_insn);
> }
> }
> --- gcc/testsuite/gcc.dg/pr112837.c.jj 2023-12-03 23:25:04.803208457 +0100
> +++ gcc/testsuite/gcc.dg/pr112837.c 2023-12-03 23:25:41.194703497 +0100
> @@ -0,0 +1,11 @@
> +/* PR target/112837 */
> +/* { dg-do compile } */
> +/* { dg-options "-fcompare-elim -fprofile" } */
> +/* { dg-additional-options "-fpie" { target pie } } */
> +/* { dg-require-profiling "-fprofile" } */
> +
> +void
> +foo (int i)
> +{
> + foo (i);
> +}
>
> Jakub
>
@@ -8607,10 +8607,11 @@ ix86_elim_entry_set_got (rtx reg)
rtx pat = PATTERN (c_insn);
if (GET_CODE (pat) == PARALLEL)
{
- rtx vec = XVECEXP (pat, 0, 0);
- if (GET_CODE (vec) == SET
- && XINT (XEXP (vec, 1), 1) == UNSPEC_SET_GOT
- && REGNO (XEXP (vec, 0)) == REGNO (reg))
+ rtx set = XVECEXP (pat, 0, 0);
+ if (GET_CODE (set) == SET
+ && GET_CODE (SET_SRC (set)) == UNSPEC
+ && XINT (SET_SRC (set), 1) == UNSPEC_SET_GOT
+ && REGNO (SET_DEST (set)) == REGNO (reg))
delete_insn (c_insn);
}
}
@@ -0,0 +1,11 @@
+/* PR target/112837 */
+/* { dg-do compile } */
+/* { dg-options "-fcompare-elim -fprofile" } */
+/* { dg-additional-options "-fpie" { target pie } } */
+/* { dg-require-profiling "-fprofile" } */
+
+void
+foo (int i)
+{
+ foo (i);
+}