[llvm] [SPIR-V] Fix OpDecorate emission after vreg def. (PR #114426)
Nathan Gauër via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 4 02:55:54 PST 2024
https://github.com/Keenuts updated https://github.com/llvm/llvm-project/pull/114426
>From 4d25afcf2e4797255a7ef2caadc2d72b801da8bb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nathan=20Gau=C3=ABr?= <brioche at google.com>
Date: Thu, 31 Oct 2024 14:24:42 +0100
Subject: [PATCH 1/2] [SPIR-V] Fix OpDecorate emission after vreg def.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
In SPIR-V, OpDecorate instructions are allowed to forward-declare
a virtual register. But while we are at the MIR level, we must comply
with stricter rules, meaning OpDecorate should be emited after, not
before the reg definition.
(In some cases, we defined those just before, switching to just after).
Related to #110652
Signed-off-by: Nathan Gauër <brioche at google.com>
---
.../lib/Target/SPIRV/SPIRVInstructionSelector.cpp | 2 +-
llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp | 2 +-
llvm/test/CodeGen/SPIRV/decoration-order.ll | 15 +++++++++++++++
3 files changed, 17 insertions(+), 2 deletions(-)
create mode 100644 llvm/test/CodeGen/SPIRV/decoration-order.ll
diff --git a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
index 526305d7ed28ab..892912a5680113 100644
--- a/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp
@@ -990,13 +990,13 @@ bool SPIRVInstructionSelector::selectMemOperation(Register ResVReg,
Register VarReg = MRI->createGenericVirtualRegister(LLT::scalar(64));
GR.add(GV, GR.CurMF, VarReg);
- buildOpDecorate(VarReg, I, TII, SPIRV::Decoration::Constant, {});
BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(SPIRV::OpVariable))
.addDef(VarReg)
.addUse(GR.getSPIRVTypeID(VarTy))
.addImm(SPIRV::StorageClass::UniformConstant)
.addUse(Const)
.constrainAllUses(TII, TRI, RBI);
+ buildOpDecorate(VarReg, I, TII, SPIRV::Decoration::Constant, {});
SPIRVType *SourceTy = GR.getOrCreateSPIRVPointerType(
ValTy, I, TII, SPIRV::StorageClass::UniformConstant);
SrcReg = MRI->createGenericVirtualRegister(LLT::scalar(64));
diff --git a/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp b/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp
index cc34cf877dea97..790d86f191fd86 100644
--- a/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp
@@ -829,7 +829,7 @@ static void insertSpirvDecorations(MachineFunction &MF, MachineIRBuilder MIB) {
for (MachineInstr &MI : MBB) {
if (!isSpvIntrinsic(MI, Intrinsic::spv_assign_decoration))
continue;
- MIB.setInsertPt(*MI.getParent(), MI);
+ MIB.setInsertPt(*MI.getParent(), MI.getNextNode());
buildOpSpirvDecorations(MI.getOperand(1).getReg(), MIB,
MI.getOperand(2).getMetadata());
ToErase.push_back(&MI);
diff --git a/llvm/test/CodeGen/SPIRV/decoration-order.ll b/llvm/test/CodeGen/SPIRV/decoration-order.ll
new file mode 100644
index 00000000000000..b6ffb6e5bd39cc
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/decoration-order.ll
@@ -0,0 +1,15 @@
+; RUN: %if spirv-tools %{ llc -O0 -verify-machineinstrs -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
+; This test checks the OpDecorate MIR is generated after the associated
+; vreg definition in the case of an array size declared through this lowering.
+
+define spir_func i32 @foo(ptr addrspace(4) %Buf, ptr addrspace(4) %Item) {
+entry:
+ %var = alloca i64
+ br label %block
+
+block:
+ call void @llvm.memset.p0.i64(ptr align 8 %var, i8 0, i64 24, i1 false)
+ ret i32 0
+}
+
+declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)
>From b2d183eb185ca157613365788adc5d5900f19d7e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nathan=20Gau=C3=ABr?= <brioche at google.com>
Date: Mon, 4 Nov 2024 11:49:57 +0100
Subject: [PATCH 2/2] remove unused test arguments
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Nathan Gauër <brioche at google.com>
---
llvm/test/CodeGen/SPIRV/decoration-order.ll | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/test/CodeGen/SPIRV/decoration-order.ll b/llvm/test/CodeGen/SPIRV/decoration-order.ll
index b6ffb6e5bd39cc..e8299e9735a063 100644
--- a/llvm/test/CodeGen/SPIRV/decoration-order.ll
+++ b/llvm/test/CodeGen/SPIRV/decoration-order.ll
@@ -2,7 +2,7 @@
; This test checks the OpDecorate MIR is generated after the associated
; vreg definition in the case of an array size declared through this lowering.
-define spir_func i32 @foo(ptr addrspace(4) %Buf, ptr addrspace(4) %Item) {
+define spir_func i32 @foo() {
entry:
%var = alloca i64
br label %block
More information about the llvm-commits
mailing list