[Mesa-dev] [PATCH] nv50/ir: make sure to erase src2 after optimizing to MOV

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed Nov 9 15:10:46 UTC 2016



On 11/09/2016 03:58 PM, Ilia Mirkin wrote:
> On Wed, Nov 9, 2016 at 9:20 AM, Samuel Pitoiset
> <samuel.pitoiset at gmail.com> wrote:
>> For all instructions with 3 sources (like OP_SLCT), src2 needs
>> to be destroyed because srcExists(2) will return true although
>> it's actually undefined.
>>
>> Spotted with my ADD3 series.
>
> Sounds like the ADD3 series' addition to this function doesn't handle
> this scenario. It's already properly handled by FMA/MAD, for example.

Nope, it's correctly handled in expr() in my series.

In ConstantFolding::visit(BasicBlock *bb), I added a new opnd2() method 
which is used for folding ADD3(a,b,c)-> ADD3(b,a+c) or ->ADD3(a,b+c) 
because the pass doesn't currently implement such a case.

Though, opnd2() is called if srcExists(2) is true and if src0/src1 or 
src0/src2 are immediate values. But as this is done after the opnd3() 
call, if the instruction has been constant folded (just before) but src2 
not erased, it will try to get the immediates and crash... which is 
expected.

This just makes expr() more robust against that, and it's not entirely 
related to my series, because if you try to detect more scenarios where 
immediates can be folded *after* opnd3() you will hit the issue for sure.

src1 is already erased in expr(), I don't see why src2 should not be as 
well (when optimizing to SAT/MOV).

>
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>  src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 1 +
>>  1 file changed, 1 insertion(+)
>>
>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
>> index 9cf6ddc..ef31436 100644
>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
>> @@ -772,6 +772,7 @@ ConstantFolding::expr(Instruction *i,
>>        break;
>>     default:
>>        i->op = i->saturate ? OP_SAT : OP_MOV; /* SAT handled by unary() */
>> +      i->setSrc(2, NULL);
>>        break;
>>     }
>>     i->subOp = 0;
>> --
>> 2.10.2
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev

-- 
-Samuel


More information about the mesa-dev mailing list