From 04ecad97ff7b44bd9afd1bff9108dea199723829 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Wed, 25 May 2016 21:54:39 -0400 Subject: [PATCH] nvc0/ir: avoid generating illegal instructions for compute constbuf loads For user-supplied constbufs, fileIndex is 0. In that case, when we subtract 1, we'll end up loading from constbuf offset -16. This is illegal, and there are asserts to avoid it. Normally we'd just DCE it, but no point in generating the instructions if they're not going to be used. Signed-off-by: Ilia Mirkin Acked-by: Hans de Goede Reviewed-by: Samuel Pitoiset --- src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp index 869040ca562..da2fa4bdf18 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp @@ -2180,11 +2180,11 @@ NVC0LoweringPass::handleLDST(Instruction *i) // memory. int8_t fileIndex = i->getSrc(0)->reg.fileIndex - 1; Value *ind = i->getIndirect(0, 1); - Value *ptr = loadUboInfo64(ind, fileIndex * 16); // TODO: clamp the offset to the maximum number of const buf. if (i->src(0).isIndirect(1)) { Value *offset = bld.loadImm(NULL, i->getSrc(0)->reg.data.offset + typeSizeof(i->sType)); + Value *ptr = loadUboInfo64(ind, fileIndex * 16); Value *length = loadUboLength32(ind, fileIndex * 16); Value *pred = new_LValue(func, FILE_PREDICATE); if (i->src(0).isIndirect(0)) { @@ -2200,6 +2200,7 @@ NVC0LoweringPass::handleLDST(Instruction *i) bld.mkMov(i->getDef(0), bld.mkImm(0)); } } else if (fileIndex >= 0) { + Value *ptr = loadUboInfo64(ind, fileIndex * 16); if (i->src(0).isIndirect(0)) { bld.mkOp2(OP_ADD, TYPE_U64, ptr, ptr, i->getIndirect(0, 0)); } -- 2.30.2