https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70873
--- Comment #18 from H.J. Lu <hjl.tools at gmail dot com> ---
For float_truncate,
(define_split
[(set (match_operand:SF 0 "register_operand")
(float_truncate:SF
(match_operand:DF 1 "nonimmediate_operand")))]
"TARGET_USE_VECTOR_FP_CONVERTS
&& optimize_insn_for_speed_p ()
&& reload_completed && SSE_REG_P (operands[0])
&& (!EXT_REX_SSE_REG_P (operands[0])
|| TARGET_AVX512VL)"
;; It's more profitable to split and then extend in the same register.
(define_peephole2
[(set (match_operand:SF 0 "register_operand")
(float_truncate:SF
(match_operand:DF 1 "memory_operand")))]
"TARGET_SPLIT_MEM_OPND_FOR_FP_CONVERTS
&& optimize_insn_for_speed_p ()
&& SSE_REG_P (operands[0])"
[(set (match_dup 2) (match_dup 1))
(set (match_dup 0) (float_truncate:SF (match_dup 2)))]
"operands[2] = gen_rtx_REG (DFmode, REGNO (operands[0]));")