[Mesa-dev] [PATCH 1/2] nvc0/ir: avoid generating illegal instructions for compute constbuf loads

Ilia Mirkin imirkin at alum.mit.edu
Thu May 26 12:43:17 UTC 2016


On Thu, May 26, 2016 at 8:41 AM, Hans de Goede <hdegoede at redhat.com> wrote:
> Hi,
>
>
> On 26-05-16 04:44, Ilia Mirkin wrote:
>>
>> 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 <imirkin at alum.mit.edu>
>> ---
>>  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 869040c..da2fa4b 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));
>>              }
>>
>
> This patch does not seem to actually change anything, you've just moved the
> exact
> same declaration to 2 places ... ?

If loadUboInfo64 had no side-effects you'd be right. However it
inserts instructions into the current (builder's) bb.

  -ilia


More information about the mesa-dev mailing list