public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Jakub Jelinek <jakub@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-9289] i386: Fix ICEs with SUBREGs from vector etc. constants to XFmode [PR114184] Date: Mon, 4 Mar 2024 09:04:57 +0000 (GMT) [thread overview] Message-ID: <20240304090457.382253858D33@sourceware.org> (raw) https://gcc.gnu.org/g:ea1c16f95b8fbaba4a7f3663ff9933ebedfb92a5 commit r14-9289-gea1c16f95b8fbaba4a7f3663ff9933ebedfb92a5 Author: Jakub Jelinek <jakub@redhat.com> Date: Mon Mar 4 10:04:19 2024 +0100 i386: Fix ICEs with SUBREGs from vector etc. constants to XFmode [PR114184] The Intel extended format has the various weird number categories, pseudo denormals, pseudo infinities, pseudo NaNs and unnormals. Those are not representable in the GCC real_value and so neither GIMPLE nor RTX VIEW_CONVERT_EXPR/SUBREG folding folds those into constants. As can be seen on the following testcase, because it isn't folded (since GCC 12, before that we were folding it) we can end up with a SUBREG of a CONST_VECTOR or similar constant, which isn't valid general_operand, so we ICE during vregs pass trying to recognize the move instruction. Initially I thought it is a middle-end bug, the movxf instruction has general_operand predicate, but the middle-end certainly never tests that predicate, seems moves are special optabs. And looking at other mov optabs, e.g. for vector modes the i386 patterns use nonimmediate_operand predicate on the input, yet ix86_expand_vector_move deals with CONSTANT_P and SUBREG of CONSTANT_P arguments which if the predicate was checked couldn't ever make it through. The following patch handles this case similarly to the ix86_expand_vector_move's SUBREG of CONSTANT_P case, does it just for XFmode because I believe that is the only mode that needs it from the scalar ones, others should just be folded. 2024-03-04 Jakub Jelinek <jakub@redhat.com> PR target/114184 * config/i386/i386-expand.cc (ix86_expand_move): If XFmode op1 is SUBREG of CONSTANT_P, force the SUBREG_REG into memory or register. * gcc.target/i386/pr114184.c: New test. Diff: --- gcc/config/i386/i386-expand.cc | 14 ++++++++++++++ gcc/testsuite/gcc.target/i386/pr114184.c | 22 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc index c98e0f81f0c..3b1685ae448 100644 --- a/gcc/config/i386/i386-expand.cc +++ b/gcc/config/i386/i386-expand.cc @@ -451,6 +451,20 @@ ix86_expand_move (machine_mode mode, rtx operands[]) && GET_MODE (SUBREG_REG (op1)) == DImode && SUBREG_BYTE (op1) == 0) op1 = gen_rtx_ZERO_EXTEND (TImode, SUBREG_REG (op1)); + /* As not all values in XFmode are representable in real_value, + we might be called with unfoldable SUBREGs of constants. */ + if (mode == XFmode + && CONSTANT_P (SUBREG_REG (op1)) + && can_create_pseudo_p ()) + { + machine_mode imode = GET_MODE (SUBREG_REG (op1)); + rtx r = force_const_mem (imode, SUBREG_REG (op1)); + if (r) + r = validize_mem (r); + else + r = force_reg (imode, SUBREG_REG (op1)); + op1 = simplify_gen_subreg (mode, r, imode, SUBREG_BYTE (op1)); + } break; } diff --git a/gcc/testsuite/gcc.target/i386/pr114184.c b/gcc/testsuite/gcc.target/i386/pr114184.c new file mode 100644 index 00000000000..360b3b95026 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr114184.c @@ -0,0 +1,22 @@ +/* PR target/114184 */ +/* { dg-do compile } */ +/* { dg-options "-Og -mavx2" } */ + +typedef unsigned char V __attribute__((vector_size (32))); +typedef unsigned char W __attribute__((vector_size (16))); + +_Complex long double +foo (void) +{ + _Complex long double d; + *(V *)&d = (V) { 149, 136, 89, 42, 38, 240, 196, 194 }; + return d; +} + +long double +bar (void) +{ + long double d; + *(W *)&d = (W) { 149, 136, 89, 42, 38, 240, 196, 194 }; + return d; +}
reply other threads:[~2024-03-04 9:04 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=20240304090457.382253858D33@sourceware.org \ --to=jakub@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /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: linkBe 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).