On Mon, Dec 4, 2023 at 8:41 AM Jakub Jelinek <ja...@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 <ja...@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 >