[MSan] Handle llvm.is.constant intrinsic

MSan used to report false positives in the case the argument of
llvm.is.constant intrinsic was uninitialized.
In fact checking this argument is unnecessary, as the intrinsic is only
used at compile time, and its value doesn't depend on the value of the
argument.

llvm-svn: 350173
This commit is contained in:
Alexander Potapenko 2018-12-31 09:42:23 +00:00
parent 802c4979ae
commit cea4f83371
2 changed files with 27 additions and 0 deletions

View File

@ -3099,6 +3099,12 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
handleVectorComparePackedIntrinsic(I);
break;
case Intrinsic::is_constant:
// The result of llvm.is.constant() is always defined.
setShadow(&I, getCleanShadow(&I));
setOrigin(&I, getCleanOrigin());
break;
default:
if (!handleUnknownIntrinsic(I))
visitInstruction(I);

View File

@ -0,0 +1,21 @@
; Make sure MSan doesn't insert shadow checks for @llvm.is.constant.* arguments.
; RUN: opt < %s -msan -msan-kernel=1 -S | FileCheck -check-prefixes=CHECK %s
; RUN: opt < %s -msan -S | FileCheck -check-prefixes=CHECK %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: nounwind readnone uwtable
define dso_local i32 @bar(i32 %v) local_unnamed_addr sanitize_memory {
entry:
%0 = tail call i1 @llvm.is.constant.i32(i32 %v)
%1 = zext i1 %0 to i32
ret i32 %1
}
; CHECK-LABEL: bar
; CHECK-NOT: call void @__msan_warning
; Function Attrs: nounwind readnone
declare i1 @llvm.is.constant.i32(i32)