summaryrefslogtreecommitdiff
path: root/src/amd/compiler/aco_live_var_analysis.cpp
diff options
context:
space:
mode:
authorRhys Perry <pendingchaos02@gmail.com>2020-01-21 14:24:01 +0000
committerMarge Bot <eric+marge@anholt.net>2020-01-22 15:55:00 +0000
commit3f96a1ed86ca295d8786da84b195211cb3b383ff (patch)
treeb1862dfac5f39ea8bc65b4a41d8a951640fb6022 /src/amd/compiler/aco_live_var_analysis.cpp
parent5b810c7de303e32900fed18b1303648eb74a6415 (diff)
downloadmesa-3f96a1ed86ca295d8786da84b195211cb3b383ff.tar.gz
aco: fix operand kill flags when a temporary is used more than once
Helps create v_mac_f32 from v_mad_f32(b, a, b) Totals from affected shaders: SGPRS: 35824 -> 35824 (0.00 %) VGPRS: 33460 -> 33456 (-0.01 %) Spilled SGPRs: 0 -> 0 (0.00 %) Spilled VGPRs: 0 -> 0 (0.00 %) Private memory VGPRs: 0 -> 0 (0.00 %) Scratch size: 0 -> 0 (0.00 %) dwords per thread Code Size: 2187264 -> 2180976 (-0.29 %) bytes LDS: 127 -> 127 (0.00 %) blocks Max Waves: 3802 -> 3802 (0.00 %) Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3486> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3486>
Diffstat (limited to 'src/amd/compiler/aco_live_var_analysis.cpp')
-rw-r--r--src/amd/compiler/aco_live_var_analysis.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/amd/compiler/aco_live_var_analysis.cpp b/src/amd/compiler/aco_live_var_analysis.cpp
index 44a3ea53430..c00325b92b7 100644
--- a/src/amd/compiler/aco_live_var_analysis.cpp
+++ b/src/amd/compiler/aco_live_var_analysis.cpp
@@ -111,6 +111,12 @@ void process_live_temps_per_block(Program *program, live& lives, Block* block,
if (insn->opcode == aco_opcode::p_logical_end) {
new_demand.sgpr += phi_sgpr_ops[block->index];
} else {
+ /* we need to do this in a separate loop because the next one can
+ * setKill() for several operands at once and we don't want to
+ * overwrite that in a later iteration */
+ for (Operand& op : insn->operands)
+ op.setKill(false);
+
for (unsigned i = 0; i < insn->operands.size(); ++i)
{
Operand& operand = insn->operands[i];
@@ -130,8 +136,6 @@ void process_live_temps_per_block(Program *program, live& lives, Block* block,
}
}
new_demand += temp;
- } else {
- operand.setKill(false);
}
if (operand.isFixed() && operand.physReg() == exec)