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);
|
||||
DEBUG(dbgs() << " Arg#" << i << ": " << *A <<
|
||||
" Shadow: " << *ArgShadow << "\n");
|
||||
bool ArgIsInitialized = false;
|
||||
if (CS.paramHasAttr(i + 1, Attribute::ByVal)) {
|
||||
assert(A->getType()->isPointerTy() &&
|
||||
"ByVal argument is not a pointer!");
|
||||
@ -2325,8 +2326,10 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
Size = MS.DL->getTypeAllocSize(A->getType());
|
||||
Store = IRB.CreateAlignedStore(ArgShadow, ArgShadowBase,
|
||||
kShadowTLSAlignment);
|
||||
Constant *Cst = dyn_cast<Constant>(ArgShadow);
|
||||
if (Cst && Cst->isNullValue()) ArgIsInitialized = true;
|
||||
}
|
||||
if (MS.TrackOrigins)
|
||||
if (MS.TrackOrigins && !ArgIsInitialized)
|
||||
IRB.CreateStore(getOrigin(A),
|
||||
getOriginPtrForArgument(A, IRB, ArgOffset));
|
||||
(void)Store;
|
||||
|
@ -766,6 +766,24 @@ cond.end: ; preds = %cond.false, %cond.t
|
||||
; 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
|
||||
|
||||
define <2 x i64> @ArgumentShadowAlignment(i64 %a, <2 x i64> %b) sanitize_memory {
|
||||
|
Loading…
Reference in New Issue
Block a user