[Mesa-dev] [PATCH] glsl: Detect do-while-false loops and unroll them

Ian Romanick idr at freedesktop.org
Tue Feb 23 00:16:46 UTC 2016


On 02/22/2016 04:05 PM, Matt Turner wrote:
> On Mon, Feb 22, 2016 at 11:42 AM, Ian Romanick <idr at freedesktop.org> wrote:
>> From: Ian Romanick <ian.d.romanick at intel.com>
>>
>> Previously loops like
>>
>>    do {
>>       // ...
>>    } while (false);
>>
>> that did not have any other loop-branch instructions would not be
>> unrolled.  This is commonly used to wrap multiline preprocessor macros.
>>
>> This produces IR like
>>
>>     (loop (
>>        ...
>>        break
>>     ))
>>
>> Since limiting_terminator was NULL, the loop unroller would
>> throw up its hands and say, "I don't know how many iterations.  How
>> can I unroll this?"
>>
>> We can detect this another way.  If there is no limiting_terminator
>> and the only loop-branch is a break as the last IR, there's only one
>> iteration.
>>
>> On my very old checkout of shader-db, this removes a loop from Orbital
>> Explorer, but it does not otherwise affect the shader.  The loop removed
>> is the one the compiler inserts surrounding the switch statement.
> 
> Orbital Explorer has a dead while loop because of
> 
> commit 73dd50acf6d244979c2a657906aa56d3ac60d550
> Author: Tapani Pälli <tapani.palli at intel.com>
> Date:   Wed Aug 6 09:46:54 2014 +0300
> 
>     glsl: implement switch flow control using a loop
> 
> I don't understand how this patch interacts with that nor why it
> doesn't break Orbital Explorer rendering (I checked).
> 
> The Orbital Explorer shader *does* have other loop-branch
> instructions, so it seems like this patch shouldn't have affected it?

I will dig into this more.  There are a lot of break instructions in the
"before" IR, and they all disappear.  There's something fishy going on...



More information about the mesa-dev mailing list