From f1cc0b607b03548028db3ca57bb057b2599b1711 Mon Sep 17 00:00:00 2001 From: Antonio Frighetto Date: Wed, 2 Jul 2025 09:23:22 +0200 Subject: [IR] Introduce `dead_on_return` attribute MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add `dead_on_return` attribute, which is meant to be taken advantage by the frontend, and states that the memory pointed to by the argument is dead upon function return. As with `byval`, it is supposed to be used for passing aggregates by value. The difference lies in the ABI: `byval` implies that the pointer is explicitly passed as argument to the callee (during codegen the copy is emitted as per byval contract), whereas a `dead_on_return`-marked argument implies that the copy already exists in the IR, is located at a specific stack offset within the caller, and this memory will not be read further by the caller upon callee return – or otherwise poison, if read before being written. RFC: https://discourse.llvm.org/t/rfc-add-dead-on-return-attribute/86871. --- llvm/lib/IR/Function.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'llvm/lib/IR/Function.cpp') diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index 3e7fcbb..7a03663 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -130,6 +130,12 @@ bool Argument::hasByValAttr() const { return hasAttribute(Attribute::ByVal); } +bool Argument::hasDeadOnReturnAttr() const { + if (!getType()->isPointerTy()) + return false; + return hasAttribute(Attribute::DeadOnReturn); +} + bool Argument::hasByRefAttr() const { if (!getType()->isPointerTy()) return false; -- cgit v1.1