[Mesa-dev] [PATCH 2/2] radeonsi: Allow dumping LLVM IR before optimization passes

Tom Stellard tom at stellard.net
Fri Feb 5 15:03:10 UTC 2016


On Fri, Feb 05, 2016 at 08:55:17AM -0500, Nicolai Hähnle wrote:
> On 04.02.2016 13:52, Tom Stellard wrote:
> > On Thu, Feb 04, 2016 at 09:15:26AM +0100, Nicolai Hähnle wrote:
> >> From: Nicolai Hähnle <nicolai.haehnle at 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.daenzer at amd.com> (original patch)
> >> Signed-off-by: Nicolai Hähnle <nicolai.haehnle at 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);
> >> +
> >> +	/* 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);
> >> +
> >
> > Is there any reason not to add the dump in  radeon_llvm_finalize_module()
> > after PromoteMem2Reg has run?  This would make the output readable by llc
> > and then you would only need to add the dump call in one place.
> 
> In addition to Michel's observation, that's not really possible anyway 
> because all the passes are run at once from LLVMRunFunctionPassManager, 
> the functions before just set things up.
> 

Ok, good point.  I think this is fine.

-Tom

> I did consider doing the dump from radeon_llvm_finalize_module, but the 
> function doesn't have (and probably shouldn't have) the information 
> needed to make the decision whether to dump or not, so IMO it's cleaner 
> this way.
> 
> Cheers,
> Nicolai
> 
> >
> > -Tom
> >
> >>   	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 at lists.freedesktop.org
> >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list