[llvm] [SPIRV] Dummy implementation of the `returnaddress` and `frameaddress` intrinsics (PR #195976)

via llvm-commits llvm-commits at lists.llvm.org
Tue May 5 18:59:08 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-spir-v

Author: Victor Mustya (vmustya)

<details>
<summary>Changes</summary>

The SPIR-V specification doesn't define any operations for the
return and frame address. The valid implementation in this case is to
produce a null pointer.

---
Full diff: https://github.com/llvm/llvm-project/pull/195976.diff


2 Files Affected:

- (modified) llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp (+9) 
- (added) llvm/test/CodeGen/SPIRV/returnaddress.ll (+26) 


``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
index aee3a29c6e42b..43e6b80422066 100644
--- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
@@ -5136,6 +5136,15 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg,
       return selectMaskedScatter(I);
     return diagnoseUnsupported(
         I, "llvm.masked.scatter requires SPV_INTEL_masked_gather_scatter");
+  case Intrinsic::returnaddress:
+  case Intrinsic::frameaddress: {
+    // SPIR-V does not have a stack or return address. Lower to null.
+    auto MIB = BuildMI(BB, I, I.getDebugLoc(), TII.get(SPIRV::OpConstantNull))
+                   .addDef(ResVReg)
+                   .addUse(GR.getSPIRVTypeID(ResType));
+    MIB.constrainAllUses(TII, TRI, RBI);
+    return true;
+  }
   default: {
     std::string DiagMsg;
     raw_string_ostream OS(DiagMsg);
diff --git a/llvm/test/CodeGen/SPIRV/returnaddress.ll b/llvm/test/CodeGen/SPIRV/returnaddress.ll
new file mode 100644
index 0000000000000..138212ad60b2c
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/returnaddress.ll
@@ -0,0 +1,26 @@
+; RUN: llc -mtriple=spirv64-unknown-unknown -O0 < %s | FileCheck %s
+; RUN: llc -mtriple=spirv32-unknown-unknown -O0 < %s | FileCheck %s
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown < %s -o - -filetype=obj | spirv-val %}
+
+; SPIR-V does not have a stack or return address concept.
+; llvm.returnaddress and llvm.frameaddress are lowered to null (OpConstantNull).
+
+declare ptr @llvm.returnaddress(i32)
+declare ptr @llvm.frameaddress(i32)
+
+; CHECK-DAG: %[[#PTR_TY:]] = OpTypePointer
+; CHECK-DAG: %[[#NULL:]] = OpConstantNull %[[#PTR_TY]]
+
+; CHECK: %[[#]] = OpFunction
+; CHECK: OpReturnValue %[[#NULL]]
+define ptr @test_returnaddress() {
+  %ret = call ptr @llvm.returnaddress(i32 0)
+  ret ptr %ret
+}
+
+; CHECK: %[[#]] = OpFunction
+; CHECK: OpReturnValue %[[#NULL]]
+define ptr @test_frameaddress() {
+  %ret = call ptr @llvm.frameaddress(i32 0)
+  ret ptr %ret
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/195976


More information about the llvm-commits mailing list