From cb6e4f5e324a6ae58ff1324c9f63b6e8d4ad688f Mon Sep 17 00:00:00 2001 From: Alexander Potapenko Date: Mon, 31 Dec 2018 09:42:23 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350173 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Instrumentation/MemorySanitizer.cpp | 6 ++++++ .../MemorySanitizer/msan_llvm_is_constant.ll | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 test/Instrumentation/MemorySanitizer/msan_llvm_is_constant.ll diff --git a/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/lib/Transforms/Instrumentation/MemorySanitizer.cpp index 1fad7fc6381..1bac44c3801 100644 --- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -3099,6 +3099,12 @@ struct MemorySanitizerVisitor : public InstVisitor { 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 index 00000000000..b7847db06ac --- /dev/null +++ b/test/Instrumentation/MemorySanitizer/msan_llvm_is_constant.ll @@ -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) -- 2.50.1