Index: lib/CodeGen/SelectionDAG/TargetLowering.cpp =================================================================== --- lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -3295,6 +3295,7 @@ // Store Stride in bytes unsigned Stride = MemSclVT.getSizeInBits() / 8; + Stride = (Stride == 0) ? 1 : Stride; // Stride can't be less than 1 byte. EVT IdxVT = getVectorIdxTy(DAG.getDataLayout()); unsigned NumElem = StVT.getVectorNumElements(); Index: test/CodeGen/X86/vec-trunc-store.ll =================================================================== --- test/CodeGen/X86/vec-trunc-store.ll +++ test/CodeGen/X86/vec-trunc-store.ll @@ -32,3 +32,26 @@ store <4 x i16> %cti44, <4 x i16>* undef ret void } + +define void @store_vec_i1(<4 x i1>* %p, <4 x i1> %val) { +; CHECK-LABEL: store_vec_i1: +; CHECK: # BB#0: +; CHECK-NEXT: movd %xmm0, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: movb %al, (%rdi) +; CHECK-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3] +; CHECK-NEXT: movd %xmm1, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: movb %al, 3(%rdi) +; CHECK-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] +; CHECK-NEXT: movd %xmm1, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: movb %al, 2(%rdi) +; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] +; CHECK-NEXT: movd %xmm0, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: movb %al, 1(%rdi) +; CHECK-NEXT: retq + store <4 x i1> %val, <4 x i1>* %p + ret void; +}