diff options
author | Matt Turner <[email protected]> | 2014-04-07 10:25:50 -0700 |
---|---|---|
committer | Matt Turner <[email protected]> | 2014-06-01 13:18:52 -0700 |
commit | 55bd8b8b660f983b486e699ca74fe5652297331d (patch) | |
tree | 743de296b59dc4fcd03afd369aeabf91bd8b7d0a /src/mesa | |
parent | e9bf1662b048e5927f841e84719a3180650a2b0a (diff) |
i965/fs: Debug the optimization passes by dumping instr to file.
With INTEL_DEBUG=optimizer, write the output of dump_instructions() to a
file each time an optimization pass makes progress. This lets you easily
diff successive files to see what an optimization pass did.
Example filenames written when running glxgears:
fs8-0000-00-start
fs8-0000-01-04-opt_copy_propagate
fs8-0000-01-06-dead_code_eliminate
fs8-0000-01-12-compute_to_mrf
fs8-0000-02-06-dead_code_eliminate
| | | |
| | | `-- optimization pass name
| | |
| | `-- optimization pass number in the loop
| |
| `-- optimization loop interation
|
`-- shader program number
Note that with INTEL_DEBUG=optimizer, we disable compact_virtual_grfs,
so that we can diff instruction lists across loop interations without
the register numbers being changes.
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 53 |
1 files changed, 41 insertions, 12 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index c9b31fef5b2..1a83c8c2c2c 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -1714,6 +1714,9 @@ fs_visitor::split_virtual_grfs() void fs_visitor::compact_virtual_grfs() { + if (unlikely(INTEL_DEBUG & DEBUG_OPTIMIZER)) + return; + /* Mark which virtual GRFs are used, and count how many. */ int remap_table[this->virtual_grf_count]; memset(remap_table, -1, sizeof(remap_table)); @@ -3020,24 +3023,50 @@ fs_visitor::run() opt_drop_redundant_mov_to_flags(); +#define OPT(pass, args...) do { \ + pass_num++; \ + bool this_progress = pass(args); \ + \ + if (unlikely(INTEL_DEBUG & DEBUG_OPTIMIZER) && this_progress) { \ + char filename[64]; \ + snprintf(filename, 64, "fs%d-%04d-%02d-%02d-" #pass, \ + dispatch_width, shader_prog->Name, iteration, pass_num); \ + \ + backend_visitor::dump_instructions(filename); \ + } \ + \ + progress = progress || this_progress; \ + } while (false) + + if (unlikely(INTEL_DEBUG & DEBUG_OPTIMIZER)) { + char filename[64]; + snprintf(filename, 64, "fs%d-%04d-00-start", + dispatch_width, shader_prog->Name); + + backend_visitor::dump_instructions(filename); + } + bool progress; + int iteration = 0; do { progress = false; + iteration++; + int pass_num = 0; compact_virtual_grfs(); - progress = remove_duplicate_mrf_writes() || progress; - - progress = opt_algebraic() || progress; - progress = opt_cse() || progress; - progress = opt_copy_propagate() || progress; - progress = opt_peephole_predicated_break() || progress; - progress = dead_code_eliminate() || progress; - progress = opt_peephole_sel() || progress; - progress = dead_control_flow_eliminate(this) || progress; - progress = opt_saturate_propagation() || progress; - progress = register_coalesce() || progress; - progress = compute_to_mrf() || progress; + OPT(remove_duplicate_mrf_writes); + + OPT(opt_algebraic); + OPT(opt_cse); + OPT(opt_copy_propagate); + OPT(opt_peephole_predicated_break); + OPT(dead_code_eliminate); + OPT(opt_peephole_sel); + OPT(dead_control_flow_eliminate, this); + OPT(opt_saturate_propagation); + OPT(register_coalesce); + OPT(compute_to_mrf); } while (progress); lower_uniform_pull_constant_loads(); |