https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117159
Hongtao Liu <liuhongt at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Assignee|unassigned at gcc dot gnu.org |liuhongt at gcc dot
gnu.org
CC| |liuhongt at gcc dot gnu.org
Status|UNCONFIRMED |ASSIGNED
Last reconfirmed| |2024-10-16
Ever confirmed|0 |1
--- Comment #1 from Hongtao Liu <liuhongt at gcc dot gnu.org> ---
zero_extend is transformed into a subreg which make reload think the upper part
is garbage, it's related to below pattern, I'll take a look.
4299;; Since vpcmpd implicitly clear the upper bits of dest, transform
4300;; vpcmpd + zero_extend to vpcmpd since the instruction
4301(define_insn_and_split
"*<avx512>_cmp<V48H_AVX512VL:mode>3_zero_extend<SWI248x:mode>"
4302 [(set (match_operand:SWI248x 0 "register_operand")
4303 (zero_extend:SWI248x
4304 (unspec:<V48H_AVX512VL:avx512fmaskmode>
4305 [(match_operand:V48H_AVX512VL 1 "nonimmediate_operand")
4306 (match_operand:V48H_AVX512VL 2 "nonimmediate_operand")
4307 (match_operand:SI 3 "const_0_to_7_operand")]
4308 UNSPEC_PCMP)))]
4309 "TARGET_AVX512F
4310 && (!VALID_MASK_AVX512BW_MODE (<SWI248x:MODE>mode) || TARGET_AVX512BW)
4311 && ix86_pre_reload_split ()
4312 && (GET_MODE_NUNITS (<V48H_AVX512VL:MODE>mode)
4313 < GET_MODE_PRECISION (<SWI248x:MODE>mode))"
4314 "#"
4315 "&& 1"
4316 [(set (match_dup 0)
4317 (unspec:<V48H_AVX512VL:avx512fmaskmode>
4318 [(match_dup 1)
4319 (match_dup 2)
4320 (match_dup 3)]
4321 UNSPEC_PCMP))]
4322{
4323 operands[1] = force_reg (<V48H_AVX512VL:MODE>mode, operands[1]);
4324 operands[0] = lowpart_subreg (<V48H_AVX512VL:avx512fmaskmode>mode,
4325 operands[0], <SWI248x:MODE>mode);
4326}
4327 [(set_attr "type" "ssecmp")
4328 (set_attr "length_immediate" "1")
4329 (set_attr "prefix" "evex")
4330 (set_attr "mode" "<V48H_AVX512VL:sseinsnmode>")])