From: Richard Biener <richard.guenther@gmail.com>
To: Uros Bizjak <ubizjak@gmail.com>
Cc: Segher Boessenkool <segher@kernel.crashing.org>,
"gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH] combine: Fix ICE in try_combine on pr112494.c [PR112560]
Date: Thu, 7 Dec 2023 13:09:57 +0100 [thread overview]
Message-ID: <CAFiYyc1faYU-DRC0a30xg5nGCiom_5ogjZ61JfEeVpDPyTWJuw@mail.gmail.com> (raw)
In-Reply-To: <CAFULd4YV5X_7_pDnsoJ9cndRTKjF5BJ5X+aX_p-avo-4wOgVMA@mail.gmail.com>
On Mon, Dec 4, 2023 at 10:34 AM Uros Bizjak <ubizjak@gmail.com> wrote:
>
> On Wed, Nov 29, 2023 at 1:25 PM Richard Biener
> <richard.guenther@gmail.com> wrote:
> >
> > On Wed, Nov 29, 2023 at 10:35 AM Uros Bizjak <ubizjak@gmail.com> wrote:
> > >
> > > The compiler, configured with --enable-checking=yes,rtl,extra ICEs with:
> > >
> > > internal compiler error: RTL check: expected elt 0 type 'e' or 'u',
> > > have 'E' (rtx unspec) in try_combine, at combine.cc:3237
> > >
> > > This is
> > >
> > > 3236 /* Just replace the CC reg with a new mode. */
> > > 3237 SUBST (XEXP (*cc_use_loc, 0), newpat_dest);
> > > 3238 undobuf.other_insn = cc_use_insn;
> > >
> > > in combine.cc, where *cc_use_loc is
> > >
> > > (unspec:DI [
> > > (reg:CC 17 flags)
> > > ] UNSPEC_PUSHFL)
> > >
> > > combine assumes CC must be used inside of a comparison and uses XEXP (..., 0)
> > > without checking on the RTX type of the argument.
> > >
> > > Skip the modification of CC-using operation if *cc_use_loc is not COMPARISON_P.
> > >
> > > PR middle-end/112560
> > >
> > > gcc/ChangeLog:
> > >
> > > * combine.cc (try_combine): Skip the modification of CC-using
> > > operation if *cc_use_loc is not COMPARISON_P.
> > >
> > > Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.
> > >
> > > OK for master?
> >
> > Don't we need to stop the attempt to combine when we cannot handle a use?
> > Simply not adjusting another use doesn't look correct, does it?
>
> I have analysed [1] all targets that define SELECT_CC_MODE, and almost
> all use CC_REG exclusively in comparison. Besides i386 that defines:
>
> (define_insn "@pushfl<mode>2"
> [(set (match_operand:W 0 "push_operand" "=<")
> (unspec:W [(match_operand:CC 1 "flags_reg_operand")]
> UNSPEC_PUSHFL))]
>
> other non-comparison pre-reload uses of CC_REG are:
>
> arm:
>
> (define_insn "get_fpscr_nzcvqc"
> [(set (match_operand:SI 0 "register_operand" "=r")
> (unspec_volatile:SI [(reg:SI VFPCC_REGNUM)] UNSPEC_GET_FPSCR_NZCVQC))]
>
> (define_insn "mve_vadcq_<supf>v4si"
> [(set (match_operand:V4SI 0 "s_register_operand" "=w")
> (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
> (match_operand:V4SI 2 "s_register_operand" "w")]
> VADCQ))
> (set (reg:SI VFPCC_REGNUM)
> (unspec:SI [(reg:SI VFPCC_REGNUM)]
> VADCQ))
> ]
>
> rs6000:
>
> (define_insn "prologue_movesi_from_cr"
> [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
> (unspec:SI [(reg:CC CR2_REGNO) (reg:CC CR3_REGNO)
> (reg:CC CR4_REGNO)]
> UNSPEC_MOVESI_FROM_CR))]
>
> and just for reference s390:
>
> (define_insn_and_split "*ccraw_to_int"
> [(set (pc)
> (if_then_else
> (match_operator 0 "s390_eqne_operator"
> [(reg:CCRAW CC_REGNUM)
> (match_operand 1 "const_int_operand" "")])
> (label_ref (match_operand 2 "" ""))
> (pc)))
> (set (match_operand:SI 3 "register_operand" "=d")
> (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
>
> The above is not single_use, so the issue does not apply here.
>
> These uses can all break with checking enabled at the mentioned spot
> in combine.cc in the same way as x86. Actually, it is undesirable to
> change the mode in the "other instruction" - the machine instruction
> doesn't care about mode at all, but the insn pattern may fail
> recognition due to CC mode change.
>
> Based on the above analysis, I propose we proceed with my original patch.
I'm not familiar enough with combine nor CC reg uses to approve the patch
(I just wanted to point out what I noticed when browsing patches). I'll defer
to Segher for approval.
Thanks,
Richard.
> [1] Starting with 'egrep -v -w "set|clobber" *.md | grep <CC_REG>' and
> analysing all hits
>
> Uros.
prev parent reply other threads:[~2023-12-07 12:11 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-29 9:34 Uros Bizjak
2023-11-29 12:25 ` Richard Biener
2023-11-29 13:20 ` Uros Bizjak
2023-11-30 8:18 ` Segher Boessenkool
2023-11-30 9:09 ` Uros Bizjak
2023-12-04 9:34 ` Uros Bizjak
2023-12-07 12:09 ` Richard Biener [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAFiYyc1faYU-DRC0a30xg5nGCiom_5ogjZ61JfEeVpDPyTWJuw@mail.gmail.com \
--to=richard.guenther@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=segher@kernel.crashing.org \
--cc=ubizjak@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).