[Mesa-dev] [PATCH 02/13] i965 vs: Make reg_allocate() return total_grf.
Paul Berry
stereotype441 at gmail.com
Wed Nov 16 11:07:09 PST 2011
Previously, reg_allocate() (and reg_allocate_trivial()) stored the
total number of registers allocated (including payload registers) in
vec4_visitor::total_grf. Now, it returns this value to
vec4_visitor::run(), which stores it in total_grf.
This helps pave the way for separating the IR visiting parts of
vec4_visitor (which include run()) from the code generation parts
(which include reg_allocate()) by making the data flow explicit
between them.
---
src/mesa/drivers/dri/i965/brw_vec4.h | 4 +-
src/mesa/drivers/dri/i965/brw_vec4_emit.cpp | 2 +-
.../drivers/dri/i965/brw_vec4_reg_allocate.cpp | 24 ++++++++++---------
3 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h
index c03bcad..b942284 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.h
+++ b/src/mesa/drivers/dri/i965/brw_vec4.h
@@ -390,8 +390,8 @@ public:
int setup_attributes(int payload_reg);
int setup_uniforms(int payload_reg);
void setup_payload();
- void reg_allocate_trivial();
- void reg_allocate();
+ int reg_allocate_trivial();
+ int reg_allocate();
void move_grf_array_access_to_scratch();
void move_uniform_array_access_to_pull_constants();
void move_push_constants_to_pull_constants();
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp
index 54bbe13..f2a100b 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp
@@ -657,7 +657,7 @@ vec4_visitor::run()
return false;
setup_payload();
- reg_allocate();
+ prog_data->total_grf = reg_allocate();
if (failed)
return false;
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_reg_allocate.cpp b/src/mesa/drivers/dri/i965/brw_vec4_reg_allocate.cpp
index 1ace91f..7848656 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_reg_allocate.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_reg_allocate.cpp
@@ -41,7 +41,7 @@ assign(int *reg_hw_locations, reg *reg)
}
}
-void
+int
vec4_visitor::reg_allocate_trivial()
{
int hw_reg_mapping[this->virtual_grf_count];
@@ -76,7 +76,7 @@ vec4_visitor::reg_allocate_trivial()
next += this->virtual_grf_sizes[i];
}
}
- prog_data->total_grf = next;
+ int total_grf = next;
foreach_iter(exec_list_iterator, iter, this->instructions) {
vec4_instruction *inst = (vec4_instruction *)iter.get();
@@ -87,10 +87,12 @@ vec4_visitor::reg_allocate_trivial()
assign(hw_reg_mapping, &inst->src[2]);
}
- if (prog_data->total_grf > BRW_MAX_GRF) {
+ if (total_grf > BRW_MAX_GRF) {
fail("Ran out of regs on trivial allocator (%d/%d)\n",
- prog_data->total_grf, BRW_MAX_GRF);
+ total_grf, BRW_MAX_GRF);
}
+
+ return total_grf;
}
static void
@@ -139,7 +141,7 @@ brw_alloc_reg_set_for_classes(struct brw_context *brw,
ra_set_finalize(brw->vs.regs);
}
-void
+int
vec4_visitor::reg_allocate()
{
int hw_reg_mapping[virtual_grf_count];
@@ -152,8 +154,7 @@ vec4_visitor::reg_allocate()
* register access as a result of broken optimization passes.
*/
if (0) {
- reg_allocate_trivial();
- return;
+ return reg_allocate_trivial();
}
calculate_live_intervals();
@@ -205,20 +206,19 @@ vec4_visitor::reg_allocate()
if (!ra_allocate_no_spills(g)) {
ralloc_free(g);
fail("No register spilling support yet\n");
- return;
+ return 0;
}
/* Get the chosen virtual registers for each node, and map virtual
* regs in the register classes back down to real hardware reg
* numbers.
*/
- prog_data->total_grf = first_assigned_grf;
+ int total_grf = first_assigned_grf;
for (int i = 0; i < virtual_grf_count; i++) {
int reg = ra_get_node_reg(g, i);
hw_reg_mapping[i] = first_assigned_grf + brw->vs.ra_reg_to_grf[reg];
- prog_data->total_grf = MAX2(prog_data->total_grf,
- hw_reg_mapping[i] + virtual_grf_sizes[i]);
+ total_grf = MAX2(total_grf, hw_reg_mapping[i] + virtual_grf_sizes[i]);
}
foreach_list(node, &this->instructions) {
@@ -231,6 +231,8 @@ vec4_visitor::reg_allocate()
}
ralloc_free(g);
+
+ return total_grf;
}
} /* namespace brw */
--
1.7.6.4
More information about the mesa-dev
mailing list