vc4: Fix register pressure cost estimates when a src appears twice.

This ended up confusing the scheduler for things like fabs (implemented as
fmaxabs x, x) or squaring a number, and it would try to avoid scheduling
them because it appeared more expensive than other instructions.

Fixes failure to register allocate in
dEQP-GLES2.functional.uniform_api.random.3 with almost no shader-db
effects (+.35% max temps)
This commit is contained in:
Eric Anholt 2017-03-03 17:03:44 -08:00
parent 0fca01d027
commit 615f6653b0

View file

@ -434,10 +434,20 @@ get_register_pressure_cost(struct schedule_state *state, struct qinst *inst)
cost--;
for (int i = 0; i < qir_get_nsrc(inst); i++) {
if (inst->src[i].file == QFILE_TEMP &&
!BITSET_TEST(state->temp_live, inst->src[i].index)) {
cost++;
if (inst->src[i].file != QFILE_TEMP ||
BITSET_TEST(state->temp_live, inst->src[i].index)) {
continue;
}
bool already_counted = false;
for (int j = 0; j < i; j++) {
if (inst->src[i].file == inst->src[j].file &&
inst->src[i].index == inst->src[j].index) {
already_counted = true;
}
}
if (!already_counted)
cost++;
}
return cost;