mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-01 01:30:36 +00:00
[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:
parent
0738387d08
commit
f5e3811607
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user