Index: lib/Target/X86/X86ISelDAGToDAG.cpp =================================================================== --- lib/Target/X86/X86ISelDAGToDAG.cpp +++ lib/Target/X86/X86ISelDAGToDAG.cpp @@ -814,6 +814,26 @@ CurDAG->DeleteNode(N); continue; } + case ISD::ANY_EXTEND: + case ISD::ANY_EXTEND_VECTOR_INREG: { + // Replace vector any extend with the zero extend equivalents so we don't + // need 2 sets of patterns. Ignore vXi1 extensions. + if (!N->getValueType(0).isVector() || + N->getOperand(0).getScalarValueSizeInBits() == 1) + break; + + unsigned NewOpc = N->getOpcode() == ISD::ANY_EXTEND + ? ISD::ZERO_EXTEND + : ISD::ZERO_EXTEND_VECTOR_INREG; + + SDValue Res = CurDAG->getNode(NewOpc, SDLoc(N), N->getValueType(0), + N->getOperand(0)); + --I; + CurDAG->ReplaceAllUsesOfValueWith(SDValue(N, 0), Res); + ++I; + CurDAG->DeleteNode(N); + continue; + } case ISD::FCEIL: case ISD::FFLOOR: case ISD::FTRUNC: Index: lib/Target/X86/X86InstrAVX512.td =================================================================== --- lib/Target/X86/X86InstrAVX512.td +++ lib/Target/X86/X86InstrAVX512.td @@ -9748,41 +9748,6 @@ } } -multiclass AVX512_pmovx_patterns_aext<string OpcPrefix, SDNode ExtOp> : - AVX512_pmovx_patterns_base<OpcPrefix, ExtOp> { - let Predicates = [HasVLX, HasBWI] in { - def : Pat<(v16i16 (ExtOp (v16i8 VR128X:$src))), - (!cast<I>(OpcPrefix#BWZ256rr) VR128X:$src)>; - } - - let Predicates = [HasVLX] in { - def : Pat<(v8i32 (ExtOp (v8i16 VR128X:$src))), - (!cast<I>(OpcPrefix#WDZ256rr) VR128X:$src)>; - - def : Pat<(v4i64 (ExtOp (v4i32 VR128X:$src))), - (!cast<I>(OpcPrefix#DQZ256rr) VR128X:$src)>; - } - - // 512-bit patterns - let Predicates = [HasBWI] in { - def : Pat<(v32i16 (ExtOp (v32i8 VR256X:$src))), - (!cast<I>(OpcPrefix#BWZrr) VR256X:$src)>; - } - let Predicates = [HasAVX512] in { - def : Pat<(v16i32 (ExtOp (v16i8 VR128X:$src))), - (!cast<I>(OpcPrefix#BDZrr) VR128X:$src)>; - def : Pat<(v16i32 (ExtOp (v16i16 VR256X:$src))), - (!cast<I>(OpcPrefix#WDZrr) VR256X:$src)>; - - def : Pat<(v8i64 (ExtOp (v8i16 VR128X:$src))), - (!cast<I>(OpcPrefix#WQZrr) VR128X:$src)>; - - def : Pat<(v8i64 (ExtOp (v8i32 VR256X:$src))), - (!cast<I>(OpcPrefix#DQZrr) VR256X:$src)>; - } -} - - multiclass AVX512_pmovx_patterns<string OpcPrefix, SDNode ExtOp, SDNode InVecOp> : AVX512_pmovx_patterns_base<OpcPrefix, ExtOp> { @@ -9888,7 +9853,6 @@ defm : AVX512_pmovx_patterns<"VPMOVSX", sext, sext_invec>; defm : AVX512_pmovx_patterns<"VPMOVZX", zext, zext_invec>; -defm : AVX512_pmovx_patterns_aext<"VPMOVZX", anyext>; // Without BWI we can't do a trunc from v16i16 to v16i8. DAG combine can merge // ext+trunc aggresively making it impossible to legalize the DAG to this Index: lib/Target/X86/X86InstrSSE.td =================================================================== --- lib/Target/X86/X86InstrSSE.td +++ lib/Target/X86/X86InstrSSE.td @@ -4967,8 +4967,8 @@ defm BQ : SS41I_pmovx_rm<0x22, "bq", i16mem, i32mem, NoVLX>; -// Patterns that we also need for any_extend. -// Any_extend_vector_inreg is currently legalized to zero_extend_vector_inreg. +// AVX2 Patterns +// any_extend* is legalized to zero_extend*. multiclass SS41I_pmovx_avx2_patterns_base<string OpcPrefix, SDNode ExtOp> { // Register-Register patterns let Predicates = [HasAVX2, NoVLX_Or_NoBWI] in { @@ -5011,7 +5011,6 @@ } } -// AVX2 Patterns multiclass SS41I_pmovx_avx2_patterns<string OpcPrefix, string ExtTy, SDNode ExtOp, SDNode InVecOp> : SS41I_pmovx_avx2_patterns_base<OpcPrefix, ExtOp> { @@ -5080,7 +5079,6 @@ defm : SS41I_pmovx_avx2_patterns<"VPMOVSX", "s", sext, sext_invec>; defm : SS41I_pmovx_avx2_patterns<"VPMOVZX", "z", zext, zext_invec>; -defm : SS41I_pmovx_avx2_patterns_base<"VPMOVZX", anyext>; // SSE4.1/AVX patterns. multiclass SS41I_pmovx_patterns<string OpcPrefix, string ExtTy,