[Mesa-dev] [PATCH 2/2] nir: implement the GLSL equivalent of if simplication in nir_opt_if

Timothy Arceri tarceri at itsqueeze.com
Fri Jun 1 03:09:58 UTC 2018



On 01/06/18 13:08, Timothy Arceri wrote:
> On 30/05/18 22:21, Samuel Pitoiset wrote:
>> This pass turns:
>>
>>     if (cond) {
>>     } else {
>>        do_work();
>>     }
>>
>> into:
>>
>>     if (!cond) {
>>        do_work();
>>     } else {
>>     }
>>
>> Here's the vkpipeline-db stats (from affected shaders) on Polaris10:
>>
>> Totals from affected shaders:
>> SGPRS: 17272 -> 17296 (0.14 %)
>> VGPRS: 18712 -> 18740 (0.15 %)
>> Spilled SGPRs: 1179 -> 1142 (-3.14 %)
>> Code Size: 1503364 -> 1515176 (0.79 %) bytes
>> Max Waves: 916 -> 911 (-0.55 %)
>>
>> This pass only affects Serious Sam 2017 (Vulkan) on my side. The
>> stats are not really good for now. Some shaders look quite dumb
>> but this will be improved with further NIR passes, like ifs
>> combination.
>>
>> Cc: Ian Romanick <ian.d.romanick at intel.com>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>   src/compiler/nir/nir_opt_if.c | 98 +++++++++++++++++++++++++++++++++--
>>   1 file changed, 93 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/compiler/nir/nir_opt_if.c 
>> b/src/compiler/nir/nir_opt_if.c
>> index 68dacea770..b11c1852de 100644
>> --- a/src/compiler/nir/nir_opt_if.c
>> +++ b/src/compiler/nir/nir_opt_if.c
>> @@ -22,6 +22,7 @@
>>    */
>>   #include "nir.h"
>> +#include "nir/nir_builder.h"
>>   #include "nir_control_flow.h"
>>   /**
>> @@ -201,7 +202,90 @@ opt_peel_loop_initial_if(nir_loop *loop)
>>   }
>>   static bool
>> -opt_if_cf_list(struct exec_list *cf_list)
>> +is_block_empty(nir_block *block)
>> +{
>> +   return nir_cf_node_is_last(&block->cf_node) &&
>> +          exec_list_is_empty(&block->instr_list);
>> +}
>> +
>> +/**
>> + * This optimization turns:
>> + *
>> + *     if (cond) {
>> + *     } else {
>> + *         do_work();
>> + *     }
>> + *
>> + * into:
>> + *
>> + *     if (!cond) {
>> + *         do_work();
>> + *     } else {
>> + *     }
>> + */
>> +static bool
>> +opt_if_simplification(nir_builder *b, nir_if *nif)
>> +{
>> +   nir_instr *src_instr;

One more nit please just declare this where its first used.



More information about the mesa-dev mailing list