From: Eric Anholt Date: Sat, 4 Mar 2017 01:03:44 +0000 (-0800) Subject: vc4: Fix register pressure cost estimates when a src appears twice. X-Git-Tag: upstream/17.1.0~1592 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=615f6653b02829187bb8ddb38b12c34cb2976ef3;p=platform%2Fupstream%2Fmesa.git 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) --- diff --git a/src/gallium/drivers/vc4/vc4_qir_schedule.c b/src/gallium/drivers/vc4/vc4_qir_schedule.c index 89e6d1d..5118caf 100644 --- a/src/gallium/drivers/vc4/vc4_qir_schedule.c +++ b/src/gallium/drivers/vc4/vc4_qir_schedule.c @@ -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;