diff options
author | liuhongt <hongtao.liu@intel.com> | 2021-09-18 10:49:54 +0800 |
---|---|---|
committer | liuhongt <hongtao.liu@intel.com> | 2021-09-18 15:52:20 +0800 |
commit | e666a0a22a5c11b5bb894a75b73b6b7f3e364e4d (patch) | |
tree | 5050093cd353f0421a574ef31bccebfc5337d8bf /gcc | |
parent | e5597f2ad55219092929dc12ea15e1edba06df18 (diff) | |
download | gcc-e666a0a22a5c11b5bb894a75b73b6b7f3e364e4d.zip gcc-e666a0a22a5c11b5bb894a75b73b6b7f3e364e4d.tar.gz gcc-e666a0a22a5c11b5bb894a75b73b6b7f3e364e4d.tar.bz2 |
Fix ICE in pass_rpad.
Besides conversion instructions, pass_rpad also handles scalar
sqrt/rsqrt/rcp/round instructions, while r12-3614 should only want to
handle conversion instructions, so fix it.
gcc/ChangeLog:
* config/i386/i386-features.c (remove_partial_avx_dependency):
Restrict TARGET_USE_VECTOR_FP_CONVERTS and
TARGET_USE_VECTOR_CONVERTS to conversion instructions only.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/i386/i386-features.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/gcc/config/i386/i386-features.c b/gcc/config/i386/i386-features.c index a525a83..14f816f 100644 --- a/gcc/config/i386/i386-features.c +++ b/gcc/config/i386/i386-features.c @@ -2165,7 +2165,7 @@ make_pass_insert_endbr_and_patchable_area (gcc::context *ctxt) } /* At entry of the nearest common dominator for basic blocks with - conversions, generate a single + conversions/rcp/sqrt/rsqrt/round, generate a single vxorps %xmmN, %xmmN, %xmmN for all vcvtss2sd op, %xmmN, %xmmX @@ -2211,13 +2211,27 @@ remove_partial_avx_dependency (void) continue; /* Convert PARTIAL_XMM_UPDATE_TRUE insns, DF -> SF, SF -> DF, - SI -> SF, SI -> DF, DI -> SF, DI -> DF, to vec_dup and - vec_merge with subreg. */ + SI -> SF, SI -> DF, DI -> SF, DI -> DF, sqrt, rsqrt, rcp, + round, to vec_dup and vec_merge with subreg. */ rtx src = SET_SRC (set); rtx dest = SET_DEST (set); machine_mode dest_mode = GET_MODE (dest); - machine_mode src_mode = GET_MODE (XEXP (src, 0)); + bool convert_p = false; + switch (GET_CODE (src)) + { + case FLOAT: + case FLOAT_EXTEND: + case FLOAT_TRUNCATE: + case UNSIGNED_FLOAT: + convert_p = true; + break; + default: + break; + } + /* Only hanlde conversion here. */ + machine_mode src_mode + = convert_p ? GET_MODE (XEXP (src, 0)) : VOIDmode; switch (src_mode) { case E_SFmode: @@ -2232,8 +2246,11 @@ remove_partial_avx_dependency (void) || !TARGET_SSE_PARTIAL_REG_CONVERTS_DEPENDENCY) continue; break; - default: + case E_VOIDmode: + gcc_assert (!convert_p); break; + default: + gcc_unreachable (); } if (!v4sf_const0) |