]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386: Fix rtl checking ICE in ix86_elim_entry_set_got [PR112837]
authorJakub Jelinek <jakub@redhat.com>
Mon, 4 Dec 2023 08:01:09 +0000 (09:01 +0100)
committerJakub Jelinek <jakub@redhat.com>
Mon, 4 Dec 2023 08:01:09 +0000 (09:01 +0100)
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.

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.

gcc/config/i386/i386.cc
gcc/testsuite/gcc.dg/pr112837.c [new file with mode: 0644]

index 0f91ee745021c394b12a333797a269ebe0978c91..93a9cb556a55151b8c41f42fa1a6799c6fc42904 100644 (file)
@@ -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);
        }
     }
diff --git a/gcc/testsuite/gcc.dg/pr112837.c b/gcc/testsuite/gcc.dg/pr112837.c
new file mode 100644 (file)
index 0000000..2de43f5
--- /dev/null
@@ -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);
+}