[PATCH] D147177: [FunctionAttrs] allow weak functions to propagate noreturn

Nick Desaulniers via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 29 12:15:16 PDT 2023


nickdesaulniers created this revision.
nickdesaulniers added reviewers: aeubanks, nikic, sstefan1.
Herald added subscribers: ormris, StephenFan, hiraditya.
Herald added a project: All.
nickdesaulniers requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

I noticed that FunctionAttrs would propagate noreturn for various
functions, but stopped unexpectedly for a very simple weak definition.

While functions with weak linkage may be redefined, that should not
prevent us from propagating noreturn for this particular definition.

Link: https://github.com/ClangBuiltLinux/linux/issues/1815


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D147177

Files:
  llvm/lib/Transforms/IPO/FunctionAttrs.cpp
  llvm/test/Transforms/FunctionAttrs/noreturn.ll


Index: llvm/test/Transforms/FunctionAttrs/noreturn.ll
===================================================================
--- llvm/test/Transforms/FunctionAttrs/noreturn.ll
+++ llvm/test/Transforms/FunctionAttrs/noreturn.ll
@@ -87,3 +87,10 @@
 
 declare token @llvm.coro.id.retcon.once(i32 %size, i32 %align, ptr %buffer, ptr %prototype, ptr %alloc, ptr %free)
 declare i1 @llvm.coro.end(ptr, i1)
+
+; CHECK: Function Attrs: {{.*}}noreturn
+; CHECK-NEXT: @weak
+define weak void @weak() {
+  tail call void @noreturn()
+  unreachable
+}
Index: llvm/lib/Transforms/IPO/FunctionAttrs.cpp
===================================================================
--- llvm/lib/Transforms/IPO/FunctionAttrs.cpp
+++ llvm/lib/Transforms/IPO/FunctionAttrs.cpp
@@ -1637,8 +1637,7 @@
 static void addNoReturnAttrs(const SCCNodeSet &SCCNodes,
                              SmallSet<Function *, 8> &Changed) {
   for (Function *F : SCCNodes) {
-    if (!F || !F->hasExactDefinition() || F->hasFnAttribute(Attribute::Naked) ||
-        F->doesNotReturn())
+    if (!F || F->hasFnAttribute(Attribute::Naked) || F->doesNotReturn())
       continue;
 
     if (!canReturn(*F)) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D147177.509438.patch
Type: text/x-patch
Size: 1157 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230329/a73bc1d2/attachment.bin>


More information about the llvm-commits mailing list