From 647c66e24dc913db8e3e038d2fe6351bd98941a2 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Mon, 28 Jan 2013 11:42:28 +0000 Subject: [PATCH] [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 --- .../Instrumentation/MemorySanitizer.cpp | 30 ++++++++++++++---- .../MemorySanitizer/msan_basic.ll | 31 +++++++------------ 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/lib/Transforms/Instrumentation/MemorySanitizer.cpp index a329dcc6bee..714972eb346 100644 --- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -129,7 +129,7 @@ static cl::opt ClHandleICmp("msan-handle-icmp", static cl::opt 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 ClStoreCleanOrigin("msan-store-clean-origin", cl::desc("store origin for clean (fully initialized) values"), @@ -1255,14 +1255,32 @@ struct MemorySanitizerVisitor : public InstVisitor { } 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(I.getOperand(0)) || isa(I.getOperand(1)))) { + handleRelationalComparisonExact(I); + return; + } + + handleShadowOr(I); } void visitFCmpInst(FCmpInst &I) { diff --git a/test/Instrumentation/MemorySanitizer/msan_basic.ll b/test/Instrumentation/MemorySanitizer/msan_basic.ll index 16453c5255f..60f946fbd55 100644 --- a/test/Instrumentation/MemorySanitizer/msan_basic.ll +++ b/test/Instrumentation/MemorySanitizer/msan_basic.ll @@ -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 { @@ -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 @@ -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 @@ -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 @@ -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 -- 2.34.1