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>")])