summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schürmann <daniel@schuermann.dev>2022-05-25 16:12:19 +0200
committerDylan Baker <dylan.c.baker@intel.com>2022-06-01 13:18:43 -0700
commit4a846d12d1ce9a882d95528bdaa51ca09b805607 (patch)
tree97e7d09c0bb17c2a9e9915d9e748073afa308761
parent3e5aa02ee455835a2ea8bb316f68314e9c49511b (diff)
downloadmesa-staging/22.0.tar.gz
aco: fix spilling of phis without temp operandsstaging/22.0
These were spilled unconditionally. Cc: mesa-stable Reviewed-by: Rhys Perry <pendingchaos02@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16708> (cherry picked from commit 8e41c66639f20671957ffd8cacd7c7328920848e)
-rw-r--r--.pick_status.json2
-rw-r--r--src/amd/compiler/aco_spill.cpp23
2 files changed, 11 insertions, 14 deletions
diff --git a/.pick_status.json b/.pick_status.json
index 8d8bea78190..6f4434ec550 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -228,7 +228,7 @@
"description": "aco: fix spilling of phis without temp operands",
"nominated": true,
"nomination_type": 0,
- "resolution": 0,
+ "resolution": 1,
"because_sha": null
},
{
diff --git a/src/amd/compiler/aco_spill.cpp b/src/amd/compiler/aco_spill.cpp
index ce1d830920b..cfb74e84a0b 100644
--- a/src/amd/compiler/aco_spill.cpp
+++ b/src/amd/compiler/aco_spill.cpp
@@ -697,25 +697,22 @@ init_live_in_vars(spill_ctx& ctx, Block* block, unsigned block_idx)
std::vector<unsigned>& preds =
phi->opcode == aco_opcode::p_phi ? block->logical_preds : block->linear_preds;
- bool spill = true;
-
+ bool is_all_spilled = true;
for (unsigned i = 0; i < phi->operands.size(); i++) {
- /* non-temp operands can increase the register pressure */
- if (!phi->operands[i].isTemp()) {
- partial_spills.insert(phi->definitions[0].getTemp());
+ if (phi->operands[i].isUndefined())
continue;
- }
-
- if (!ctx.spills_exit[preds[i]].count(phi->operands[i].getTemp()))
- spill = false;
- else
- partial_spills.insert(phi->definitions[0].getTemp());
+ is_all_spilled &= phi->operands[i].isTemp() &&
+ ctx.spills_exit[preds[i]].count(phi->operands[i].getTemp());
}
- if (spill) {
+
+ if (is_all_spilled) {
+ /* The phi is spilled at all predecessors. Keep it spilled. */
ctx.spills_entry[block_idx][phi->definitions[0].getTemp()] =
ctx.allocate_spill_id(phi->definitions[0].regClass());
- partial_spills.erase(phi->definitions[0].getTemp());
spilled_registers += phi->definitions[0].getTemp();
+ } else {
+ /* Phis might increase the register pressure. */
+ partial_spills.insert(phi->definitions[0].getTemp());
}
}