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