> On Feb 4, 2016, at 00:15, Nicolai Hähnle <nhaeh...@gmail.com> wrote:
> 
> From: Nicolai Hähnle <nicolai.haeh...@amd.com>
> 
> Set R600_DEBUG=preoptir to dump the LLVM IR before optimization passes,
> to allow diagnosing problems caused by optimization passes.
> 
> Note that in order to compile the resulting IR with llc, you will first
> have to run at least the mem2reg pass, e.g.
> 
> opt -mem2reg -S < shader.ll | llc -march=amdgcn -mcpu=bonaire
> 
> Signed-off-by: Michel Dänzer <michel.daen...@amd.com> (original patch)
> Signed-off-by: Nicolai Hähnle <nicolai.haeh...@amd.com> (w/ debug flag)
> ---
> Having the option is a good idea, but I prefer to have a separate debug
> flag for it so that when you try to analyze bugs in codegen (which in
> my experience happens more often) you don't have to worry about
> replicating the exact same sequence of optimizations manually via the
> command line to reproduce the problem there.
> 
> src/gallium/drivers/radeon/r600_pipe_common.c |  1 +
> src/gallium/drivers/radeon/r600_pipe_common.h |  1 +
> src/gallium/drivers/radeonsi/si_shader.c      | 16 ++++++++++++++--
> 3 files changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c 
> b/src/gallium/drivers/radeon/r600_pipe_common.c
> index c827dbd..a1432ed 100644
> --- a/src/gallium/drivers/radeon/r600_pipe_common.c
> +++ b/src/gallium/drivers/radeon/r600_pipe_common.c
> @@ -393,6 +393,7 @@ static const struct debug_named_value 
> common_debug_options[] = {
>       { "noir", DBG_NO_IR, "Don't print the LLVM IR"},
>       { "notgsi", DBG_NO_TGSI, "Don't print the TGSI"},
>       { "noasm", DBG_NO_ASM, "Don't print disassembled shaders"},
> +     { "preoptir", DBG_PREOPT_IR, "Print the LLVM IR before initial 
> optimizations" },
> 
>       /* features */
>       { "nodma", DBG_NO_ASYNC_DMA, "Disable asynchronous DMA" },
> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h 
> b/src/gallium/drivers/radeon/r600_pipe_common.h
> index c7e4c44..4e36631 100644
> --- a/src/gallium/drivers/radeon/r600_pipe_common.h
> +++ b/src/gallium/drivers/radeon/r600_pipe_common.h
> @@ -71,6 +71,7 @@
> #define DBG_NO_IR             (1 << 12)
> #define DBG_NO_TGSI           (1 << 13)
> #define DBG_NO_ASM            (1 << 14)
> +#define DBG_PREOPT_IR                (1 << 15)
> /* Bits 21-31 are reserved for the r600g driver. */
> /* features */
> #define DBG_NO_ASYNC_DMA      (1llu << 32)
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
> b/src/gallium/drivers/radeonsi/si_shader.c
> index 8b524cf..d9ed6b2 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -4092,7 +4092,7 @@ int si_compile_llvm(struct si_screen *sscreen,
>       if (r600_can_dump_shader(&sscreen->b, processor)) {
>               fprintf(stderr, "radeonsi: Compiling shader %d\n", count);
> 
> -             if (!(sscreen->b.debug_flags & DBG_NO_IR))
> +             if (!(sscreen->b.debug_flags & (DBG_NO_IR | DBG_PREOPT_IR)))
>                       LLVMDumpModule(mod);
>       }
> 
> @@ -4178,6 +4178,12 @@ static int si_generate_gs_copy_shader(struct si_screen 
> *sscreen,
>       si_llvm_export_vs(bld_base, outputs, gsinfo->num_outputs);
> 
>       LLVMBuildRetVoid(bld_base->base.gallivm->builder);

You might want to run the verifier if debugging (or maybe that should be a 
separate option)

> +
> +     /* Dump LLVM IR before any optimization passes */
> +     if (sscreen->b.debug_flags & DBG_PREOPT_IR &&
> +         r600_can_dump_shader(&sscreen->b, TGSI_PROCESSOR_GEOMETRY))
> +             LLVMDumpModule(bld_base->base.gallivm->module);
> +
>       radeon_llvm_finalize_module(&si_shader_ctx->radeon_bld);
> 
>       if (dump)
> @@ -4385,9 +4391,15 @@ int si_shader_create(struct si_screen *sscreen, 
> LLVMTargetMachineRef tm,
>       }
> 
>       LLVMBuildRetVoid(bld_base->base.gallivm->builder);
> +     mod = bld_base->base.gallivm->module;
> +
> +     /* Dump LLVM IR before any optimization passes */
> +     if (sscreen->b.debug_flags & DBG_PREOPT_IR &&
> +         r600_can_dump_shader(&sscreen->b, si_shader_ctx.type))
> +             LLVMDumpModule(mod);
> +
>       radeon_llvm_finalize_module(&si_shader_ctx.radeon_bld);
> 
> -     mod = bld_base->base.gallivm->module;
>       r = si_compile_llvm(sscreen, &shader->binary, &shader->config, tm,
>                           mod, debug, si_shader_ctx.type);
>       if (r) {
> -- 
> 2.5.0
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to