summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/intel/compiler/brw_fs_reg_allocate.cpp19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/intel/compiler/brw_fs_reg_allocate.cpp b/src/intel/compiler/brw_fs_reg_allocate.cpp
index 5c6f3d490f0..c981d72e4f2 100644
--- a/src/intel/compiler/brw_fs_reg_allocate.cpp
+++ b/src/intel/compiler/brw_fs_reg_allocate.cpp
@@ -806,7 +806,7 @@ emit_spill(const fs_builder &bld, fs_reg src,
int
fs_visitor::choose_spill_reg(struct ra_graph *g)
{
- float loop_scale = 1.0;
+ float block_scale = 1.0;
float spill_costs[this->alloc.count];
bool no_spill[this->alloc.count];
@@ -822,23 +822,32 @@ fs_visitor::choose_spill_reg(struct ra_graph *g)
foreach_block_and_inst(block, fs_inst, inst, cfg) {
for (unsigned int i = 0; i < inst->sources; i++) {
if (inst->src[i].file == VGRF)
- spill_costs[inst->src[i].nr] += loop_scale;
+ spill_costs[inst->src[i].nr] += block_scale;
}
if (inst->dst.file == VGRF)
spill_costs[inst->dst.nr] += DIV_ROUND_UP(inst->size_written, REG_SIZE)
- * loop_scale;
+ * block_scale;
switch (inst->opcode) {
case BRW_OPCODE_DO:
- loop_scale *= 10;
+ block_scale *= 10;
break;
case BRW_OPCODE_WHILE:
- loop_scale /= 10;
+ block_scale /= 10;
break;
+ case BRW_OPCODE_IF:
+ case BRW_OPCODE_IFF:
+ block_scale *= 0.5;
+ break;
+
+ case BRW_OPCODE_ENDIF:
+ block_scale /= 0.5;
+ break;
+
case SHADER_OPCODE_GEN4_SCRATCH_WRITE:
if (inst->src[0].file == VGRF)
no_spill[inst->src[0].nr] = true;