[msan] Use zero-extension in shadow cast by default.

Switch to sign-extension in r192575 caused 7% perf loss on 482.sphinx3.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192882 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evgeniy Stepanov 2013-10-17 10:53:50 +00:00
parent 0738387d08
commit f5e3811607

View File

@ -1244,18 +1244,19 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
/// \brief Cast between two shadow types, extending or truncating as /// \brief Cast between two shadow types, extending or truncating as
/// necessary. /// necessary.
Value *CreateShadowCast(IRBuilder<> &IRB, Value *V, Type *dstTy) { Value *CreateShadowCast(IRBuilder<> &IRB, Value *V, Type *dstTy,
bool Signed = false) {
Type *srcTy = V->getType(); Type *srcTy = V->getType();
if (dstTy->isIntegerTy() && srcTy->isIntegerTy()) if (dstTy->isIntegerTy() && srcTy->isIntegerTy())
return IRB.CreateIntCast(V, dstTy, true); return IRB.CreateIntCast(V, dstTy, Signed);
if (dstTy->isVectorTy() && srcTy->isVectorTy() && if (dstTy->isVectorTy() && srcTy->isVectorTy() &&
dstTy->getVectorNumElements() == srcTy->getVectorNumElements()) dstTy->getVectorNumElements() == srcTy->getVectorNumElements())
return IRB.CreateIntCast(V, dstTy, true); return IRB.CreateIntCast(V, dstTy, Signed);
size_t srcSizeInBits = VectorOrPrimitiveTypeSizeInBits(srcTy); size_t srcSizeInBits = VectorOrPrimitiveTypeSizeInBits(srcTy);
size_t dstSizeInBits = VectorOrPrimitiveTypeSizeInBits(dstTy); size_t dstSizeInBits = VectorOrPrimitiveTypeSizeInBits(dstTy);
Value *V1 = IRB.CreateBitCast(V, Type::getIntNTy(*MS.C, srcSizeInBits)); Value *V1 = IRB.CreateBitCast(V, Type::getIntNTy(*MS.C, srcSizeInBits));
Value *V2 = Value *V2 =
IRB.CreateIntCast(V1, Type::getIntNTy(*MS.C, dstSizeInBits), true); IRB.CreateIntCast(V1, Type::getIntNTy(*MS.C, dstSizeInBits), Signed);
return IRB.CreateBitCast(V2, dstTy); return IRB.CreateBitCast(V2, dstTy);
// TODO: handle struct types. // TODO: handle struct types.
} }
@ -2019,8 +2020,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
"_msprop_select_agg"); "_msprop_select_agg");
} else { } else {
// Sa = (sext Sb) | (select b, Sc, Sd) // Sa = (sext Sb) | (select b, Sc, Sd)
S = IRB.CreateOr( S = IRB.CreateOr(S, CreateShadowCast(IRB, getShadow(I.getCondition()),
S, CreateShadowCast(IRB, getShadow(I.getCondition()), S->getType()), S->getType(), true),
"_msprop_select"); "_msprop_select");
} }
setShadow(&I, S); setShadow(&I, S);