diff --git a/src/amd/compiler/aco_spill.cpp b/src/amd/compiler/aco_spill.cpp index 37d6b7408bb..ec29cd7efc0 100644 --- a/src/amd/compiler/aco_spill.cpp +++ b/src/amd/compiler/aco_spill.cpp @@ -548,6 +548,7 @@ init_live_in_vars(spill_ctx& ctx, Block* block, unsigned block_idx) Block::edge_vec& preds = phi->opcode == aco_opcode::p_phi ? block->logical_preds : block->linear_preds; + bool is_all_undef = true; bool is_all_spilled = true; bool is_partial_spill = false; for (unsigned i = 0; i < phi->operands.size(); i++) { @@ -557,9 +558,10 @@ init_live_in_vars(spill_ctx& ctx, Block* block, unsigned block_idx) ctx.spills_exit[preds[i]].count(phi->operands[i].getTemp()); is_all_spilled &= spilled; is_partial_spill |= spilled; + is_all_undef = false; } - if (is_all_spilled) { + if (is_all_spilled && !is_all_undef) { /* The phi is spilled at all predecessors. Keep it spilled. */ ctx.add_to_spills(phi->definitions[0].getTemp(), ctx.spills_entry[block_idx]); spilled_registers += phi->definitions[0].getTemp();