[Mesa-dev] [PATCH 5/5] i965/fs: Debug the optimization passes by dumping instr to file.

Kenneth Graunke kenneth at whitecape.org
Sun Apr 13 00:16:19 PDT 2014


On 04/11/2014 10:29 PM, Matt Turner wrote:
> 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-00-00-start
>    fs8-00-01-04-opt_copy_propagate
>    fs8-00-01-06-dead_code_eliminate
>    fs8-00-01-12-compute_to_mrf
>    fs8-00-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.
> ---
>  src/mesa/drivers/dri/i965/brw_fs.cpp | 56 +++++++++++++++++++++++++++---------
>  1 file changed, 43 insertions(+), 13 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index c1d79e1..666cfa5b 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -1704,6 +1704,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));
> @@ -3258,25 +3261,52 @@ fs_visitor::run()
>  
>        opt_drop_redundant_mov_to_flags();
>  
> +#define OPT(pass, args...)                                                 \
> +   ({                                                                      \
> +      pass_num++;                                                          \
> +      bool progress = pass(args);                                          \
> +                                                                           \
> +      if (unlikely(INTEL_DEBUG & DEBUG_OPTIMIZER) && progress) {           \
> +         char filename[64];                                                \
> +         snprintf(filename, 64, "fs%d-%02d-%02d-%02d-" #pass,              \
> +                  dispatch_width, shader_prog->Name, iteration, pass_num); \
> +                                                                           \
> +         backend_visitor::dump_instructions(filename);                                      \
> +      }                                                                    \
> +                                                                           \
> +      progress;                                                            \
> +   })

I like the use of the macro.  But...folding in the "progress = ... ||
progress" might be nice too.  It would also let us stick to standard C
here, rather than GNU extensions.

> +
> +      if (unlikely(INTEL_DEBUG & DEBUG_OPTIMIZER)) {
> +         char filename[64];
> +         snprintf(filename, 64, "fs%d-%02d-00-start",
> +                  dispatch_width, shader_prog->Name);

I am really unexcited about fixed length buffers, although you did do
snprintf, and it'll probably not be a problem in practice.  Why not just
asprintf or ralloc_asprintf it and then free it?  It's no more code and
will just work.

> +
> +         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 = dead_code_eliminate_local() || 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;
> +         progress = OPT(remove_duplicate_mrf_writes) || progress;
> +
> +         progress = OPT(opt_algebraic) || progress;
> +         progress = OPT(opt_cse) || progress;
> +         progress = OPT(opt_copy_propagate) || progress;
> +         progress = OPT(opt_peephole_predicated_break) || progress;
> +         progress = OPT(dead_code_eliminate) || progress;
> +         progress = OPT(dead_code_eliminate_local) || progress;
> +         progress = OPT(opt_peephole_sel) || progress;
> +         progress = OPT(dead_control_flow_eliminate, this) || progress;
> +         progress = OPT(opt_saturate_propagation) || progress;
> +         progress = OPT(register_coalesce) || progress;
> +         progress = OPT(compute_to_mrf) || progress;
>        } while (progress);
>  
>        lower_uniform_pull_constant_loads();
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140413/a3440d69/attachment.sig>


More information about the mesa-dev mailing list