From 57dafd26307942fbacd64f4be7a9c73638a47ec1 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Mon, 14 Oct 2013 09:52:09 +0000 Subject: [PATCH] [msan] Fix handling of scalar select of vectors. llvm-svn: 192575 --- .../Instrumentation/MemorySanitizer.cpp | 8 ++++---- .../MemorySanitizer/msan_basic.ll | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/lib/Transforms/Instrumentation/MemorySanitizer.cpp index 65db206e570..f158ceee1e8 100644 --- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -1233,15 +1233,15 @@ struct MemorySanitizerVisitor : public InstVisitor { Value *CreateShadowCast(IRBuilder<> &IRB, Value *V, Type *dstTy) { Type *srcTy = V->getType(); if (dstTy->isIntegerTy() && srcTy->isIntegerTy()) - return IRB.CreateIntCast(V, dstTy, false); + return IRB.CreateIntCast(V, dstTy, true); if (dstTy->isVectorTy() && srcTy->isVectorTy() && dstTy->getVectorNumElements() == srcTy->getVectorNumElements()) - return IRB.CreateIntCast(V, dstTy, false); + return IRB.CreateIntCast(V, dstTy, true); size_t srcSizeInBits = VectorOrPrimitiveTypeSizeInBits(srcTy); size_t dstSizeInBits = VectorOrPrimitiveTypeSizeInBits(dstTy); Value *V1 = IRB.CreateBitCast(V, Type::getIntNTy(*MS.C, srcSizeInBits)); Value *V2 = - IRB.CreateIntCast(V1, Type::getIntNTy(*MS.C, dstSizeInBits), false); + IRB.CreateIntCast(V1, Type::getIntNTy(*MS.C, dstSizeInBits), true); return IRB.CreateBitCast(V2, dstTy); // TODO: handle struct types. } @@ -1899,7 +1899,7 @@ struct MemorySanitizerVisitor : public InstVisitor { } else { // Sa = (sext Sb) | (select b, Sc, Sd) S = IRB.CreateOr( - S, IRB.CreateSExt(getShadow(I.getCondition()), S->getType()), + S, CreateShadowCast(IRB, getShadow(I.getCondition()), S->getType()), "_msprop_select"); } setShadow(&I, S); diff --git a/test/Instrumentation/MemorySanitizer/msan_basic.ll b/test/Instrumentation/MemorySanitizer/msan_basic.ll index 02c03ef8976..ad9c5d7df3d 100644 --- a/test/Instrumentation/MemorySanitizer/msan_basic.ll +++ b/test/Instrumentation/MemorySanitizer/msan_basic.ll @@ -290,6 +290,25 @@ entry: ; CHECK-ORIGINS: ret <8 x i16> +; Check that we propagate origin for "select" with scalar condition and vector +; arguments. Select condition shadow is sign-extended to the vector type and +; mixed into the result shadow. + +define <8 x i16> @SelectVector2(<8 x i16> %a, <8 x i16> %b, i1 %c) nounwind uwtable readnone sanitize_memory { +entry: + %cond = select i1 %c, <8 x i16> %a, <8 x i16> %b + ret <8 x i16> %cond +} + +; CHECK: @SelectVector2 +; CHECK: select i1 +; CHECK: sext i1 {{.*}} to i128 +; CHECK: bitcast i128 {{.*}} to <8 x i16> +; CHECK: or <8 x i16> +; CHECK: select i1 +; CHECK: ret <8 x i16> + + define { i64, i64 } @SelectStruct(i1 zeroext %x, { i64, i64 } %a, { i64, i64 } %b) readnone sanitize_memory { entry: %c = select i1 %x, { i64, i64 } %a, { i64, i64 } %b