+; False dependency happens on destination register which is not really +; used when moving all ones to vector register +(define_split + [(set (match_operand:VMOVE 0 "register_operand") + (match_operand:VMOVE 1 "int_float_vector_all_ones_operand"))] + "TARGET_AVX512F && reload_completed + && (<MODE_SIZE> == 64 || EXT_REX_SSE_REG_P (operands[0]))" + [(set (match_dup 0) (match_dup 2)) + (parallel + [(set (match_dup 0) (match_dup 1)) + (unspec [(match_dup 0)] UNSPEC_INSN_FALSE_DEP)])] + "operands[2] = CONST0_RTX (<MODE>mode);")
I think we shouldnt emit PXOR when optimizing for size. So should change define_split:
define_split [(set (match_operand:VMOVE 0 "register_operand") (match_operand:VMOVE 1 "int_float_vector_all_ones_operand"))] "TARGET_AVX512F && reload_completed && (<MODE_SIZE> == 64 || EXT_REX_SSE_REG_P (operands[0])) && optimize_insn_for_speed_p ()" [(set (match_dup 0) (match_dup 2)) (parallel [(set (match_dup 0) (match_dup 1)) (unspec [(match_dup 0)] UNSPEC_INSN_FALSE_DEP)])] "operands[2] = CONST0_RTX (<MODE>mode);")