summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2011-01-18 01:08:51 -0800
committerEric Anholt <eric@anholt.net>2011-01-18 10:17:50 -0800
commitd5a53ad271396257ee037a56cb10ba9382460705 (patch)
tree868dca46ecba922e000795e5c3d5e6a27dd0bba4 /src
parentea8e21856e88863913e97ef90d89cf76894c5aeb (diff)
ra: Take advantage of the adjacency list in finding a node to spill.
This revealed a bug in ra_get_spill_benefit where we only considered the benefit of the first adjacency we were to remove, explaining some of the ugly spilling I've seen in shaders. Because of the reduced spilling, it reduces the runtime of glsl-fs-convolution-1 36.9% +/- 0.9% (n=5).
Diffstat (limited to 'src')
-rw-r--r--src/mesa/program/register_allocate.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/mesa/program/register_allocate.c b/src/mesa/program/register_allocate.c
index 634a7dacb2..f984e2f140 100644
--- a/src/mesa/program/register_allocate.c
+++ b/src/mesa/program/register_allocate.c
@@ -401,17 +401,17 @@ ra_get_spill_benefit(struct ra_graph *g, unsigned int n)
float benefit = 0;
int n_class = g->nodes[n].class;
- /* Define the benefit of eliminating an interference between n, j
+ /* Define the benefit of eliminating an interference between n, n2
* through spilling as q(C, B) / p(C). This is similar to the
* "count number of edges" approach of traditional graph coloring,
* but takes classes into account.
*/
- for (j = 0; j < g->count; j++) {
- if (j != n && g->nodes[n].adjacency[j]) {
- unsigned int j_class = g->nodes[j].class;
- benefit += ((float)g->regs->classes[n_class]->q[j_class] /
+ for (j = 0; j < g->nodes[n].adjacency_count; j++) {
+ unsigned int n2 = g->nodes[n].adjacency_list[j];
+ if (n != n2) {
+ unsigned int n2_class = g->nodes[n2].class;
+ benefit += ((float)g->regs->classes[n_class]->q[n2_class] /
g->regs->classes[n_class]->p);
- break;
}
}