mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
[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:
parent
ccfc295b9d
commit
647c66e24d
@ -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) {
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user