[Mesa-dev] [PATCH v3 03/13] mesa/st/glsl_to_tgsi: Properly resolve life times simple if/else + use constructs

Nicolai Hähnle nhaehnle at gmail.com
Tue May 1 10:01:05 UTC 2018


On 28.04.2018 21:30, Gert Wollny wrote:
> in constructs like below, currently the live range estimation extends the live range
> of t unecessarily to the whole loop because it was not detected that t is
> unconditional written and later read only in the "if (a)" scope.
> 
>    while (foo)  {
>      ...
>      if (a) {
>         ...
>         if (b)
>           t = ...
>         else
>           t = ...
>         x = t;
>         ...
>      }
>       ...
>    }
> 
> This patch adds a unit test for this case and corrects the minimal live range estimation
> accordingly.
> 
> Signed-off-by: Gert Wollny <gw.fossdev at gmail.com>
> ---
>   .../state_tracker/st_glsl_to_tgsi_temprename.cpp   | 14 +++++++++++++
>   .../tests/test_glsl_to_tgsi_lifetime.cpp           | 23 ++++++++++++++++++++++
>   2 files changed, 37 insertions(+)
> 
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi_temprename.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi_temprename.cpp
> index 6921a643b7..56f812c8bf 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi_temprename.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi_temprename.cpp
> @@ -741,6 +741,20 @@ void temp_comp_access::record_else_write(const prog_scope& scope)
>            } else {
>               current_unpaired_if_write_scope = nullptr;
>            }
> +         /* Promote the first write scope to the enclosing scope because
> +          * the current IF/ELSE pair is now irrelevant for the analysis.
> +          * This is also required to evaluate the minimum life time for t in
> +          * {
> +          *    var t;
> +          *    if (a)
> +          *      t = ...
> +          *    else
> +          *      t = ...
> +          *    x = t;
> +          *    ...
> +          * }
> +          */
> +         first_write_scope = scope.parent();
>   
>            /* If some parent is IF/ELSE and in a loop then propagate the
>             * write to that scope. Otherwise the write is unconditional
> diff --git a/src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp b/src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp
> index acebfb8293..a9655379ee 100644
> --- a/src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp
> +++ b/src/mesa/state_tracker/tests/test_glsl_to_tgsi_lifetime.cpp
> @@ -794,6 +794,29 @@ TEST_F(LifetimeEvaluatorExactTest, WriteInIfElseBranchSecondIfInLoop)
>      run (code, temp_lt_expect({{-1,-1}, {2,9}}));
>   }
>   
> +/*
> +  Test for

Incomplete comment.

Cheers,
Nicolai


> +*/
> +
> +TEST_F(LifetimeEvaluatorExactTest, DeeplyNestedinLoop)
> +{
> +   const vector<FakeCodeline> code = {
> +      { TGSI_OPCODE_BGNLOOP },
> +      {   TGSI_OPCODE_UIF, {}, {in0}, {}},
> +      {     TGSI_OPCODE_FSEQ, {1}, {in1,in2}, {}},
> +      {     TGSI_OPCODE_UIF, {}, {1}, {}},
> +      {       TGSI_OPCODE_MOV, {2}, {in1}, {}},
> +      {     TGSI_OPCODE_ELSE },
> +      {       TGSI_OPCODE_MOV, {2}, {in2}, {}},
> +      {     TGSI_OPCODE_ENDIF },
> +      {     TGSI_OPCODE_MOV, {3}, {2}, {}},
> +      {   TGSI_OPCODE_ENDIF },
> +      {   TGSI_OPCODE_ADD, {out0}, {3, in1}, {}},
> +      { TGSI_OPCODE_ENDLOOP }
> +   };
> +   run (code, temp_lt_expect({{-1,-1}, {2,3}, {4, 8}, {0,11}}));
> +}
> +
>   /** Regression test for bug #104803,
>    *  Read and write in if/else path outside loop and later read in conditional
>    *  within a loop. The first write is to be considered the dominant write.
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list