From b3f6690406ed6c427d0bedfd1be481ea224418e4 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 29 Oct 2013 12:18:10 -0700 Subject: [PATCH] i965/fs: Split "find what MRFs were used" to a helper function. I'm going to need to reuse this for fixing register spilling on SIMD16. Note that BRW_MAX_MRF is 16, which is the same as BRW_MAX_GRF - GEN7_MRF_HACK_START. Reviewed-by: Paul Berry --- src/mesa/drivers/dri/i965/brw_fs.h | 1 + .../drivers/dri/i965/brw_fs_reg_allocate.cpp | 33 ++++++++++++++----- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index 5f331e17a58..50a045e4b4b 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -289,6 +289,7 @@ public: void assign_urb_setup(); bool assign_regs(); void assign_regs_trivial(); + void get_used_mrfs(bool *mrf_used); void setup_payload_interference(struct ra_graph *g, int payload_reg_count, int first_payload_node); void setup_mrf_hack_interference(struct ra_graph *g, diff --git a/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp b/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp index 157c9ae4ffa..0b00b91694b 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp @@ -347,18 +347,20 @@ fs_visitor::setup_payload_interference(struct ra_graph *g, } /** - * Sets interference between virtual GRFs and usage of the high GRFs for SEND - * messages (treated as MRFs in code generation). + * Sets the mrf_used array to indicate which MRFs are used by the shader IR + * + * This is used in assign_regs() to decide which of the GRFs that we use as + * MRFs on gen7 get normally register allocated, and in register spilling to + * see if we can actually use MRFs to do spills without overwriting normal MRF + * contents. */ void -fs_visitor::setup_mrf_hack_interference(struct ra_graph *g, int first_mrf_node) +fs_visitor::get_used_mrfs(bool *mrf_used) { - int mrf_count = BRW_MAX_GRF - GEN7_MRF_HACK_START; int reg_width = dispatch_width / 8; - /* Identify all the MRFs used in the program. */ - bool mrf_used[mrf_count]; - memset(mrf_used, 0, sizeof(mrf_used)); + memset(mrf_used, 0, BRW_MAX_MRF * sizeof(bool)); + foreach_list(node, &this->instructions) { fs_inst *inst = (fs_inst *)node; @@ -380,9 +382,22 @@ fs_visitor::setup_mrf_hack_interference(struct ra_graph *g, int first_mrf_node) } } } +} - for (int i = 0; i < mrf_count; i++) { - /* Mark each payload reg node as being allocated to its physical register. +/** + * Sets interference between virtual GRFs and usage of the high GRFs for SEND + * messages (treated as MRFs in code generation). + */ +void +fs_visitor::setup_mrf_hack_interference(struct ra_graph *g, int first_mrf_node) +{ + int reg_width = dispatch_width / 8; + + bool mrf_used[BRW_MAX_MRF]; + get_used_mrfs(mrf_used); + + for (int i = 0; i < BRW_MAX_MRF; i++) { + /* Mark each MRF reg node as being allocated to its physical register. * * The alternative would be to have per-physical-register classes, which * would just be silly.