[llvm] r350173 - [MSan] Handle llvm.is.constant intrinsic

Alexander Potapenko via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 31 01:42:24 PST 2018


Author: glider
Date: Mon Dec 31 01:42:23 2018
New Revision: 350173

URL: http://llvm.org/viewvc/llvm-project?rev=350173&view=rev
Log:
[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.



Added:
    llvm/trunk/test/Instrumentation/MemorySanitizer/msan_llvm_is_constant.ll
Modified:
    llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp

Modified: llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp?rev=350173&r1=350172&r2=350173&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/MemorySanitizer.cpp Mon Dec 31 01:42:23 2018
@@ -3099,6 +3099,12 @@ struct MemorySanitizerVisitor : public I
       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);

Added: llvm/trunk/test/Instrumentation/MemorySanitizer/msan_llvm_is_constant.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/MemorySanitizer/msan_llvm_is_constant.ll?rev=350173&view=auto
==============================================================================
--- llvm/trunk/test/Instrumentation/MemorySanitizer/msan_llvm_is_constant.ll (added)
+++ llvm/trunk/test/Instrumentation/MemorySanitizer/msan_llvm_is_constant.ll Mon Dec 31 01:42:23 2018
@@ -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)




More information about the llvm-commits mailing list