mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-08 10:40:11 +01:00
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@gmail.com>
Acked-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
568bda2f2d
commit
f40c9d0225
2 changed files with 39 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue