From 63cca4e2fd4dd70e54055c4d34d858f810e0bd44 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Fri, 14 Dec 2012 13:43:11 +0000 Subject: [msan] Origin stores and loads do not need explicit alignment. Origin address is always 4 byte aligned, and the access type is always i32. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170199 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Instrumentation/MemorySanitizer.cpp | 17 ++++++------ test/Instrumentation/MemorySanitizer/msan_basic.ll | 30 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/lib/Transforms/Instrumentation/MemorySanitizer.cpp index 0d9739d..db8e684 100644 --- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -421,7 +421,7 @@ struct MemorySanitizerVisitor : public InstVisitor { if (ClTrackOrigins) { if (ClStoreCleanOrigin || isa(Shadow->getType())) { - IRB.CreateAlignedStore(getOrigin(Val), getOriginPtr(Addr, IRB), I.getAlignment()); + IRB.CreateStore(getOrigin(Val), getOriginPtr(Addr, IRB)); } else { Value *ConvertedShadow = convertToShadowTyNoVec(Shadow, IRB); @@ -435,10 +435,10 @@ struct MemorySanitizerVisitor : public InstVisitor { Value *Cmp = IRB.CreateICmpNE(ConvertedShadow, getCleanShadow(ConvertedShadow), "_mscmp"); Instruction *CheckTerm = - SplitBlockAndInsertIfThen(cast(Cmp), false, MS.OriginStoreWeights); - IRBuilder<> IRBNewBlock(CheckTerm); - IRBNewBlock.CreateAlignedStore(getOrigin(Val), - getOriginPtr(Addr, IRBNewBlock), I.getAlignment()); + SplitBlockAndInsertIfThen(cast(Cmp), false, + MS.OriginStoreWeights); + IRBuilder<> IRBNew(CheckTerm); + IRBNew.CreateStore(getOrigin(Val), getOriginPtr(Addr, IRBNew)); } } } @@ -787,7 +787,7 @@ struct MemorySanitizerVisitor : public InstVisitor { insertCheck(I.getPointerOperand(), &I); if (ClTrackOrigins) - setOrigin(&I, IRB.CreateAlignedLoad(getOriginPtr(Addr, IRB), I.getAlignment())); + setOrigin(&I, IRB.CreateLoad(getOriginPtr(Addr, IRB))); } /// \brief Instrument StoreInst @@ -1296,9 +1296,8 @@ struct MemorySanitizerVisitor : public InstVisitor { kShadowTLSAlignment); } if (ClTrackOrigins) - IRB.CreateAlignedStore(getOrigin(A), - getOriginPtrForArgument(A, IRB, ArgOffset), - kShadowTLSAlignment); + IRB.CreateStore(getOrigin(A), + getOriginPtrForArgument(A, IRB, ArgOffset)); assert(Size != 0 && Store != 0); DEBUG(dbgs() << " Param:" << *Store << "\n"); ArgOffset += DataLayout::RoundUpAlignment(Size, 8); diff --git a/test/Instrumentation/MemorySanitizer/msan_basic.ll b/test/Instrumentation/MemorySanitizer/msan_basic.ll index 3228863..b6dcd16 100644 --- a/test/Instrumentation/MemorySanitizer/msan_basic.ll +++ b/test/Instrumentation/MemorySanitizer/msan_basic.ll @@ -8,7 +8,9 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3 ; Check the presence and the linkage type of __msan_track_origins ; CHECK: @__msan_track_origins = weak_odr constant i32 0 + ; Check instrumentation of stores + define void @Store(i32* nocapture %p, i32 %x) nounwind uwtable { entry: store i32 %x, i32* %p, align 4 @@ -33,6 +35,34 @@ entry: ; CHECK-ORIGINS: ret void +; Check instrumentation of aligned stores +; Shadow store has the same alignment as the original store; origin store +; does not specify explicit alignment. + +define void @AlignedStore(i32* nocapture %p, i32 %x) nounwind uwtable { +entry: + store i32 %x, i32* %p, align 32 + ret void +} + +; CHECK: @AlignedStore +; CHECK: load {{.*}} @__msan_param_tls +; CHECK: store {{.*}} align 32 +; CHECK: store {{.*}} align 32 +; CHECK: ret void +; CHECK-ORIGINS: @AlignedStore +; CHECK-ORIGINS: load {{.*}} @__msan_param_tls +; CHECK-ORIGINS: store {{.*}} align 32 +; CHECK-ORIGINS: icmp +; CHECK-ORIGINS: br i1 +; CHECK-ORIGINS: