aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2023-12-29 09:47:43 +0100
committerUros Bizjak <ubizjak@gmail.com>2023-12-29 09:53:01 +0100
commit1e7f9abb892443719c82bb17910caa8fb5eeec15 (patch)
treec86b2baf022cef8783c23e9d1ce291dd6ad6e5cd /gcc/config
parent200531d5b9fb99eca2b0d6b8d1e42d176413225f (diff)
downloadgcc-1e7f9abb892443719c82bb17910caa8fb5eeec15.zip
gcc-1e7f9abb892443719c82bb17910caa8fb5eeec15.tar.gz
gcc-1e7f9abb892443719c82bb17910caa8fb5eeec15.tar.bz2
i386: Fix TARGET_USE_VECTOR_FP_CONVERTS SF->DF float_extend splitter [PR113133]
The post-reload splitter currently allows xmm16+ registers with TARGET_EVEX512. The splitter changes SFmode of the output operand to V4SFmode, but the vector mode is currently unsupported in xmm16+ without TARGET_AVX512VL. lowpart_subreg returns NULL_RTX in this case and the compilation fails with invalid RTX. The patch removes support for x/ymm16+ registers with TARGET_EVEX512. The support should be restored once ix86_hard_regno_mode_ok is fixed to allow 16-byte modes in x/ymm16+ with TARGET_EVEX512. PR target/113133 gcc/ChangeLog: * config/i386/i386.md (TARGET_USE_VECTOR_FP_CONVERTS SF->DF float_extend splitter): Do not handle xmm16+ with TARGET_EVEX512. gcc/testsuite/ChangeLog: * gcc.target/i386/pr113133-1.c: New test. * gcc.target/i386/pr113133-2.c: New test.
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/i386/i386.md5
1 files changed, 2 insertions, 3 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index ca6dbf4..e693d93 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -5210,7 +5210,7 @@
&& optimize_insn_for_speed_p ()
&& reload_completed
&& (!EXT_REX_SSE_REG_P (operands[0])
- || TARGET_AVX512VL || TARGET_EVEX512)"
+ || TARGET_AVX512VL)"
[(set (match_dup 2)
(float_extend:V2DF
(vec_select:V2SF
@@ -5226,8 +5226,7 @@
/* If it is unsafe to overwrite upper half of source, we need
to move to destination and unpack there. */
if (REGNO (operands[0]) != REGNO (operands[1])
- || (EXT_REX_SSE_REG_P (operands[1])
- && !TARGET_AVX512VL))
+ || (EXT_REX_SSE_REG_P (operands[1]) && !TARGET_AVX512VL))
{
rtx tmp = lowpart_subreg (SFmode, operands[0], DFmode);
emit_move_insn (tmp, operands[1]);