mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
[msan] Avoid redundant origin stores.
Origin is meaningless for fully initialized values. Avoid storing origin for function arguments that are known to be always initialized (i.e. shadow is a compile-time null constant). This is not about correctness, but purely an optimization. Seems to affect compilation time of blacklisted functions significantly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213239 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c84f22aac5
commit
e1287f556f
@ -2313,6 +2313,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
|||||||
Value *ArgShadowBase = getShadowPtrForArgument(A, IRB, ArgOffset);
|
Value *ArgShadowBase = getShadowPtrForArgument(A, IRB, ArgOffset);
|
||||||
DEBUG(dbgs() << " Arg#" << i << ": " << *A <<
|
DEBUG(dbgs() << " Arg#" << i << ": " << *A <<
|
||||||
" Shadow: " << *ArgShadow << "\n");
|
" Shadow: " << *ArgShadow << "\n");
|
||||||
|
bool ArgIsInitialized = false;
|
||||||
if (CS.paramHasAttr(i + 1, Attribute::ByVal)) {
|
if (CS.paramHasAttr(i + 1, Attribute::ByVal)) {
|
||||||
assert(A->getType()->isPointerTy() &&
|
assert(A->getType()->isPointerTy() &&
|
||||||
"ByVal argument is not a pointer!");
|
"ByVal argument is not a pointer!");
|
||||||
@ -2325,8 +2326,10 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
|||||||
Size = MS.DL->getTypeAllocSize(A->getType());
|
Size = MS.DL->getTypeAllocSize(A->getType());
|
||||||
Store = IRB.CreateAlignedStore(ArgShadow, ArgShadowBase,
|
Store = IRB.CreateAlignedStore(ArgShadow, ArgShadowBase,
|
||||||
kShadowTLSAlignment);
|
kShadowTLSAlignment);
|
||||||
|
Constant *Cst = dyn_cast<Constant>(ArgShadow);
|
||||||
|
if (Cst && Cst->isNullValue()) ArgIsInitialized = true;
|
||||||
}
|
}
|
||||||
if (MS.TrackOrigins)
|
if (MS.TrackOrigins && !ArgIsInitialized)
|
||||||
IRB.CreateStore(getOrigin(A),
|
IRB.CreateStore(getOrigin(A),
|
||||||
getOriginPtrForArgument(A, IRB, ArgOffset));
|
getOriginPtrForArgument(A, IRB, ArgOffset));
|
||||||
(void)Store;
|
(void)Store;
|
||||||
|
@ -766,6 +766,24 @@ cond.end: ; preds = %cond.false, %cond.t
|
|||||||
; CHECK: ret i32 [[A]]
|
; CHECK: ret i32 [[A]]
|
||||||
|
|
||||||
|
|
||||||
|
; Test that there are no __msan_param_origin_tls stores when
|
||||||
|
; argument shadow is a compile-time zero constant (which is always the case
|
||||||
|
; in functions missing sanitize_memory attribute).
|
||||||
|
|
||||||
|
define i32 @NoSanitizeMemoryParamTLS(i32* nocapture readonly %x) {
|
||||||
|
entry:
|
||||||
|
%0 = load i32* %x, align 4
|
||||||
|
%call = tail call i32 @NoSanitizeMemoryParamTLSHelper(i32 %0)
|
||||||
|
ret i32 %call
|
||||||
|
}
|
||||||
|
|
||||||
|
declare i32 @NoSanitizeMemoryParamTLSHelper(i32 %x)
|
||||||
|
|
||||||
|
; CHECK-LABEL: define i32 @NoSanitizeMemoryParamTLS(
|
||||||
|
; CHECK-NOT: __msan_param_origin_tls
|
||||||
|
; CHECK: ret i32
|
||||||
|
|
||||||
|
|
||||||
; Test argument shadow alignment
|
; Test argument shadow alignment
|
||||||
|
|
||||||
define <2 x i64> @ArgumentShadowAlignment(i64 %a, <2 x i64> %b) sanitize_memory {
|
define <2 x i64> @ArgumentShadowAlignment(i64 %a, <2 x i64> %b) sanitize_memory {
|
||||||
|
Loading…
Reference in New Issue
Block a user