[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