diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -3278,7 +3278,10 @@ // Clear out readonly/readnone attributes. AttrBuilder B; B.addAttribute(Attribute::ReadOnly) - .addAttribute(Attribute::ReadNone); + .addAttribute(Attribute::ReadNone) + .addAttribute(Attribute::WriteOnly) + .addAttribute(Attribute::ArgMemOnly) + .addAttribute(Attribute::Speculatable); Func->removeAttributes(AttributeList::FunctionIndex, B); } @@ -4595,7 +4598,10 @@ // Clear out readonly/readnone attributes. AttrBuilder B; B.addAttribute(Attribute::ReadOnly) - .addAttribute(Attribute::ReadNone); + .addAttribute(Attribute::ReadNone) + .addAttribute(Attribute::WriteOnly) + .addAttribute(Attribute::ArgMemOnly) + .addAttribute(Attribute::Speculatable); F.removeAttributes(AttributeList::FunctionIndex, B); return Visitor.runOnFunction(); diff --git a/llvm/test/Instrumentation/MemorySanitizer/attributes.ll b/llvm/test/Instrumentation/MemorySanitizer/attributes.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Instrumentation/MemorySanitizer/attributes.ll @@ -0,0 +1,47 @@ +; RUN: opt < %s -S -passes='module(msan-module),function(msan)' 2>&1 | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + + +declare void @a_() sanitize_memory readnone +declare void @b_() sanitize_memory readonly +declare void @c_() sanitize_memory writeonly +declare void @d_(i32* %p) sanitize_memory writeonly argmemonly +declare void @e_() sanitize_memory speculatable + +define void @a() sanitize_memory readnone { +entry: + call void @a_() + ret void +} + +define void @b() sanitize_memory readonly { +entry: + call void @b_() + ret void +} + +define void @c() sanitize_memory writeonly { +entry: + call void @c_() + ret void +} + +define void @d(i32* %p) sanitize_memory writeonly argmemonly { +entry: + call void @d_(i32* %p) + ret void +} + +define void @e() sanitize_memory speculatable { +entry: + call void @e_() + ret void +} + +; CHECK-NOT: readnone +; CHECK-NOT: readonly +; CHECK-NOT: writeonly +; CHECK-NOT: argmemonly +; CHECK-NOT: speculatable