[msan] Mostly disable msan-handle-icmp-exact.

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
This commit is contained in:
Evgeniy Stepanov 2013-01-28 11:42:28 +00:00
parent ccfc295b9d
commit 647c66e24d
2 changed files with 37 additions and 28 deletions

View File

@ -129,7 +129,7 @@ static cl::opt<bool> ClHandleICmp("msan-handle-icmp",
static cl::opt<bool> ClHandleICmpExact("msan-handle-icmp-exact", static cl::opt<bool> ClHandleICmpExact("msan-handle-icmp-exact",
cl::desc("exact handling of relational integer ICmp"), 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", static cl::opt<bool> ClStoreCleanOrigin("msan-store-clean-origin",
cl::desc("store origin for clean (fully initialized) values"), cl::desc("store origin for clean (fully initialized) values"),
@ -1255,14 +1255,32 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
} }
void visitICmpInst(ICmpInst &I) { void visitICmpInst(ICmpInst &I) {
if (ClHandleICmp && I.isEquality()) if (!ClHandleICmp) {
handleEqualityComparison(I);
else if (ClHandleICmp && ClHandleICmpExact && I.isRelational())
handleRelationalComparisonExact(I);
else if (ClHandleICmp && I.isSigned() && I.isRelational())
handleSignedRelationalComparison(I);
else
handleShadowOr(I); handleShadowOr(I);
return;
}
if (I.isEquality()) {
handleEqualityComparison(I);
return;
}
assert(I.isRelational());
if (ClHandleICmpExact) {
handleRelationalComparisonExact(I);
return;
}
if (I.isSigned()) {
handleSignedRelationalComparison(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) { void visitFCmpInst(FCmpInst &I) {

View File

@ -323,8 +323,6 @@ define zeroext i1 @ICmpSLT(i32 %x) nounwind uwtable readnone {
; CHECK-NOT: call void @__msan_warning ; CHECK-NOT: call void @__msan_warning
; CHECK: icmp slt ; CHECK: icmp slt
; CHECK-NOT: call void @__msan_warning ; CHECK-NOT: call void @__msan_warning
; CHECK: icmp slt
; CHECK-NOT: call void @__msan_warning
; CHECK: ret i1 ; CHECK: ret i1
define zeroext i1 @ICmpSGE(i32 %x) nounwind uwtable readnone { define zeroext i1 @ICmpSGE(i32 %x) nounwind uwtable readnone {
@ -333,9 +331,7 @@ define zeroext i1 @ICmpSGE(i32 %x) nounwind uwtable readnone {
} }
; CHECK: @ICmpSGE ; CHECK: @ICmpSGE
; CHECK: icmp sge ; CHECK: icmp slt
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sge
; CHECK-NOT: call void @__msan_warning ; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sge ; CHECK: icmp sge
; CHECK-NOT: call void @__msan_warning ; CHECK-NOT: call void @__msan_warning
@ -347,9 +343,7 @@ define zeroext i1 @ICmpSGT(i32 %x) nounwind uwtable readnone {
} }
; CHECK: @ICmpSGT ; CHECK: @ICmpSGT
; CHECK: icmp sgt ; CHECK: icmp slt
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sgt
; CHECK-NOT: call void @__msan_warning ; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sgt ; CHECK: icmp sgt
; CHECK-NOT: call void @__msan_warning ; CHECK-NOT: call void @__msan_warning
@ -361,9 +355,7 @@ define zeroext i1 @ICmpSLE(i32 %x) nounwind uwtable readnone {
} }
; CHECK: @ICmpSLE ; CHECK: @ICmpSLE
; CHECK: icmp sle ; CHECK: icmp slt
; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sle
; CHECK-NOT: call void @__msan_warning ; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sle ; CHECK: icmp sle
; CHECK-NOT: call void @__msan_warning ; CHECK-NOT: call void @__msan_warning
@ -381,27 +373,26 @@ define <2 x i1> @ICmpSLT_vector(<2 x i32*> %x) nounwind uwtable readnone {
; CHECK: @ICmpSLT_vector ; CHECK: @ICmpSLT_vector
; CHECK: icmp slt <2 x i64> ; CHECK: icmp slt <2 x i64>
; CHECK-NOT: call void @__msan_warning ; 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: icmp slt <2 x i32*>
; CHECK-NOT: call void @__msan_warning ; CHECK-NOT: call void @__msan_warning
; CHECK: ret <2 x i1> ; 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: entry:
%cmp = icmp sle i32 %x, %y %cmp = icmp ugt i32 %x, 7
ret i1 %cmp ret i1 %cmp
} }
; CHECK: @ICmpSLENonZero ; CHECK: @ICmpUGTConst
; CHECK: icmp sle i32 ; CHECK: icmp ugt i32
; CHECK-NOT: call void @__msan_warning ; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sle i32 ; CHECK: icmp ugt i32
; CHECK-NOT: call void @__msan_warning ; CHECK-NOT: call void @__msan_warning
; CHECK: icmp sle i32 ; CHECK: icmp ugt i32
; CHECK-NOT: call void @__msan_warning ; CHECK-NOT: call void @__msan_warning
; CHECK: ret i1 ; CHECK: ret i1