[Mesa-dev] [PATCH 0/6][RFC] glsl: Expand opt_minmax get_range
Ian Romanick
idr at freedesktop.org
Thu Oct 30 09:38:39 PDT 2014
On 10/29/2014 11:59 PM, Matt Turner wrote:
> On Wed, Oct 29, 2014 at 6:11 PM, Thomas Helland
> <thomashelland90 at gmail.com> wrote:
>> This series does some initial work to make expansion of
>> the get_range function a lot cleaner.
>> It also adds a couple simple initial ranges.
>> These patches are by no means perfect, but I hope
>> they will provide some feedback and ideas.
>> I'm hoping to expand this to do the following:
>> -Add get_range for most opcodes I can think of
>> -Add more utility functions to the constant_util file.
>> -Repurpose the file to optimize more than just min/max.
>> -Elimintate if's that we know the result of
>> -Whatever pops into my head
>
> Sounds good.
>
>> I have some questions about undefined behaviour regarding this.
>> Do we have anyway of signaling in our IR that
>> the variable is the result of undefined behaviour?
>>
>> In compilers like llvm, if I recall, they have a flag for this
>> so they can signal undefined behaviour and use whatever value
>> gives the most efficient code for its uses.(used in -ffast-math).
>>
>> A hypotetichal situation:
>> We find that we have sqrt(x) where x has upper bound < 0.
>> The spec says the behavior is undefined for x < 0.
>> The same applies for inverse sqrt, log, log2 and pow.
>> How should this be handled?
>> Should a warning be issued?
>> Could we simplify this to a constant 0?
>> That would allow more optimizations to occur.
>
> That's probably what I'd try first.
>
> I applied your series and ran our internal shader-db through it. The
> good news is that it helps some programs!
>
> The bad news is that it hurts even more programs. I randomly selected
> two, and the relevant diffs looked like this:
>
> -math.sat exp(8) g91<1>F g86<8,8,1>F null {
> align1 1Q compacted };
> +math exp(8) g91<1>F g85<8,8,1>F null {
> align1 1Q compacted };
> +sel.l(8) g92<1>F g91<8,8,1>F 1F { align1 1Q };
>
> So we're saying we know the result of exp() must be >= 0, so no need
> to handle the lower bound. Instead just clamp the top. Except saturate
> is free and just clamping the top is not.
>
> Disabling ir_unop_exp/ir_unop_exp2 from patch 6/6 shows some programs
> actually do benefit from this optimization though. Before, they did
> things like:
>
> math exp(8) g17<1>F g14<8,8,1>F null {
> align1 1Q compacted };
> sel.ge(8) g124<1>F g17<8,8,1>F 0F {
> align1 1Q compacted };
>
> That tells me that there are gains to be had here. We just have to
> figure out how.
>
> I'm not exactly sure how the best way to handle this is, but it seems
> like we want to trim useless clamps *iff* they cannot be paired with
> another to form a saturate.
Would it be sufficient to do ir_unop_saturate generation before this
pass? Or is the pass breaking the saturate up? Also... wasn't Eric
saying his platform didn't have free saturates?
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list