Skip to content

Commit

Permalink
[msan] Mostly disable msan-handle-icmp-exact.
Browse files Browse the repository at this point in the history
It is way too slow. Change the default option value to 0.
Always do exact shadow propagation for unsigned ICmp with constants, it is
cheap (under 1% cpu time) and required for correctness.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173682 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
eugenis committed Jan 28, 2013
1 parent ccfc295 commit 647c66e
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 26 deletions.
30 changes: 24 additions & 6 deletions lib/Transforms/Instrumentation/MemorySanitizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ static cl::opt<bool> ClHandleICmp("msan-handle-icmp",

static cl::opt<bool> ClHandleICmpExact("msan-handle-icmp-exact",
cl::desc("exact handling of relational integer ICmp"),
cl::Hidden, cl::init(true));
cl::Hidden, cl::init(false));

static cl::opt<bool> ClStoreCleanOrigin("msan-store-clean-origin",
cl::desc("store origin for clean (fully initialized) values"),
Expand Down Expand Up @@ -1255,14 +1255,32 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
}

void visitICmpInst(ICmpInst &I) {
if (ClHandleICmp && I.isEquality())
if (!ClHandleICmp) {
handleShadowOr(I);
return;
}
if (I.isEquality()) {
handleEqualityComparison(I);
else if (ClHandleICmp && ClHandleICmpExact && I.isRelational())
return;
}

assert(I.isRelational());
if (ClHandleICmpExact) {
handleRelationalComparisonExact(I);
else if (ClHandleICmp && I.isSigned() && I.isRelational())
return;
}
if (I.isSigned()) {
handleSignedRelationalComparison(I);
else
handleShadowOr(I);
return;
}

assert(I.isUnsigned());
if ((isa<Constant>(I.getOperand(0)) || isa<Constant>(I.getOperand(1)))) {
handleRelationalComparisonExact(I);
return;
}

handleShadowOr(I);
}

void visitFCmpInst(FCmpInst &I) {
Expand Down
31 changes: 11 additions & 20 deletions test/Instrumentation/MemorySanitizer/msan_basic.ll
Original file line number Diff line number Diff line change
Expand Up @@ -323,8 +323,6 @@ define zeroext i1 @ICmpSLT(i32 %x) nounwind uwtable readnone {
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp slt
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp slt
; CHECK-NOT: call void @__msan_warning
; CHECK: ret i1

define zeroext i1 @ICmpSGE(i32 %x) nounwind uwtable readnone {
Expand All @@ -333,9 +331,7 @@ define zeroext i1 @ICmpSGE(i32 %x) nounwind uwtable readnone {
}

; CHECK: @ICmpSGE
; CHECK: icmp sge
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sge
; CHECK: icmp slt
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sge
; CHECK-NOT: call void @__msan_warning
Expand All @@ -347,9 +343,7 @@ define zeroext i1 @ICmpSGT(i32 %x) nounwind uwtable readnone {
}

; CHECK: @ICmpSGT
; CHECK: icmp sgt
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sgt
; CHECK: icmp slt
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sgt
; CHECK-NOT: call void @__msan_warning
Expand All @@ -361,9 +355,7 @@ define zeroext i1 @ICmpSLE(i32 %x) nounwind uwtable readnone {
}

; CHECK: @ICmpSLE
; CHECK: icmp sle
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sle
; CHECK: icmp slt
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sle
; CHECK-NOT: call void @__msan_warning
Expand All @@ -381,27 +373,26 @@ define <2 x i1> @ICmpSLT_vector(<2 x i32*> %x) nounwind uwtable readnone {
; CHECK: @ICmpSLT_vector
; CHECK: icmp slt <2 x i64>
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp slt <2 x i64>
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp slt <2 x i32*>
; CHECK-NOT: call void @__msan_warning
; CHECK: ret <2 x i1>


; Check that we propagate shadow for arbitrary relational comparisons
; Check that we propagate shadow for unsigned relational comparisons with
; constants

define zeroext i1 @ICmpSLENonZero(i32 %x, i32 %y) nounwind uwtable readnone {
define zeroext i1 @ICmpUGTConst(i32 %x) nounwind uwtable readnone {
entry:
%cmp = icmp sle i32 %x, %y
%cmp = icmp ugt i32 %x, 7
ret i1 %cmp
}

; CHECK: @ICmpSLENonZero
; CHECK: icmp sle i32
; CHECK: @ICmpUGTConst
; CHECK: icmp ugt i32
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sle i32
; CHECK: icmp ugt i32
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sle i32
; CHECK: icmp ugt i32
; CHECK-NOT: call void @__msan_warning
; CHECK: ret i1

Expand Down

0 comments on commit 647c66e

Please sign in to comment.