Mesa (master): mesa/st/glsl_to_tgsi: Properly resolve life times simple if/else + use constructs

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Aug 11 11:33:30 UTC 2018


Module: Mesa
Branch: master
Commit: f40c9d02254cd26d2ff92e3f42825fcd7badad92
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f40c9d02254cd26d2ff92e3f42825fcd7badad92

Author: Gert Wollny <gw.fossdev at gmail.com>
Date:   Tue Jun  5 22:26:37 2018 +0200

mesa/st/glsl_to_tgsi: Properly resolve life times simple if/else + use constructs

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.

v4: update comments
Signed-off-by: Gert Wollny <gw.fossdev at gmail.com>
Acked-by: Dave Airlie <airlied at redhat.com>

---

 .../state_tracker/st_glsl_to_tgsi_temprename.cpp   | 14 ++++++++++++
 .../tests/test_glsl_to_tgsi_lifetime.cpp           | 25 ++++++++++++++++++++++
 2 files changed, 39 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..8f572ecd2d 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..fcd5fda14e 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,31 @@ TEST_F(LifetimeEvaluatorExactTest, WriteInIfElseBranchSecondIfInLoop)
    run (code, temp_lt_expect({{-1,-1}, {2,9}}));
 }
 
+/* Within an IF clause within a loop test that if a write occured in both
+ * branches of a nested IF/ELSE clause, followed by the last read within the
+ * enclosing IF or ELSE clause, the combined read is registered as unconditional,
+ * i.e.that it doesn't extend its live range beyond that enclosing IF or ELSE
+ * clause.
+ */
+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.




More information about the mesa-commit mailing list