@@ -3440,16 +3440,19 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
34403440 assert (isa<FixedVectorType>(I.getType ()));
34413441
34423442 Value *FullShadow = getCleanShadow (&I);
3443- assert (cast<FixedVectorType>(Shadow->getType ())->getNumElements () <=
3444- cast<FixedVectorType>(FullShadow->getType ())->getNumElements ());
3443+ unsigned ShadowNumElems =
3444+ cast<FixedVectorType>(Shadow->getType ())->getNumElements ();
3445+ unsigned FullShadowNumElems =
3446+ cast<FixedVectorType>(FullShadow->getType ())->getNumElements ();
34453447
3446- if (cast<FixedVectorType>(Shadow->getType ())->getNumElements () ==
3447- cast<FixedVectorType>(FullShadow->getType ())->getNumElements ()) {
3448+ assert ((ShadowNumElems == FullShadowNumElems) ||
3449+ (ShadowNumElems * 2 == FullShadowNumElems));
3450+
3451+ if (ShadowNumElems == FullShadowNumElems) {
34483452 FullShadow = Shadow;
34493453 } else {
34503454 // TODO: generalize beyond 2x?
3451- SmallVector<int , 32 > ShadowMask (
3452- cast<FixedVectorType>(FullShadow->getType ())->getNumElements ());
3455+ SmallVector<int , 32 > ShadowMask (FullShadowNumElems);
34533456 std::iota (ShadowMask.begin (), ShadowMask.end (), 0 );
34543457
34553458 // Append zeros
@@ -5405,16 +5408,6 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
54055408 break ;
54065409 }
54075410
5408- // Convert Packed Single Precision Floating-Point Values
5409- // to Packed Signed Doubleword Integer Values
5410- //
5411- // <16 x i32> @llvm.x86.avx512.mask.cvtps2dq.512
5412- // (<16 x float>, <16 x i32>, i16, i32)
5413- case Intrinsic::x86_avx512_mask_cvtps2dq_512: {
5414- handleAVX512VectorConvertFPToInt (I, /* LastMask=*/ false );
5415- break ;
5416- }
5417-
54185411 // Convert Single-Precision FP Value to 16-bit FP Value
54195412 // <16 x i16> @llvm.x86.avx512.mask.vcvtps2ph.512
54205413 // (<16 x float>, i32, <16 x i16>, i16)
@@ -5995,6 +5988,15 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
59955988 /* trailingVerbatimArgs=*/ 1 );
59965989 break ;
59975990
5991+ // Convert Packed Single Precision Floating-Point Values
5992+ // to Packed Signed Doubleword Integer Values
5993+ //
5994+ // <16 x i32> @llvm.x86.avx512.mask.cvtps2dq.512
5995+ // (<16 x float>, <16 x i32>, i16, i32)
5996+ case Intrinsic::x86_avx512_mask_cvtps2dq_512:
5997+ handleAVX512VectorConvertFPToInt (I, /* LastMask=*/ false );
5998+ break ;
5999+
59986000 // AVX512 PMOV: Packed MOV, with truncation
59996001 // Precisely handled by applying the same intrinsic to the shadow
60006002 case Intrinsic::x86_avx512_mask_pmov_dw_512:
0 commit comments