aco: ensure predecessors' p_logical_end is in WQM when a p_phi is in WQM

We want any copies to be in WQM. I don't know if this fixes any real
application, but I can create a vkrunner test than reproduces the issue.

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Fixes: 93c8ebfa78 ('aco: Initial commit of independent AMD compiler')
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3273>
This commit is contained in:
Rhys Perry
2020-01-02 19:13:53 +00:00
committed by Marge Bot
parent 9be9fd8591
commit 2d7386a2d0
+10 -1
View File
@@ -84,6 +84,7 @@ struct block_info {
std::vector<WQMState> instr_needs;
uint8_t block_needs;
uint8_t ever_again_needs;
bool logical_end_wqm;
/* more... */
};
@@ -238,8 +239,16 @@ void get_block_needs(wqm_ctx &ctx, exec_ctx &exec_ctx, Block* block)
/* ensure the condition controlling the control flow for this phi is in WQM */
if (needs == WQM && instr->opcode == aco_opcode::p_phi) {
for (unsigned pred_idx : block->logical_preds)
for (unsigned pred_idx : block->logical_preds) {
mark_block_wqm(ctx, pred_idx);
exec_ctx.info[pred_idx].logical_end_wqm = true;
ctx.worklist.insert(pred_idx);
}
}
if (instr->opcode == aco_opcode::p_logical_end && info.logical_end_wqm) {
assert(needs == Unspecified);
needs = WQM;
}
instr_needs[i] = needs;