diff options
author | Ilia Mirkin <imirkin@alum.mit.edu> | 2021-02-25 23:08:00 -0500 |
---|---|---|
committer | Ilia Mirkin <imirkin@alum.mit.edu> | 2021-04-11 12:31:22 -0400 |
commit | 3e99271163f1e07758d43bddb9ff1be6576a186b (patch) | |
tree | 1d9402698f936eee328ec8ec36cb965e0e750203 | |
parent | d2a0aa5efedf36c30b27521dce00c1d70b905a56 (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.cpp | 36 |
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: |