Mesa (staging/22.1): aco: fix p_constaddr with a non-zero offset
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon May 23 18:09:44 UTC 2022
Module: Mesa
Branch: staging/22.1
Commit: fbb07048c0493369cabfff1fc3bb0da37a966797
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fbb07048c0493369cabfff1fc3bb0da37a966797
Author: Rhys Perry <pendingchaos02 at gmail.com>
Date: Wed May 11 19:23:00 2022 +0100
aco: fix p_constaddr with a non-zero offset
Seems this broke a while ago and we never noticed.
Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Daniel Schürmann <daniel at schuermann.dev>
Fixes: 0af7ff49fde ("aco: lower p_constaddr into separate instructions earlier")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16460>
(cherry picked from commit bd8f8dda8cfcf8918c9a9842bf31da23deb45cee)
---
.pick_status.json | 2 +-
src/amd/compiler/aco_assembler.cpp | 6 ++++--
src/amd/compiler/aco_lower_to_hw_instr.cpp | 2 +-
src/amd/compiler/tests/test_assembler.cpp | 2 +-
4 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/.pick_status.json b/.pick_status.json
index 8976a19113e..35b69f8d666 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -67,7 +67,7 @@
"description": "aco: fix p_constaddr with a non-zero offset",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "0af7ff49fdecd05531b4c4f5fb841e11f9f451c1"
},
diff --git a/src/amd/compiler/aco_assembler.cpp b/src/amd/compiler/aco_assembler.cpp
index 3095f0bda89..14aa390545a 100644
--- a/src/amd/compiler/aco_assembler.cpp
+++ b/src/amd/compiler/aco_assembler.cpp
@@ -82,10 +82,12 @@ emit_instruction(asm_context& ctx, std::vector<uint32_t>& out, Instruction* inst
instr->opcode = aco_opcode::s_getpc_b64;
instr->operands.pop_back();
} else if (instr->opcode == aco_opcode::p_constaddr_addlo) {
- ctx.constaddrs[instr->operands[1].constantValue()].add_literal = out.size() + 1;
+ ctx.constaddrs[instr->operands[2].constantValue()].add_literal = out.size() + 1;
instr->opcode = aco_opcode::s_add_u32;
- instr->operands[1] = Operand::zero();
+ instr->operands.pop_back();
+ assert(instr->operands[1].isConstant());
+ /* in case it's an inline constant, make it a literal */
instr->operands[1].setFixed(PhysReg(255));
}
diff --git a/src/amd/compiler/aco_lower_to_hw_instr.cpp b/src/amd/compiler/aco_lower_to_hw_instr.cpp
index d085fb67219..59d3cb1d21a 100644
--- a/src/amd/compiler/aco_lower_to_hw_instr.cpp
+++ b/src/amd/compiler/aco_lower_to_hw_instr.cpp
@@ -2098,7 +2098,7 @@ lower_to_hw_instr(Program* program)
PhysReg reg = instr->definitions[0].physReg();
bld.sop1(aco_opcode::p_constaddr_getpc, instr->definitions[0], Operand::c32(id));
bld.sop2(aco_opcode::p_constaddr_addlo, Definition(reg, s1), bld.def(s1, scc),
- Operand(reg, s1), Operand::c32(id));
+ Operand(reg, s1), instr->operands[0], Operand::c32(id));
bld.sop2(aco_opcode::s_addc_u32, Definition(reg.advance(4), s1), bld.def(s1, scc),
Operand(reg.advance(4), s1), Operand::zero(), Operand(scc, s1));
break;
diff --git a/src/amd/compiler/tests/test_assembler.cpp b/src/amd/compiler/tests/test_assembler.cpp
index e970eba2ee5..2f822f90a6c 100644
--- a/src/amd/compiler/tests/test_assembler.cpp
+++ b/src/amd/compiler/tests/test_assembler.cpp
@@ -222,7 +222,7 @@ BEGIN_TEST(assembler.long_jump.constaddr)
//! s_add_u32 s0, s0, 0xe0 ; 8000ff00 000000e0
bld.sop1(aco_opcode::p_constaddr_getpc, Definition(PhysReg(0), s2), Operand::zero());
bld.sop2(aco_opcode::p_constaddr_addlo, Definition(PhysReg(0), s1), bld.def(s1, scc),
- Operand(PhysReg(0), s1), Operand::zero());
+ Operand(PhysReg(0), s1), Operand::zero(), Operand::zero());
program->blocks[2].linear_preds.push_back(0u);
program->blocks[2].linear_preds.push_back(1u);
More information about the mesa-commit
mailing list