@@ -4765,6 +4765,39 @@ define void @scaleidx_scatter_outofrange(<8 x float> %value, ptr %base, <8 x i32
47654765}
47664766declare  void  @llvm.masked.scatter.v8f32.v8p0 (<8  x float >, <8  x ptr >, i32  immarg, <8  x i1 >)
47674767
4768+ define  <16  x i32 > @pr163023 (ptr  %a0 , <16  x i32 > %a1 ) {
4769+ ; X64-LABEL: pr163023: 
4770+ ; X64:       # %bb.0: 
4771+ ; X64-NEXT:    vpmovsxdq %ymm0, %zmm1 
4772+ ; X64-NEXT:    vextracti64x4 $1, %zmm0, %ymm0 
4773+ ; X64-NEXT:    vpmovsxdq %ymm0, %zmm0 
4774+ ; X64-NEXT:    kxnorw %k0, %k0, %k1 
4775+ ; X64-NEXT:    vpxor %xmm2, %xmm2, %xmm2 
4776+ ; X64-NEXT:    vpxor %xmm3, %xmm3, %xmm3 
4777+ ; X64-NEXT:    kxnorw %k0, %k0, %k2 
4778+ ; X64-NEXT:    vpgatherqd (%rdi,%zmm0), %ymm3 {%k2} 
4779+ ; X64-NEXT:    vpgatherqd (%rdi,%zmm1), %ymm2 {%k1} 
4780+ ; X64-NEXT:    vinserti64x4 $1, %ymm3, %zmm2, %zmm0 
4781+ ; X64-NEXT:    retq 
4782+ ; 
4783+ ; X86-LABEL: pr163023: 
4784+ ; X86:       # %bb.0: 
4785+ ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax 
4786+ ; X86-NEXT:    kxnorw %k0, %k0, %k1 
4787+ ; X86-NEXT:    vpxor %xmm1, %xmm1, %xmm1 
4788+ ; X86-NEXT:    vpgatherdd (%eax,%zmm0), %zmm1 {%k1} 
4789+ ; X86-NEXT:    vmovdqa64 %zmm1, %zmm0 
4790+ ; X86-NEXT:    retl 
4791+   %addr.p  = ptrtoint  ptr  %a0  to  i64 
4792+   %addr.v  = insertelement  <1  x i64 > poison, i64  %addr.p , i64  0 
4793+   %addr.splat  = shufflevector  <1  x i64 > %addr.v , <1  x i64 > poison, <16  x i32 > zeroinitializer 
4794+   %ofs  = sext  <16  x i32 > %a1  to  <16  x i64 >
4795+   %addr  = add  nuw  <16  x i64 > %addr.splat , %ofs 
4796+   %ptr  = inttoptr  <16  x i64 > %addr  to  <16  x ptr >
4797+   %gather  = tail  call  fastcc  <16  x i32 > @llvm.masked.gather.v16i32.v16p0 (<16  x ptr > %ptr , i32  4 , <16  x i1 > splat (i1  true ), <16  x i32 > poison)
4798+   ret  <16  x i32 > %gather 
4799+ }
4800+ 
47684801; 
47694802; PR45906 
47704803; This used to cause fast-isel to generate bad copy instructions that would 
0 commit comments