]> granicus.if.org Git - llvm/commitdiff
[MSan] Handle llvm.is.constant intrinsic
authorAlexander Potapenko <glider@google.com>
Mon, 31 Dec 2018 09:42:23 +0000 (09:42 +0000)
committerAlexander Potapenko <glider@google.com>
Mon, 31 Dec 2018 09:42:23 +0000 (09:42 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350173 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Instrumentation/MemorySanitizer.cpp
test/Instrumentation/MemorySanitizer/msan_llvm_is_constant.ll [new file with mode: 0644]

index 1fad7fc6381c15d7be56a66109029bbd276e2dca..1bac44c3801948cd95f5aad7cea9fd2a3e085d1b 100644 (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);
diff --git a/test/Instrumentation/MemorySanitizer/msan_llvm_is_constant.ll b/test/Instrumentation/MemorySanitizer/msan_llvm_is_constant.ll
new file mode 100644 (file)
index 0000000..b7847db
--- /dev/null
@@ -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)