summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrancisco Jerez <[email protected]>2016-04-30 15:08:29 -0700
committerFrancisco Jerez <[email protected]>2016-05-29 23:41:38 -0700
commitd5f2f32b118331070507faf292bbe3da2671df4b (patch)
treeefe87dc546fab579386fba3ba2011d5a8484dba6
parente9eb59ba680a49d210966f4a3d86b6b5ff0db6f2 (diff)
i965/fs: Run SIMD and logical send lowering after the optimization loop.
There are two reasons why this is useful: - It avoids the introduction of an amount of partial writes emitted by the SIMD lowering pass to zip and unzip register regions early during optimization, which can make subsequent optimization less effective. - It substantially reduces the burden on the compiler when a large fraction of the instructions in the program need to be split (e.g. during SIMD32 builds). Individual halves of split instructions will be optimized identically (if they can still be optimized at all), so doing it up front can duplicate the amount of instructions the optimizer has to deal with which causes the compilation time to explode in some cases due to the worse-than-linear runtime behaviour of the back-end. It seems helpful to re-run a few optimization passes in cases where any of the lowering passes was able to make progress. Reviewed-by: Jason Ekstrand <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs.cpp29
1 files changed, 25 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 0b350d5ff76..6340d3a1a39 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -5684,9 +5684,6 @@ fs_visitor::optimize()
OPT(opt_drop_redundant_mov_to_flags);
- OPT(lower_simd_width);
- OPT(lower_logical_sends);
-
do {
progress = false;
pass_num = 0;
@@ -5705,7 +5702,6 @@ fs_visitor::optimize()
OPT(opt_register_renaming);
OPT(opt_redundant_discard_jumps);
OPT(opt_saturate_propagation);
- OPT(opt_zero_samples);
OPT(register_coalesce);
OPT(compute_to_mrf);
OPT(eliminate_find_live_channel);
@@ -5713,8 +5709,33 @@ fs_visitor::optimize()
OPT(compact_virtual_grfs);
} while (progress);
+ progress = false;
pass_num = 0;
+ OPT(lower_simd_width);
+ OPT(lower_logical_sends);
+
+ if (progress) {
+ OPT(opt_copy_propagate);
+ /* Only run after logical send lowering because it's easier to implement
+ * in terms of physical sends.
+ */
+ if (OPT(opt_zero_samples))
+ OPT(opt_copy_propagate);
+ /* Run after logical send lowering to give it a chance to CSE the
+ * LOAD_PAYLOAD instructions created to construct the payloads of
+ * e.g. texturing messages in cases where it wasn't possible to CSE the
+ * whole logical instruction.
+ */
+ OPT(opt_cse);
+ OPT(register_coalesce);
+ OPT(compute_to_mrf);
+ OPT(dead_code_eliminate);
+ OPT(remove_duplicate_mrf_writes);
+ OPT(opt_peephole_sel);
+ OPT(opt_redundant_discard_jumps);
+ }
+
OPT(opt_sampler_eot);
if (OPT(lower_load_payload)) {