glsl_to_tgsi: fix a bug in eliminate_dead_code_advanced()

The bug, reported to me by Vadim Girlin on IRC, was causing overzealous
elimination of code in parallel if statements such as the following:

if (x) {
	r = false;
}
if (y) {
	r = true;
}

Before this commit, the assignment inside the first if block would be
misdetected as dead code and removed.
This commit is contained in:
Bryan Cain 2011-12-08 13:48:27 -06:00
parent 6cf7245f69
commit 20b0daf82d
1 changed files with 8 additions and 10 deletions

View File

@ -3514,25 +3514,23 @@ glsl_to_tgsi_visitor::eliminate_dead_code_advanced(void)
break;
case TGSI_OPCODE_ENDIF:
--level;
break;
case TGSI_OPCODE_ELSE:
/* Clear all channels written inside the preceding if block from the
* write array, but leave those that were not touched.
*
* FIXME: This destroys opportunities to remove dead code inside of
* IF blocks that are followed by an ELSE block.
/* Promote the recorded level all channels written inside the preceding
* if or else block to the level above the if/else block.
*/
for (int r = 0; r < this->next_temp; r++) {
for (int c = 0; c < 4; c++) {
if (!writes[4 * r + c])
continue;
if (write_level[4 * r + c] >= level)
writes[4 * r + c] = NULL;
if (write_level[4 * r + c] == level)
write_level[4 * r + c] = level-1;
}
}
if(inst->op == TGSI_OPCODE_ENDIF)
--level;
break;
case TGSI_OPCODE_IF: