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.
Bootstrapped and regtest on x86_64-linux-gnu{-m32,} w/ configure --enable-checking=yes,rtl,extra, failed tests are fixed. Ok for trunk? New tests that PASS (8 tests): gcc.target/i386/avx512f-vscalefpd-2.c execution test gcc.target/i386/avx512f-vscalefps-2.c execution test gcc.target/i386/avx512f-vscalefss-2.c execution test gcc.target/i386/avx512fp16-vscalefph-1b.c execution test gcc.target/i386/avx512fp16-vscalefsh-1b.c execution test gcc.target/i386/avx512fp16vl-vscalefph-1b.c execution test gcc.target/i386/avx512vl-vscalefpd-2.c execution test gcc.target/i386/avx512vl-vscalefps-2.c execution test Old tests that failed, that have disappeared (8 tests): (Eeek!) gcc.target/i386/avx512f-vscalefpd-2.c (internal compiler error) gcc.target/i386/avx512f-vscalefps-2.c (internal compiler error) gcc.target/i386/avx512f-vscalefss-2.c (internal compiler error) gcc.target/i386/avx512fp16-vscalefph-1b.c (internal compiler error) gcc.target/i386/avx512fp16-vscalefsh-1b.c (internal compiler error) gcc.target/i386/avx512fp16vl-vscalefph-1b.c (internal compiler error) gcc.target/i386/avx512vl-vscalefpd-2.c (internal compiler error) gcc.target/i386/avx512vl-vscalefps-2.c (internal compiler error) 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. --- gcc/config/i386/i386-features.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/gcc/config/i386/i386-features.c b/gcc/config/i386/i386-features.c index a525a83afd3..001dc9c1053 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: @@ -2233,6 +2247,7 @@ remove_partial_avx_dependency (void) continue; break; default: + gcc_assert (src_mode == E_VOIDmode); break; } -- 2.27.0