summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlia Mirkin <imirkin@alum.mit.edu>2021-02-25 23:08:00 -0500
committerIlia Mirkin <imirkin@alum.mit.edu>2021-04-11 12:31:22 -0400
commit3e99271163f1e07758d43bddb9ff1be6576a186b (patch)
tree1d9402698f936eee328ec8ec36cb965e0e750203
parentd2a0aa5efedf36c30b27521dce00c1d70b905a56 (diff)
nv50/ir: force shared memory indirect to be an address
The upstream logic will not end up using an address, so we have to force it here. The other backends don't care either. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Pierre Moreau <dev@pmoreau.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9299>
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nv50.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nv50.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nv50.cpp
index e03af380bbf..b9d71de2e48 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nv50.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nv50.cpp
@@ -626,6 +626,7 @@ private:
bool handlePFETCH(Instruction *);
bool handleEXPORT(Instruction *);
bool handleLOAD(Instruction *);
+ bool handleLDST(Instruction *);
bool handleDIV(Instruction *);
bool handleSQRT(Instruction *);
@@ -1294,6 +1295,13 @@ bool
NV50LoweringPreSSA::handleLOAD(Instruction *i)
{
ValueRef src = i->src(0);
+ Symbol *sym = i->getSrc(0)->asSym();
+
+ if (prog->getType() == Program::TYPE_COMPUTE) {
+ if (sym->inFile(FILE_MEMORY_SHARED)) {
+ return handleLDST(i);
+ }
+ }
if (src.isIndirect(1)) {
assert(prog->getType() == Program::TYPE_GEOMETRY);
@@ -1331,6 +1339,32 @@ NV50LoweringPreSSA::handleLOAD(Instruction *i)
}
bool
+NV50LoweringPreSSA::handleLDST(Instruction *i)
+{
+ ValueRef src = i->src(0);
+ Symbol *sym = i->getSrc(0)->asSym();
+
+ if (prog->getType() != Program::TYPE_COMPUTE ||
+ !sym->inFile(FILE_MEMORY_SHARED)) {
+ return true;
+ }
+
+ if (src.isIndirect(0)) {
+ Value *addr = i->getIndirect(0, 0);
+
+ if (!addr->inFile(FILE_ADDRESS)) {
+ // Move address from GPR into an address register
+ Value *new_addr = bld.getSSA(2, FILE_ADDRESS);
+ bld.mkMov(new_addr, addr);
+
+ i->setIndirect(0, 0, new_addr);
+ }
+ }
+
+ return true;
+}
+
+bool
NV50LoweringPreSSA::handlePFETCH(Instruction *i)
{
assert(prog->getType() == Program::TYPE_GEOMETRY);
@@ -1427,6 +1461,8 @@ NV50LoweringPreSSA::visit(Instruction *i)
return handleEXPORT(i);
case OP_LOAD:
return handleLOAD(i);
+ case OP_STORE:
+ return handleLDST(i);
case OP_RDSV:
return handleRDSV(i);
case OP_WRSV: