From 62cdcd6c5aee89e2cbdc498e5a6193d19bd498fb Mon Sep 17 00:00:00 2001 From: sstefan1 Date: Wed, 21 Apr 2021 21:02:28 +0200 Subject: [PATCH] [FuncAttrs] Don't infer willreturn for nonexact definitions Discovered during attributor testing comparing stats with and without the attributor. Willreturn should not be inferred for nonexact definitions. Differential Revision: https://reviews.llvm.org/D100988 --- llvm/lib/Transforms/IPO/FunctionAttrs.cpp | 6 ++++++ llvm/test/Transforms/FunctionAttrs/willreturn.ll | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp index 8f80a61ae08e..ca8660a98ded 100644 --- a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp +++ b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp @@ -1432,6 +1432,12 @@ static bool addNoReturnAttrs(const SCCNodeSet &SCCNodes) { } static bool functionWillReturn(const Function &F) { + // We can infer and propagate function attributes only when we know that the + // definition we'll get at link time is *exactly* the definition we see now. + // For more details, see GlobalValue::mayBeDerefined. + if (!F.hasExactDefinition()) + return false; + // Must-progress function without side-effects must return. if (F.mustProgress() && F.onlyReadsMemory()) return true; diff --git a/llvm/test/Transforms/FunctionAttrs/willreturn.ll b/llvm/test/Transforms/FunctionAttrs/willreturn.ll index 1f69c3d80d8b..35f48e7a344c 100644 --- a/llvm/test/Transforms/FunctionAttrs/willreturn.ll +++ b/llvm/test/Transforms/FunctionAttrs/willreturn.ll @@ -153,5 +153,12 @@ bb2: br label %bb1 } +define linkonce i32 @square(i32) { +; CHECK-NOT: Function Attrs: {{.*}}willreturn +; CHECK: define linkonce i32 @square( + %2 = mul nsw i32 %0, %0 + ret i32 %2 +} + declare i64 @fn_noread() readnone declare void @fn_willreturn() willreturn