From 7e405eb722e40c79b7726201d0f76b5dab34ba0f Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Tue, 2 Jan 2024 06:59:56 +0800 Subject: [PATCH] [FuncAttrs] Don't infer `noundef` for functions with `sanitize_memory` attribute (#76691) MemorySanitizer assumes that the definition and declaration of a function will be consistent. If we add `noundef` for some definitions, it will break msan. Fix buildbot failure caused by #76553. --- llvm/lib/Transforms/IPO/FunctionAttrs.cpp | 6 ++++++ llvm/test/Transforms/FunctionAttrs/noundef.ll | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp index ce083979afc63a..7ebf265e17ba1f 100644 --- a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp +++ b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp @@ -1296,6 +1296,12 @@ static void addNoUndefAttrs(const SCCNodeSet &SCCNodes, if (!F->hasExactDefinition()) return; + // MemorySanitizer assumes that the definition and declaration of a + // function will be consistent. A function with sanitize_memory attribute + // should be skipped from inference. + if (F->hasFnAttribute(Attribute::SanitizeMemory)) + continue; + if (F->getReturnType()->isVoidTy()) continue; diff --git a/llvm/test/Transforms/FunctionAttrs/noundef.ll b/llvm/test/Transforms/FunctionAttrs/noundef.ll index b357587cc12394..946b562f39553e 100644 --- a/llvm/test/Transforms/FunctionAttrs/noundef.ll +++ b/llvm/test/Transforms/FunctionAttrs/noundef.ll @@ -143,3 +143,12 @@ define i32 @test_noundef_prop() { %ret = call i32 @test_ret_constant() ret i32 %ret } + +; Don't deduce noundef for functions with sanitize_memory. +define i32 @test_ret_constant_msan() sanitize_memory { +; CHECK-LABEL: define i32 @test_ret_constant_msan( +; CHECK-SAME: ) #[[ATTR1:[0-9]+]] { +; CHECK-NEXT: ret i32 0 +; + ret i32 0 +}