[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