[Mesa-dev] [PATCH 5/6] radeonsi: merge radeon_llvm_context and si_shader_context

Marek Olšák maraeo at gmail.com
Mon Oct 17 13:44:10 UTC 2016


From: Marek Olšák <marek.olsak at amd.com>

---
 src/gallium/drivers/radeonsi/si_shader.c           | 466 +++++++++------------
 src/gallium/drivers/radeonsi/si_shader_internal.h  |  89 +++-
 src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c  |   2 +-
 .../drivers/radeonsi/si_shader_tgsi_setup.c        |  52 +--
 4 files changed, 291 insertions(+), 318 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index e5612ad..bca07ac 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -51,91 +51,20 @@ static const char *scratch_rsrc_dword0_symbol =
 static const char *scratch_rsrc_dword1_symbol =
 	"SCRATCH_RSRC_DWORD1";
 
 struct si_shader_output_values
 {
 	LLVMValueRef values[4];
 	unsigned name;
 	unsigned sid;
 };
 
-struct si_shader_context
-{
-	struct radeon_llvm_context radeon_bld;
-	struct si_shader *shader;
-	struct si_screen *screen;
-
-	unsigned type; /* PIPE_SHADER_* specifies the type of shader. */
-	bool is_gs_copy_shader;
-
-	/* Whether to generate the optimized shader variant compiled as a whole
-	 * (without a prolog and epilog)
-	 */
-	bool is_monolithic;
-
-	int param_streamout_config;
-	int param_streamout_write_index;
-	int param_streamout_offset[4];
-	int param_vertex_id;
-	int param_rel_auto_id;
-	int param_vs_prim_id;
-	int param_instance_id;
-	int param_vertex_index0;
-	int param_tes_u;
-	int param_tes_v;
-	int param_tes_rel_patch_id;
-	int param_tes_patch_id;
-	int param_es2gs_offset;
-	int param_oc_lds;
-
-	/* Sets a bit if the dynamic HS control word was 0x80000000. The bit is
-	 * 0x800000 for VS, 0x1 for ES.
-	 */
-	int param_tess_offchip;
-
-	LLVMTargetMachineRef tm;
-
-	unsigned invariant_load_md_kind;
-	unsigned range_md_kind;
-	unsigned uniform_md_kind;
-	LLVMValueRef empty_md;
-
-	/* Preloaded descriptors. */
-	LLVMValueRef esgs_ring;
-	LLVMValueRef gsvs_ring[4];
-
-	LLVMValueRef lds;
-	LLVMValueRef gs_next_vertex[4];
-	LLVMValueRef return_value;
-
-	LLVMTypeRef voidt;
-	LLVMTypeRef i1;
-	LLVMTypeRef i8;
-	LLVMTypeRef i32;
-	LLVMTypeRef i64;
-	LLVMTypeRef i128;
-	LLVMTypeRef f32;
-	LLVMTypeRef v16i8;
-	LLVMTypeRef v2i32;
-	LLVMTypeRef v4i32;
-	LLVMTypeRef v4f32;
-	LLVMTypeRef v8i32;
-
-	LLVMValueRef shared_memory;
-};
-
-static struct si_shader_context *si_shader_context(
-	struct lp_build_tgsi_context *bld_base)
-{
-	return (struct si_shader_context *)bld_base;
-}
-
 static void si_init_shader_ctx(struct si_shader_context *ctx,
 			       struct si_screen *sscreen,
 			       struct si_shader *shader,
 			       LLVMTargetMachineRef tm);
 
 static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
 				 struct lp_build_tgsi_context *bld_base,
 				 struct lp_build_emit_data *emit_data);
 
 static void si_dump_shader_key(unsigned shader, union si_shader_key *key,
@@ -206,26 +135,26 @@ unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index)
 	}
 }
 
 /**
  * Get the value of a shader input parameter and extract a bitfield.
  */
 static LLVMValueRef unpack_param(struct si_shader_context *ctx,
 				 unsigned param, unsigned rshift,
 				 unsigned bitwidth)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
-	LLVMValueRef value = LLVMGetParam(ctx->radeon_bld.main_fn,
+	struct gallivm_state *gallivm = &ctx->gallivm;
+	LLVMValueRef value = LLVMGetParam(ctx->main_fn,
 					  param);
 
 	if (LLVMGetTypeKind(LLVMTypeOf(value)) == LLVMFloatTypeKind)
-		value = bitcast(&ctx->radeon_bld.soa.bld_base,
+		value = bitcast(&ctx->soa.bld_base,
 				TGSI_TYPE_UNSIGNED, value);
 
 	if (rshift)
 		value = LLVMBuildLShr(gallivm->builder, value,
 				      lp_build_const_int32(gallivm, rshift), "");
 
 	if (rshift + bitwidth < 32) {
 		unsigned mask = (1 << bitwidth) - 1;
 		value = LLVMBuildAnd(gallivm->builder, value,
 				     lp_build_const_int32(gallivm, mask), "");
@@ -234,21 +163,21 @@ static LLVMValueRef unpack_param(struct si_shader_context *ctx,
 	return value;
 }
 
 static LLVMValueRef get_rel_patch_id(struct si_shader_context *ctx)
 {
 	switch (ctx->type) {
 	case PIPE_SHADER_TESS_CTRL:
 		return unpack_param(ctx, SI_PARAM_REL_IDS, 0, 8);
 
 	case PIPE_SHADER_TESS_EVAL:
-		return LLVMGetParam(ctx->radeon_bld.main_fn,
+		return LLVMGetParam(ctx->main_fn,
 				    ctx->param_tes_rel_patch_id);
 
 	default:
 		assert(0);
 		return NULL;
 	}
 }
 
 /* Tessellation shaders pass outputs to the next shader using LDS.
  *
@@ -286,112 +215,112 @@ get_tcs_in_patch_stride(struct si_shader_context *ctx)
 
 static LLVMValueRef
 get_tcs_out_patch_stride(struct si_shader_context *ctx)
 {
 	return unpack_param(ctx, SI_PARAM_TCS_OUT_LAYOUT, 0, 13);
 }
 
 static LLVMValueRef
 get_tcs_out_patch0_offset(struct si_shader_context *ctx)
 {
-	return lp_build_mul_imm(&ctx->radeon_bld.soa.bld_base.uint_bld,
+	return lp_build_mul_imm(&ctx->soa.bld_base.uint_bld,
 				unpack_param(ctx,
 					     SI_PARAM_TCS_OUT_OFFSETS,
 					     0, 16),
 				4);
 }
 
 static LLVMValueRef
 get_tcs_out_patch0_patch_data_offset(struct si_shader_context *ctx)
 {
-	return lp_build_mul_imm(&ctx->radeon_bld.soa.bld_base.uint_bld,
+	return lp_build_mul_imm(&ctx->soa.bld_base.uint_bld,
 				unpack_param(ctx,
 					     SI_PARAM_TCS_OUT_OFFSETS,
 					     16, 16),
 				4);
 }
 
 static LLVMValueRef
 get_tcs_in_current_patch_offset(struct si_shader_context *ctx)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMValueRef patch_stride = get_tcs_in_patch_stride(ctx);
 	LLVMValueRef rel_patch_id = get_rel_patch_id(ctx);
 
 	return LLVMBuildMul(gallivm->builder, patch_stride, rel_patch_id, "");
 }
 
 static LLVMValueRef
 get_tcs_out_current_patch_offset(struct si_shader_context *ctx)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMValueRef patch0_offset = get_tcs_out_patch0_offset(ctx);
 	LLVMValueRef patch_stride = get_tcs_out_patch_stride(ctx);
 	LLVMValueRef rel_patch_id = get_rel_patch_id(ctx);
 
 	return LLVMBuildAdd(gallivm->builder, patch0_offset,
 			    LLVMBuildMul(gallivm->builder, patch_stride,
 					 rel_patch_id, ""),
 			    "");
 }
 
 static LLVMValueRef
 get_tcs_out_current_patch_data_offset(struct si_shader_context *ctx)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMValueRef patch0_patch_data_offset =
 		get_tcs_out_patch0_patch_data_offset(ctx);
 	LLVMValueRef patch_stride = get_tcs_out_patch_stride(ctx);
 	LLVMValueRef rel_patch_id = get_rel_patch_id(ctx);
 
 	return LLVMBuildAdd(gallivm->builder, patch0_patch_data_offset,
 			    LLVMBuildMul(gallivm->builder, patch_stride,
 					 rel_patch_id, ""),
 			    "");
 }
 
 static LLVMValueRef build_gep0(struct si_shader_context *ctx,
 			       LLVMValueRef base_ptr, LLVMValueRef index)
 {
 	LLVMValueRef indices[2] = {
 		LLVMConstInt(ctx->i32, 0, 0),
 		index,
 	};
-	return LLVMBuildGEP(ctx->radeon_bld.gallivm.builder, base_ptr,
+	return LLVMBuildGEP(ctx->gallivm.builder, base_ptr,
 			    indices, 2, "");
 }
 
 static void build_indexed_store(struct si_shader_context *ctx,
 				LLVMValueRef base_ptr, LLVMValueRef index,
 				LLVMValueRef value)
 {
-	struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base;
+	struct lp_build_tgsi_context *bld_base = &ctx->soa.bld_base;
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 
 	LLVMBuildStore(gallivm->builder, value,
 		       build_gep0(ctx, base_ptr, index));
 }
 
 /**
  * Build an LLVM bytecode indexed load using LLVMBuildGEP + LLVMBuildLoad.
  * It's equivalent to doing a load from &base_ptr[index].
  *
  * \param base_ptr  Where the array starts.
  * \param index     The element index into the array.
  * \param uniform   Whether the base_ptr and index can be assumed to be
  *                  dynamically uniform
  */
 static LLVMValueRef build_indexed_load(struct si_shader_context *ctx,
 				       LLVMValueRef base_ptr, LLVMValueRef index,
 				       bool uniform)
 {
-	struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base;
+	struct lp_build_tgsi_context *bld_base = &ctx->soa.bld_base;
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	LLVMValueRef pointer;
 
 	pointer = build_gep0(ctx, base_ptr, index);
 	if (uniform)
 		LLVMSetMetadata(pointer, ctx->uniform_md_kind, ctx->empty_md);
 	return LLVMBuildLoad(gallivm->builder, pointer, "");
 }
 
 /**
@@ -401,41 +330,41 @@ static LLVMValueRef build_indexed_load(struct si_shader_context *ctx,
 static LLVMValueRef build_indexed_load_const(
 	struct si_shader_context *ctx,
 	LLVMValueRef base_ptr, LLVMValueRef index)
 {
 	LLVMValueRef result = build_indexed_load(ctx, base_ptr, index, true);
 	LLVMSetMetadata(result, ctx->invariant_load_md_kind, ctx->empty_md);
 	return result;
 }
 
 static LLVMValueRef get_instance_index_for_fetch(
-	struct radeon_llvm_context *radeon_bld,
+	struct si_shader_context *radeon_bld,
 	unsigned param_start_instance, unsigned divisor)
 {
 	struct si_shader_context *ctx =
 		si_shader_context(&radeon_bld->soa.bld_base);
 	struct gallivm_state *gallivm = radeon_bld->soa.bld_base.base.gallivm;
 
 	LLVMValueRef result = LLVMGetParam(radeon_bld->main_fn,
 					   ctx->param_instance_id);
 
 	/* The division must be done before START_INSTANCE is added. */
 	if (divisor > 1)
 		result = LLVMBuildUDiv(gallivm->builder, result,
 				lp_build_const_int32(gallivm, divisor), "");
 
 	return LLVMBuildAdd(gallivm->builder, result,
 			    LLVMGetParam(radeon_bld->main_fn, param_start_instance), "");
 }
 
 static void declare_input_vs(
-	struct radeon_llvm_context *radeon_bld,
+	struct si_shader_context *radeon_bld,
 	unsigned input_index,
 	const struct tgsi_full_declaration *decl,
 	LLVMValueRef out[4])
 {
 	struct lp_build_context *base = &radeon_bld->soa.bld_base.base;
 	struct gallivm_state *gallivm = base->gallivm;
 	struct si_shader_context *ctx =
 		si_shader_context(&radeon_bld->soa.bld_base);
 	unsigned divisor =
 		ctx->shader->key.vs.prolog.instance_divisors[input_index];
@@ -444,42 +373,42 @@ static void declare_input_vs(
 
 	LLVMValueRef t_list_ptr;
 	LLVMValueRef t_offset;
 	LLVMValueRef t_list;
 	LLVMValueRef attribute_offset;
 	LLVMValueRef buffer_index;
 	LLVMValueRef args[3];
 	LLVMValueRef input;
 
 	/* Load the T list */
-	t_list_ptr = LLVMGetParam(ctx->radeon_bld.main_fn, SI_PARAM_VERTEX_BUFFERS);
+	t_list_ptr = LLVMGetParam(ctx->main_fn, SI_PARAM_VERTEX_BUFFERS);
 
 	t_offset = lp_build_const_int32(gallivm, input_index);
 
 	t_list = build_indexed_load_const(ctx, t_list_ptr, t_offset);
 
 	/* Build the attribute offset */
 	attribute_offset = lp_build_const_int32(gallivm, 0);
 
 	if (!ctx->is_monolithic) {
 		buffer_index = LLVMGetParam(radeon_bld->main_fn,
 					    ctx->param_vertex_index0 +
 					    input_index);
 	} else if (divisor) {
 		/* Build index from instance ID, start instance and divisor */
 		ctx->shader->info.uses_instanceid = true;
-		buffer_index = get_instance_index_for_fetch(&ctx->radeon_bld,
+		buffer_index = get_instance_index_for_fetch(ctx,
 							    SI_PARAM_START_INSTANCE,
 							    divisor);
 	} else {
 		/* Load the buffer index for vertices. */
-		LLVMValueRef vertex_id = LLVMGetParam(ctx->radeon_bld.main_fn,
+		LLVMValueRef vertex_id = LLVMGetParam(ctx->main_fn,
 						      ctx->param_vertex_id);
 		LLVMValueRef base_vertex = LLVMGetParam(radeon_bld->main_fn,
 							SI_PARAM_BASE_VERTEX);
 		buffer_index = LLVMBuildAdd(gallivm->builder, base_vertex, vertex_id, "");
 	}
 
 	args[0] = t_list;
 	args[1] = attribute_offset;
 	args[2] = buffer_index;
 	input = lp_build_intrinsic(gallivm->builder,
@@ -497,49 +426,49 @@ static void declare_input_vs(
 static LLVMValueRef get_primitive_id(struct lp_build_tgsi_context *bld_base,
 				     unsigned swizzle)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 
 	if (swizzle > 0)
 		return bld_base->uint_bld.zero;
 
 	switch (ctx->type) {
 	case PIPE_SHADER_VERTEX:
-		return LLVMGetParam(ctx->radeon_bld.main_fn,
+		return LLVMGetParam(ctx->main_fn,
 				    ctx->param_vs_prim_id);
 	case PIPE_SHADER_TESS_CTRL:
-		return LLVMGetParam(ctx->radeon_bld.main_fn,
+		return LLVMGetParam(ctx->main_fn,
 				    SI_PARAM_PATCH_ID);
 	case PIPE_SHADER_TESS_EVAL:
-		return LLVMGetParam(ctx->radeon_bld.main_fn,
+		return LLVMGetParam(ctx->main_fn,
 				    ctx->param_tes_patch_id);
 	case PIPE_SHADER_GEOMETRY:
-		return LLVMGetParam(ctx->radeon_bld.main_fn,
+		return LLVMGetParam(ctx->main_fn,
 				    SI_PARAM_PRIMITIVE_ID);
 	default:
 		assert(0);
 		return bld_base->uint_bld.zero;
 	}
 }
 
 /**
  * Return the value of tgsi_ind_register for indexing.
  * This is the indirect index with the constant offset added to it.
  */
 static LLVMValueRef get_indirect_index(struct si_shader_context *ctx,
 				       const struct tgsi_ind_register *ind,
 				       int rel_index)
 {
-	struct gallivm_state *gallivm = ctx->radeon_bld.soa.bld_base.base.gallivm;
+	struct gallivm_state *gallivm = ctx->soa.bld_base.base.gallivm;
 	LLVMValueRef result;
 
-	result = ctx->radeon_bld.soa.addr[ind->Index][ind->Swizzle];
+	result = ctx->soa.addr[ind->Index][ind->Swizzle];
 	result = LLVMBuildLoad(gallivm->builder, result, "");
 	result = LLVMBuildAdd(gallivm->builder, result,
 			      lp_build_const_int32(gallivm, rel_index), "");
 	return result;
 }
 
 /**
  * Like get_indirect_index, but restricts the return value to a (possibly
  * undefined) value inside [0..num).
  */
@@ -549,34 +478,34 @@ static LLVMValueRef get_bounded_indirect_index(struct si_shader_context *ctx,
 {
 	LLVMValueRef result = get_indirect_index(ctx, ind, rel_index);
 
 	/* LLVM 3.8: If indirect resource indexing is used:
 	 * - SI & CIK hang
 	 * - VI crashes
 	 */
 	if (HAVE_LLVM <= 0x0308)
 		return LLVMGetUndef(ctx->i32);
 
-	return radeon_llvm_bound_index(&ctx->radeon_bld, result, num);
+	return radeon_llvm_bound_index(ctx, result, num);
 }
 
 
 /**
  * Calculate a dword address given an input or output register and a stride.
  */
 static LLVMValueRef get_dw_address(struct si_shader_context *ctx,
 				   const struct tgsi_full_dst_register *dst,
 				   const struct tgsi_full_src_register *src,
 				   LLVMValueRef vertex_dw_stride,
 				   LLVMValueRef base_addr)
 {
-	struct gallivm_state *gallivm = ctx->radeon_bld.soa.bld_base.base.gallivm;
+	struct gallivm_state *gallivm = ctx->soa.bld_base.base.gallivm;
 	struct tgsi_shader_info *info = &ctx->shader->selector->info;
 	ubyte *name, *index, *array_first;
 	int first, param;
 	struct tgsi_full_dst_register reg;
 
 	/* Set the register description. The address computation is the same
 	 * for sources and destinations. */
 	if (src) {
 		reg.Register.File = src->Register.File;
 		reg.Register.Index = src->Register.Index;
@@ -660,21 +589,21 @@ static LLVMValueRef get_dw_address(struct si_shader_context *ctx,
  * - per patch attribute 0 of patch 0
  * - per patch attribute 0 of patch 1
  *   ...
  *
  * Note that every attribute has 4 components.
  */
 static LLVMValueRef get_tcs_tes_buffer_address(struct si_shader_context *ctx,
                                                LLVMValueRef vertex_index,
                                                LLVMValueRef param_index)
 {
-	struct gallivm_state *gallivm = ctx->radeon_bld.soa.bld_base.base.gallivm;
+	struct gallivm_state *gallivm = ctx->soa.bld_base.base.gallivm;
 	LLVMValueRef base_addr, vertices_per_patch, num_patches, total_vertices;
 	LLVMValueRef param_stride, constant16;
 
 	vertices_per_patch = unpack_param(ctx, SI_PARAM_TCS_OFFCHIP_LAYOUT, 9, 6);
 	num_patches = unpack_param(ctx, SI_PARAM_TCS_OFFCHIP_LAYOUT, 0, 9);
 	total_vertices = LLVMBuildMul(gallivm->builder, vertices_per_patch,
 	                              num_patches, "");
 
 	constant16 = lp_build_const_int32(gallivm, 16);
 	if (vertex_index) {
@@ -704,21 +633,21 @@ static LLVMValueRef get_tcs_tes_buffer_address(struct si_shader_context *ctx,
 		                         patch_data_offset, "");
 	}
 	return base_addr;
 }
 
 static LLVMValueRef get_tcs_tes_buffer_address_from_reg(
                                        struct si_shader_context *ctx,
                                        const struct tgsi_full_dst_register *dst,
                                        const struct tgsi_full_src_register *src)
 {
-	struct gallivm_state *gallivm = ctx->radeon_bld.soa.bld_base.base.gallivm;
+	struct gallivm_state *gallivm = ctx->soa.bld_base.base.gallivm;
 	struct tgsi_shader_info *info = &ctx->shader->selector->info;
 	ubyte *name, *index, *array_first;
 	struct tgsi_full_src_register reg;
 	LLVMValueRef vertex_index = NULL;
 	LLVMValueRef param_index = NULL;
 	unsigned param_index_base, param_base;
 
 	reg = src ? *src : tgsi_full_src_register_from_dst(dst);
 
 	if (reg.Register.Dimension) {
@@ -780,21 +709,21 @@ static void build_tbuffer_store(struct si_shader_context *ctx,
 				LLVMValueRef soffset,
 				unsigned inst_offset,
 				unsigned dfmt,
 				unsigned nfmt,
 				unsigned offen,
 				unsigned idxen,
 				unsigned glc,
 				unsigned slc,
 				unsigned tfe)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMValueRef args[] = {
 		rsrc,
 		vdata,
 		LLVMConstInt(ctx->i32, num_channels, 0),
 		vaddr,
 		soffset,
 		LLVMConstInt(ctx->i32, inst_offset, 0),
 		LLVMConstInt(ctx->i32, dfmt, 0),
 		LLVMConstInt(ctx->i32, nfmt, 0),
 		LLVMConstInt(ctx->i32, offen, 0),
@@ -841,21 +770,21 @@ static void build_tbuffer_store_dwords(struct si_shader_context *ctx,
 static LLVMValueRef build_buffer_load(struct si_shader_context *ctx,
                                       LLVMValueRef rsrc,
                                       int num_channels,
                                       LLVMValueRef vindex,
                                       LLVMValueRef voffset,
                                       LLVMValueRef soffset,
                                       unsigned inst_offset,
                                       unsigned glc,
                                       unsigned slc)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	unsigned func = CLAMP(num_channels, 1, 3) - 1;
 
 	if (HAVE_LLVM >= 0x309) {
 		LLVMValueRef args[] = {
 			LLVMBuildBitCast(gallivm->builder, rsrc, ctx->v4i32, ""),
 			vindex ? vindex : LLVMConstInt(ctx->i32, 0, 0),
 			LLVMConstInt(ctx->i32, inst_offset, 0),
 			LLVMConstInt(ctx->i1, glc, 0),
 			LLVMConstInt(ctx->i1, slc, 0)
 		};
@@ -1050,26 +979,26 @@ static LLVMValueRef fetch_output_tcs(
 
 static LLVMValueRef fetch_input_tes(
 	struct lp_build_tgsi_context *bld_base,
 	const struct tgsi_full_src_register *reg,
 	enum tgsi_opcode_type type, unsigned swizzle)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	LLVMValueRef rw_buffers, buffer, base, addr;
 
-	rw_buffers = LLVMGetParam(ctx->radeon_bld.main_fn,
+	rw_buffers = LLVMGetParam(ctx->main_fn,
 				  SI_PARAM_RW_BUFFERS);
 	buffer = build_indexed_load_const(ctx, rw_buffers,
 			lp_build_const_int32(gallivm, SI_HS_RING_TESS_OFFCHIP));
 
-	base = LLVMGetParam(ctx->radeon_bld.main_fn, ctx->param_oc_lds);
+	base = LLVMGetParam(ctx->main_fn, ctx->param_oc_lds);
 	addr = get_tcs_tes_buffer_address_from_reg(ctx, NULL, reg);
 
 	return buffer_load(bld_base, type, swizzle, buffer, base, addr);
 }
 
 static void store_output_tcs(struct lp_build_tgsi_context *bld_base,
 			     const struct tgsi_full_instruction *inst,
 			     const struct tgsi_opcode_info *info,
 			     LLVMValueRef dst[4])
 {
@@ -1092,26 +1021,26 @@ static void store_output_tcs(struct lp_build_tgsi_context *bld_base,
 
 	if (reg->Register.Dimension) {
 		stride = unpack_param(ctx, SI_PARAM_TCS_OUT_LAYOUT, 13, 8);
 		dw_addr = get_tcs_out_current_patch_offset(ctx);
 		dw_addr = get_dw_address(ctx, reg, NULL, stride, dw_addr);
 	} else {
 		dw_addr = get_tcs_out_current_patch_data_offset(ctx);
 		dw_addr = get_dw_address(ctx, reg, NULL, NULL, dw_addr);
 	}
 
-	rw_buffers = LLVMGetParam(ctx->radeon_bld.main_fn,
+	rw_buffers = LLVMGetParam(ctx->main_fn,
 				  SI_PARAM_RW_BUFFERS);
 	buffer = build_indexed_load_const(ctx, rw_buffers,
 			lp_build_const_int32(gallivm, SI_HS_RING_TESS_OFFCHIP));
 
-	base = LLVMGetParam(ctx->radeon_bld.main_fn, ctx->param_oc_lds);
+	base = LLVMGetParam(ctx->main_fn, ctx->param_oc_lds);
 	buf_addr = get_tcs_tes_buffer_address_from_reg(ctx, reg, NULL);
 
 
 	TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
 		LLVMValueRef value = dst[chan_index];
 
 		if (inst->Instruction.Saturate)
 			value = radeon_llvm_saturate(bld_base, value);
 
 		lds_store(bld_base, chan_index, dw_addr, value);
@@ -1136,21 +1065,21 @@ static void store_output_tcs(struct lp_build_tgsi_context *bld_base,
 
 static LLVMValueRef fetch_input_gs(
 	struct lp_build_tgsi_context *bld_base,
 	const struct tgsi_full_src_register *reg,
 	enum tgsi_opcode_type type,
 	unsigned swizzle)
 {
 	struct lp_build_context *base = &bld_base->base;
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct si_shader *shader = ctx->shader;
-	struct lp_build_context *uint =	&ctx->radeon_bld.soa.bld_base.uint_bld;
+	struct lp_build_context *uint =	&ctx->soa.bld_base.uint_bld;
 	struct gallivm_state *gallivm = base->gallivm;
 	LLVMValueRef vtx_offset;
 	LLVMValueRef args[9];
 	unsigned vtx_offset_param;
 	struct tgsi_shader_info *info = &shader->selector->info;
 	unsigned semantic_name = info->input_semantic_name[reg->Register.Index];
 	unsigned semantic_index = info->input_semantic_index[reg->Register.Index];
 	unsigned param;
 	LLVMValueRef value;
 
@@ -1172,21 +1101,21 @@ static LLVMValueRef fetch_input_gs(
 
 	/* Get the vertex offset parameter */
 	vtx_offset_param = reg->Dimension.Index;
 	if (vtx_offset_param < 2) {
 		vtx_offset_param += SI_PARAM_VTX0_OFFSET;
 	} else {
 		assert(vtx_offset_param < 6);
 		vtx_offset_param += SI_PARAM_VTX2_OFFSET - 2;
 	}
 	vtx_offset = lp_build_mul_imm(uint,
-				      LLVMGetParam(ctx->radeon_bld.main_fn,
+				      LLVMGetParam(ctx->main_fn,
 						   vtx_offset_param),
 				      4);
 
 	param = si_shader_io_get_unique_index(semantic_name, semantic_index);
 	args[0] = ctx->esgs_ring;
 	args[1] = vtx_offset;
 	args[2] = lp_build_const_int32(gallivm, (param * 4 + swizzle) * 256);
 	args[3] = uint->zero;
 	args[4] = uint->one;  /* OFFEN */
 	args[5] = uint->zero; /* IDXEN */
@@ -1299,22 +1228,22 @@ static void interp_fs_input(struct si_shader_context *ctx,
 			    unsigned input_index,
 			    unsigned semantic_name,
 			    unsigned semantic_index,
 			    unsigned num_interp_inputs,
 			    unsigned colors_read_mask,
 			    LLVMValueRef interp_param,
 			    LLVMValueRef prim_mask,
 			    LLVMValueRef face,
 			    LLVMValueRef result[4])
 {
-	struct lp_build_context *base = &ctx->radeon_bld.soa.bld_base.base;
-	struct lp_build_context *uint =	&ctx->radeon_bld.soa.bld_base.uint_bld;
+	struct lp_build_context *base = &ctx->soa.bld_base.base;
+	struct lp_build_context *uint =	&ctx->soa.bld_base.uint_bld;
 	struct gallivm_state *gallivm = base->gallivm;
 	const char *intr_name;
 	LLVMValueRef attr_number;
 
 	unsigned chan;
 
 	attr_number = lp_build_const_int32(gallivm, input_index);
 
 	/* fs.constant returns the param from the middle vertex, so it's not
 	 * really useful for flat shading. It's meant to be used for custom
@@ -1395,22 +1324,22 @@ static void interp_fs_input(struct si_shader_context *ctx,
 						ctx->f32, args, args[3] ? 4 : 3,
 						LLVMReadNoneAttribute);
 		}
 	}
 }
 
 /* LLVMGetParam with bc_optimize resolved. */
 static LLVMValueRef get_interp_param(struct si_shader_context *ctx,
 				     int interp_param_idx)
 {
-	LLVMBuilderRef builder = ctx->radeon_bld.gallivm.builder;
-	LLVMValueRef main_fn = ctx->radeon_bld.main_fn;
+	LLVMBuilderRef builder = ctx->gallivm.builder;
+	LLVMValueRef main_fn = ctx->main_fn;
 	LLVMValueRef param = NULL;
 
 	/* Handle PRIM_MASK[31] (bc_optimize). */
 	if (ctx->is_monolithic &&
 	    ((ctx->shader->key.ps.prolog.bc_optimize_for_persp &&
 	      interp_param_idx == SI_PARAM_PERSP_CENTROID) ||
 	     (ctx->shader->key.ps.prolog.bc_optimize_for_linear &&
 	      interp_param_idx == SI_PARAM_LINEAR_CENTROID))) {
 		/* The shader should do: if (PRIM_MASK[31]) CENTROID = CENTER;
 		 * The hw doesn't compute CENTROID if the whole wave only
@@ -1442,21 +1371,21 @@ static LLVMValueRef get_interp_param(struct si_shader_context *ctx,
 						"");
 		}
 	}
 
 	if (!param)
 		param = LLVMGetParam(main_fn, interp_param_idx);
 	return param;
 }
 
 static void declare_input_fs(
-	struct radeon_llvm_context *radeon_bld,
+	struct si_shader_context *radeon_bld,
 	unsigned input_index,
 	const struct tgsi_full_declaration *decl,
 	LLVMValueRef out[4])
 {
 	struct lp_build_context *base = &radeon_bld->soa.bld_base.base;
 	struct si_shader_context *ctx =
 		si_shader_context(&radeon_bld->soa.bld_base);
 	struct si_shader *shader = ctx->shader;
 	LLVMValueRef main_fn = radeon_bld->main_fn;
 	LLVMValueRef interp_param = NULL;
@@ -1494,21 +1423,21 @@ static void declare_input_fs(
 		interp_param = NULL; /* load the constant color */
 
 	interp_fs_input(ctx, input_index, decl->Semantic.Name,
 			decl->Semantic.Index, shader->selector->info.num_inputs,
 			shader->selector->info.colors_read, interp_param,
 			LLVMGetParam(main_fn, SI_PARAM_PRIM_MASK),
 			LLVMGetParam(main_fn, SI_PARAM_FRONT_FACE),
 			&out[0]);
 }
 
-static LLVMValueRef get_sample_id(struct radeon_llvm_context *radeon_bld)
+static LLVMValueRef get_sample_id(struct si_shader_context *radeon_bld)
 {
 	return unpack_param(si_shader_context(&radeon_bld->soa.bld_base),
 			    SI_PARAM_ANCILLARY, 8, 4);
 }
 
 /**
  * Set range metadata on an instruction.  This can only be used on load and
  * call instructions.  If you know an instruction can only produce the values
  * 0, 1, 2, you would do set_range_metadata(value, 0, 3);
  * \p lo is the minimum value inclusive.
@@ -1522,21 +1451,21 @@ static void set_range_metadata(struct si_shader_context *ctx,
 	LLVMContextRef context = LLVMGetTypeContext(type);
 
 	md_args[0] = LLVMConstInt(type, lo, false);
 	md_args[1] = LLVMConstInt(type, hi, false);
 	range_md = LLVMMDNodeInContext(context, md_args, 2);
 	LLVMSetMetadata(value, ctx->range_md_kind, range_md);
 }
 
 static LLVMValueRef get_thread_id(struct si_shader_context *ctx)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMValueRef tid;
 
 	if (HAVE_LLVM < 0x0308) {
 		tid = lp_build_intrinsic(gallivm->builder, "llvm.SI.tid",
 				ctx->i32,   NULL, 0, LLVMReadNoneAttribute);
 	} else {
 		LLVMValueRef tid_args[2];
 		tid_args[0] = lp_build_const_int32(gallivm, 0xffffffff);
 		tid_args[1] = lp_build_const_int32(gallivm, 0);
 		tid_args[1] = lp_build_intrinsic(gallivm->builder,
@@ -1551,54 +1480,54 @@ static LLVMValueRef get_thread_id(struct si_shader_context *ctx)
 	return tid;
 }
 
 /**
  * Load a dword from a constant buffer.
  */
 static LLVMValueRef buffer_load_const(struct si_shader_context *ctx,
 				      LLVMValueRef resource,
 				      LLVMValueRef offset)
 {
-	LLVMBuilderRef builder = ctx->radeon_bld.gallivm.builder;
+	LLVMBuilderRef builder = ctx->gallivm.builder;
 	LLVMValueRef args[2] = {resource, offset};
 
 	return lp_build_intrinsic(builder, "llvm.SI.load.const", ctx->f32, args, 2,
 			       LLVMReadNoneAttribute);
 }
 
-static LLVMValueRef load_sample_position(struct radeon_llvm_context *radeon_bld, LLVMValueRef sample_id)
+static LLVMValueRef load_sample_position(struct si_shader_context *radeon_bld, LLVMValueRef sample_id)
 {
 	struct si_shader_context *ctx =
 		si_shader_context(&radeon_bld->soa.bld_base);
 	struct lp_build_context *uint_bld = &radeon_bld->soa.bld_base.uint_bld;
 	struct gallivm_state *gallivm = &radeon_bld->gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
-	LLVMValueRef desc = LLVMGetParam(ctx->radeon_bld.main_fn, SI_PARAM_RW_BUFFERS);
+	LLVMValueRef desc = LLVMGetParam(ctx->main_fn, SI_PARAM_RW_BUFFERS);
 	LLVMValueRef buf_index = lp_build_const_int32(gallivm, SI_PS_CONST_SAMPLE_POSITIONS);
 	LLVMValueRef resource = build_indexed_load_const(ctx, desc, buf_index);
 
 	/* offset = sample_id * 8  (8 = 2 floats containing samplepos.xy) */
 	LLVMValueRef offset0 = lp_build_mul_imm(uint_bld, sample_id, 8);
 	LLVMValueRef offset1 = LLVMBuildAdd(builder, offset0, lp_build_const_int32(gallivm, 4), "");
 
 	LLVMValueRef pos[4] = {
 		buffer_load_const(ctx, resource, offset0),
 		buffer_load_const(ctx, resource, offset1),
 		lp_build_const_float(gallivm, 0),
 		lp_build_const_float(gallivm, 0)
 	};
 
 	return lp_build_gather_values(gallivm, pos, 4);
 }
 
 static void declare_system_value(
-	struct radeon_llvm_context *radeon_bld,
+	struct si_shader_context *radeon_bld,
 	unsigned index,
 	const struct tgsi_full_declaration *decl)
 {
 	struct si_shader_context *ctx =
 		si_shader_context(&radeon_bld->soa.bld_base);
 	struct lp_build_context *bld = &radeon_bld->soa.bld_base.base;
 	struct gallivm_state *gallivm = &radeon_bld->gallivm;
 	LLVMValueRef value = 0;
 
 	switch (decl->Semantic.Name) {
@@ -1716,43 +1645,43 @@ static void declare_system_value(
 		else
 			assert(!"invalid shader stage for TGSI_SEMANTIC_VERTICESIN");
 		break;
 
 	case TGSI_SEMANTIC_TESSINNER:
 	case TGSI_SEMANTIC_TESSOUTER:
 	{
 		LLVMValueRef rw_buffers, buffer, base, addr;
 		int param = si_shader_io_get_unique_index(decl->Semantic.Name, 0);
 
-		rw_buffers = LLVMGetParam(ctx->radeon_bld.main_fn,
+		rw_buffers = LLVMGetParam(ctx->main_fn,
 					SI_PARAM_RW_BUFFERS);
 		buffer = build_indexed_load_const(ctx, rw_buffers,
 		        lp_build_const_int32(gallivm, SI_HS_RING_TESS_OFFCHIP));
 
-		base = LLVMGetParam(ctx->radeon_bld.main_fn, ctx->param_oc_lds);
+		base = LLVMGetParam(ctx->main_fn, ctx->param_oc_lds);
 		addr = get_tcs_tes_buffer_address(ctx, NULL,
 		                          lp_build_const_int32(gallivm, param));
 
 		value = buffer_load(&radeon_bld->soa.bld_base, TGSI_TYPE_FLOAT,
 		                    ~0, buffer, base, addr);
 
 		break;
 	}
 
 	case TGSI_SEMANTIC_DEFAULT_TESSOUTER_SI:
 	case TGSI_SEMANTIC_DEFAULT_TESSINNER_SI:
 	{
 		LLVMValueRef buf, slot, val[4];
 		int i, offset;
 
 		slot = lp_build_const_int32(gallivm, SI_HS_CONST_DEFAULT_TESS_LEVELS);
-		buf = LLVMGetParam(ctx->radeon_bld.main_fn, SI_PARAM_RW_BUFFERS);
+		buf = LLVMGetParam(ctx->main_fn, SI_PARAM_RW_BUFFERS);
 		buf = build_indexed_load_const(ctx, buf, slot);
 		offset = decl->Semantic.Name == TGSI_SEMANTIC_DEFAULT_TESSINNER_SI ? 4 : 0;
 
 		for (i = 0; i < 4; i++)
 			val[i] = buffer_load_const(ctx, buf,
 						   lp_build_const_int32(gallivm, (offset + i) * 4));
 		value = lp_build_gather_values(gallivm, val, 4);
 		break;
 	}
 
@@ -1807,21 +1736,21 @@ static void declare_system_value(
 #endif
 
 	default:
 		assert(!"unknown system value");
 		return;
 	}
 
 	radeon_bld->system_values[index] = value;
 }
 
-static void declare_compute_memory(struct radeon_llvm_context *radeon_bld,
+static void declare_compute_memory(struct si_shader_context *radeon_bld,
                                    const struct tgsi_full_declaration *decl)
 {
 	struct si_shader_context *ctx =
 		si_shader_context(&radeon_bld->soa.bld_base);
 	struct si_shader_selector *sel = ctx->shader->selector;
 	struct gallivm_state *gallivm = &radeon_bld->gallivm;
 
 	LLVMTypeRef i8p = LLVMPointerType(ctx->i8, LOCAL_ADDR_SPACE);
 	LLVMValueRef var;
 
@@ -1833,21 +1762,21 @@ static void declare_compute_memory(struct radeon_llvm_context *radeon_bld,
 	                                  LLVMArrayType(ctx->i8, sel->local_size),
 	                                  "compute_lds",
 	                                  LOCAL_ADDR_SPACE);
 	LLVMSetAlignment(var, 4);
 
 	ctx->shared_memory = LLVMBuildBitCast(gallivm->builder, var, i8p, "");
 }
 
 static LLVMValueRef load_const_buffer_desc(struct si_shader_context *ctx, int i)
 {
-	LLVMValueRef list_ptr = LLVMGetParam(ctx->radeon_bld.main_fn,
+	LLVMValueRef list_ptr = LLVMGetParam(ctx->main_fn,
 					     SI_PARAM_CONST_BUFFERS);
 
 	return build_indexed_load_const(ctx, list_ptr,
 					LLVMConstInt(ctx->i32, i, 0));
 }
 
 static LLVMValueRef fetch_constant(
 	struct lp_build_tgsi_context *bld_base,
 	const struct tgsi_full_src_register *reg,
 	enum tgsi_opcode_type type,
@@ -1885,42 +1814,42 @@ static LLVMValueRef fetch_constant(
 		else {
 			c1 = buffer_load_const(ctx, desc,
 					       LLVMConstInt(ctx->i32,
 							    (idx + 1) * 4, 0));
 			return radeon_llvm_emit_fetch_64bit(bld_base, type,
 							    c0, c1);
 		}
 	}
 
 	if (reg->Register.Dimension && reg->Dimension.Indirect) {
-		LLVMValueRef ptr = LLVMGetParam(ctx->radeon_bld.main_fn, SI_PARAM_CONST_BUFFERS);
+		LLVMValueRef ptr = LLVMGetParam(ctx->main_fn, SI_PARAM_CONST_BUFFERS);
 		LLVMValueRef index;
 		index = get_bounded_indirect_index(ctx, &reg->DimIndirect,
 						   reg->Dimension.Index,
 						   SI_NUM_CONST_BUFFERS);
 		bufp = build_indexed_load_const(ctx, ptr, index);
 	} else
 		bufp = load_const_buffer_desc(ctx, buf);
 
-	addr = ctx->radeon_bld.soa.addr[ireg->Index][ireg->Swizzle];
+	addr = ctx->soa.addr[ireg->Index][ireg->Swizzle];
 	addr = LLVMBuildLoad(base->gallivm->builder, addr, "load addr reg");
 	addr = lp_build_mul_imm(&bld_base->uint_bld, addr, 16);
 	addr = lp_build_add(&bld_base->uint_bld, addr,
 			    lp_build_const_int32(base->gallivm, idx * 4));
 
 	result = buffer_load_const(ctx, bufp, addr);
 
 	if (!tgsi_type_is_64bit(type))
 		result = bitcast(bld_base, type, result);
 	else {
 		LLVMValueRef addr2, result2;
-		addr2 = ctx->radeon_bld.soa.addr[ireg->Index][ireg->Swizzle + 1];
+		addr2 = ctx->soa.addr[ireg->Index][ireg->Swizzle + 1];
 		addr2 = LLVMBuildLoad(base->gallivm->builder, addr2, "load addr reg2");
 		addr2 = lp_build_mul_imm(&bld_base->uint_bld, addr2, 16);
 		addr2 = lp_build_add(&bld_base->uint_bld, addr2,
 				     lp_build_const_int32(base->gallivm, idx * 4));
 
 		result2 = buffer_load_const(ctx, bufp, addr2);
 
 		result = radeon_llvm_emit_fetch_64bit(bld_base, type,
 						      result, result2);
 	}
@@ -1950,21 +1879,21 @@ static LLVMValueRef si_llvm_pack_two_int32_as_int16(struct gallivm_state *galliv
 }
 
 /* Initialize arguments for the shader export intrinsic */
 static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
 				     LLVMValueRef *values,
 				     unsigned target,
 				     LLVMValueRef *args)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct lp_build_context *uint =
-				&ctx->radeon_bld.soa.bld_base.uint_bld;
+				&ctx->soa.bld_base.uint_bld;
 	struct lp_build_context *base = &bld_base->base;
 	struct gallivm_state *gallivm = base->gallivm;
 	LLVMBuilderRef builder = base->gallivm->builder;
 	LLVMValueRef val[4];
 	unsigned spi_shader_col_format = V_028714_SPI_SHADER_32_ABGR;
 	unsigned chan;
 	bool is_int8;
 
 	/* Default is 0xf. Adjusted below depending on the format. */
 	args[0] = lp_build_const_int32(base->gallivm, 0xf); /* writemask */
@@ -2132,21 +2061,21 @@ static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
 	}
 }
 
 static void si_alpha_test(struct lp_build_tgsi_context *bld_base,
 			  LLVMValueRef alpha)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 
 	if (ctx->shader->key.ps.epilog.alpha_func != PIPE_FUNC_NEVER) {
-		LLVMValueRef alpha_ref = LLVMGetParam(ctx->radeon_bld.main_fn,
+		LLVMValueRef alpha_ref = LLVMGetParam(ctx->main_fn,
 				SI_PARAM_ALPHA_REF);
 
 		LLVMValueRef alpha_pass =
 			lp_build_cmp(&bld_base->base,
 				     ctx->shader->key.ps.epilog.alpha_func,
 				     alpha, alpha_ref);
 		LLVMValueRef arg =
 			lp_build_select(&bld_base->base,
 					alpha_pass,
 					lp_build_const_float(gallivm, 1.0f),
@@ -2162,21 +2091,21 @@ static void si_alpha_test(struct lp_build_tgsi_context *bld_base,
 
 static LLVMValueRef si_scale_alpha_by_sample_mask(struct lp_build_tgsi_context *bld_base,
 						  LLVMValueRef alpha,
 						  unsigned samplemask_param)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	LLVMValueRef coverage;
 
 	/* alpha = alpha * popcount(coverage) / SI_NUM_SMOOTH_AA_SAMPLES */
-	coverage = LLVMGetParam(ctx->radeon_bld.main_fn,
+	coverage = LLVMGetParam(ctx->main_fn,
 				samplemask_param);
 	coverage = bitcast(bld_base, TGSI_TYPE_SIGNED, coverage);
 
 	coverage = lp_build_intrinsic(gallivm->builder, "llvm.ctpop.i32",
 				   ctx->i32,
 				   &coverage, 1, LLVMReadNoneAttribute);
 
 	coverage = LLVMBuildUIToFP(gallivm->builder, coverage,
 				   ctx->f32, "");
 
@@ -2185,26 +2114,26 @@ static LLVMValueRef si_scale_alpha_by_sample_mask(struct lp_build_tgsi_context *
 					1.0 / SI_NUM_SMOOTH_AA_SAMPLES), "");
 
 	return LLVMBuildFMul(gallivm->builder, alpha, coverage, "");
 }
 
 static void si_llvm_emit_clipvertex(struct lp_build_tgsi_context *bld_base,
 				    LLVMValueRef (*pos)[9], LLVMValueRef *out_elts)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct lp_build_context *base = &bld_base->base;
-	struct lp_build_context *uint = &ctx->radeon_bld.soa.bld_base.uint_bld;
+	struct lp_build_context *uint = &ctx->soa.bld_base.uint_bld;
 	unsigned reg_index;
 	unsigned chan;
 	unsigned const_chan;
 	LLVMValueRef base_elt;
-	LLVMValueRef ptr = LLVMGetParam(ctx->radeon_bld.main_fn, SI_PARAM_RW_BUFFERS);
+	LLVMValueRef ptr = LLVMGetParam(ctx->main_fn, SI_PARAM_RW_BUFFERS);
 	LLVMValueRef constbuf_index = lp_build_const_int32(base->gallivm,
 							   SI_VS_CONST_CLIP_PLANES);
 	LLVMValueRef const_resource = build_indexed_load_const(ctx, ptr, constbuf_index);
 
 	for (reg_index = 0; reg_index < 2; reg_index ++) {
 		LLVMValueRef *args = pos[2 + reg_index];
 
 		args[5] =
 		args[6] =
 		args[7] =
@@ -2255,26 +2184,26 @@ static void si_dump_streamout(struct pipe_stream_output_info *so)
 	}
 }
 
 /* On SI, the vertex shader is responsible for writing streamout data
  * to buffers. */
 static void si_llvm_emit_streamout(struct si_shader_context *ctx,
 				   struct si_shader_output_values *outputs,
 				   unsigned noutput)
 {
 	struct pipe_stream_output_info *so = &ctx->shader->selector->so;
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
 	int i, j;
 	struct lp_build_if_state if_ctx;
 	LLVMValueRef so_buffers[4];
-	LLVMValueRef buf_ptr = LLVMGetParam(ctx->radeon_bld.main_fn,
+	LLVMValueRef buf_ptr = LLVMGetParam(ctx->main_fn,
 					    SI_PARAM_RW_BUFFERS);
 
 	/* Load the descriptors. */
 	for (i = 0; i < 4; ++i) {
 		if (ctx->shader->selector->so.stride[i]) {
 			LLVMValueRef offset = lp_build_const_int32(gallivm,
 								   SI_VS_STREAMOUT_BUF0 + i);
 
 			so_buffers[i] = build_indexed_load_const(ctx, buf_ptr, offset);
 		}
@@ -2298,33 +2227,33 @@ static void si_llvm_emit_streamout(struct si_shader_context *ctx,
 	 * (so_vtx_count) which threads are allowed to emit streamout data. */
 	lp_build_if(&if_ctx, gallivm, can_emit);
 	{
 		/* The buffer offset is computed as follows:
 		 *   ByteOffset = streamout_offset[buffer_id]*4 +
 		 *                (streamout_write_index + thread_id)*stride[buffer_id] +
 		 *                attrib_offset
                  */
 
 		LLVMValueRef so_write_index =
-			LLVMGetParam(ctx->radeon_bld.main_fn,
+			LLVMGetParam(ctx->main_fn,
 				     ctx->param_streamout_write_index);
 
 		/* Compute (streamout_write_index + thread_id). */
 		so_write_index = LLVMBuildAdd(builder, so_write_index, tid, "");
 
 		/* Compute the write offset for each enabled buffer. */
 		LLVMValueRef so_write_offset[4] = {};
 		for (i = 0; i < 4; i++) {
 			if (!so->stride[i])
 				continue;
 
-			LLVMValueRef so_offset = LLVMGetParam(ctx->radeon_bld.main_fn,
+			LLVMValueRef so_offset = LLVMGetParam(ctx->main_fn,
 							      ctx->param_streamout_offset[i]);
 			so_offset = LLVMBuildMul(builder, so_offset, LLVMConstInt(ctx->i32, 4, 0), "");
 
 			so_write_offset[i] = LLVMBuildMul(builder, so_write_index,
 							  LLVMConstInt(ctx->i32, so->stride[i]*4, 0), "");
 			so_write_offset[i] = LLVMBuildAdd(builder, so_write_offset[i], so_offset, "");
 		}
 
 		/* Write streamout data. */
 		for (i = 0; i < so->num_outputs; i++) {
@@ -2388,21 +2317,21 @@ static void si_llvm_emit_streamout(struct si_shader_context *ctx,
 
 /* Generate export instructions for hardware VS shader stage */
 static void si_llvm_export_vs(struct lp_build_tgsi_context *bld_base,
 			      struct si_shader_output_values *outputs,
 			      unsigned noutput)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct si_shader *shader = ctx->shader;
 	struct lp_build_context *base = &bld_base->base;
 	struct lp_build_context *uint =
-				&ctx->radeon_bld.soa.bld_base.uint_bld;
+				&ctx->soa.bld_base.uint_bld;
 	LLVMValueRef args[9];
 	LLVMValueRef pos_args[4][9] = { { 0 } };
 	LLVMValueRef psize_value = NULL, edgeflag_value = NULL, layer_value = NULL, viewport_index_value = NULL;
 	unsigned semantic_name, semantic_index;
 	unsigned target;
 	unsigned param_count = 0;
 	unsigned pos_idx;
 	int i;
 
 	if (outputs && ctx->shader->selector->so.num_outputs) {
@@ -2564,25 +2493,25 @@ handle_semantic:
 static void si_copy_tcs_inputs(struct lp_build_tgsi_context *bld_base)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	LLVMValueRef invocation_id, rw_buffers, buffer, buffer_offset;
 	LLVMValueRef lds_vertex_stride, lds_vertex_offset, lds_base;
 	uint64_t inputs;
 
 	invocation_id = unpack_param(ctx, SI_PARAM_REL_IDS, 8, 5);
 
-	rw_buffers = LLVMGetParam(ctx->radeon_bld.main_fn, SI_PARAM_RW_BUFFERS);
+	rw_buffers = LLVMGetParam(ctx->main_fn, SI_PARAM_RW_BUFFERS);
 	buffer = build_indexed_load_const(ctx, rw_buffers,
 	                lp_build_const_int32(gallivm, SI_HS_RING_TESS_OFFCHIP));
 
-	buffer_offset = LLVMGetParam(ctx->radeon_bld.main_fn, ctx->param_oc_lds);
+	buffer_offset = LLVMGetParam(ctx->main_fn, ctx->param_oc_lds);
 
 	lds_vertex_stride = unpack_param(ctx, SI_PARAM_TCS_IN_LAYOUT, 13, 8);
 	lds_vertex_offset = LLVMBuildMul(gallivm->builder, invocation_id,
 	                                 lds_vertex_stride, "");
 	lds_base = get_tcs_in_current_patch_offset(ctx);
 	lds_base = LLVMBuildAdd(gallivm->builder, lds_base, lds_vertex_offset, "");
 
 	inputs = ctx->shader->key.tcs.epilog.inputs_to_copy;
 	while (inputs) {
 		unsigned i = u_bit_scan64(&inputs);
@@ -2671,27 +2600,27 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
 		out[outer_comps+i] = lds_load(bld_base, TGSI_TYPE_SIGNED, i, lds_inner);
 
 	/* Convert the outputs to vectors for stores. */
 	vec0 = lp_build_gather_values(gallivm, out, MIN2(stride, 4));
 	vec1 = NULL;
 
 	if (stride > 4)
 		vec1 = lp_build_gather_values(gallivm, out+4, stride - 4);
 
 	/* Get the buffer. */
-	rw_buffers = LLVMGetParam(ctx->radeon_bld.main_fn,
+	rw_buffers = LLVMGetParam(ctx->main_fn,
 				  SI_PARAM_RW_BUFFERS);
 	buffer = build_indexed_load_const(ctx, rw_buffers,
 			lp_build_const_int32(gallivm, SI_HS_RING_TESS_FACTOR));
 
 	/* Get the offset. */
-	tf_base = LLVMGetParam(ctx->radeon_bld.main_fn,
+	tf_base = LLVMGetParam(ctx->main_fn,
 			       SI_PARAM_TESS_FACTOR_OFFSET);
 	byteoffset = LLVMBuildMul(gallivm->builder, rel_patch_id,
 				  lp_build_const_int32(gallivm, 4 * stride), "");
 
 	lp_build_if(&inner_if_ctx, gallivm,
 		    LLVMBuildICmp(gallivm->builder, LLVMIntEQ,
 				  rel_patch_id, bld_base->uint_bld.zero, ""));
 
 	/* Store the dynamic HS control word. */
 	build_tbuffer_store_dwords(ctx, buffer,
@@ -2720,33 +2649,33 @@ static void si_llvm_emit_tcs_epilogue(struct lp_build_tgsi_context *bld_base)
 	tf_lds_offset = get_tcs_out_current_patch_data_offset(ctx);
 
 	if (!ctx->is_monolithic) {
 		/* Return epilog parameters from this function. */
 		LLVMBuilderRef builder = bld_base->base.gallivm->builder;
 		LLVMValueRef ret = ctx->return_value;
 		LLVMValueRef rw_buffers, rw0, rw1, tf_soffset;
 		unsigned vgpr;
 
 		/* RW_BUFFERS pointer */
-		rw_buffers = LLVMGetParam(ctx->radeon_bld.main_fn,
+		rw_buffers = LLVMGetParam(ctx->main_fn,
 					  SI_PARAM_RW_BUFFERS);
 		rw_buffers = LLVMBuildPtrToInt(builder, rw_buffers, ctx->i64, "");
 		rw_buffers = LLVMBuildBitCast(builder, rw_buffers, ctx->v2i32, "");
 		rw0 = LLVMBuildExtractElement(builder, rw_buffers,
 					      bld_base->uint_bld.zero, "");
 		rw1 = LLVMBuildExtractElement(builder, rw_buffers,
 					      bld_base->uint_bld.one, "");
 		ret = LLVMBuildInsertValue(builder, ret, rw0, 0, "");
 		ret = LLVMBuildInsertValue(builder, ret, rw1, 1, "");
 
 		/* Tess factor buffer soffset is after user SGPRs. */
-		tf_soffset = LLVMGetParam(ctx->radeon_bld.main_fn,
+		tf_soffset = LLVMGetParam(ctx->main_fn,
 					  SI_PARAM_TESS_FACTOR_OFFSET);
 		ret = LLVMBuildInsertValue(builder, ret, tf_soffset,
 					   SI_TCS_NUM_USER_SGPR + 1, "");
 
 		/* VGPRs */
 		rel_patch_id = bitcast(bld_base, TGSI_TYPE_FLOAT, rel_patch_id);
 		invocation_id = bitcast(bld_base, TGSI_TYPE_FLOAT, invocation_id);
 		tf_lds_offset = bitcast(bld_base, TGSI_TYPE_FLOAT, tf_lds_offset);
 
 		vgpr = SI_TCS_NUM_USER_SGPR + 2;
@@ -2761,58 +2690,58 @@ static void si_llvm_emit_tcs_epilogue(struct lp_build_tgsi_context *bld_base)
 	si_write_tess_factors(bld_base, rel_patch_id, invocation_id, tf_lds_offset);
 }
 
 static void si_llvm_emit_ls_epilogue(struct lp_build_tgsi_context *bld_base)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct si_shader *shader = ctx->shader;
 	struct tgsi_shader_info *info = &shader->selector->info;
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	unsigned i, chan;
-	LLVMValueRef vertex_id = LLVMGetParam(ctx->radeon_bld.main_fn,
+	LLVMValueRef vertex_id = LLVMGetParam(ctx->main_fn,
 					      ctx->param_rel_auto_id);
 	LLVMValueRef vertex_dw_stride =
 		unpack_param(ctx, SI_PARAM_LS_OUT_LAYOUT, 13, 8);
 	LLVMValueRef base_dw_addr = LLVMBuildMul(gallivm->builder, vertex_id,
 						 vertex_dw_stride, "");
 
 	/* Write outputs to LDS. The next shader (TCS aka HS) will read
 	 * its inputs from it. */
 	for (i = 0; i < info->num_outputs; i++) {
-		LLVMValueRef *out_ptr = ctx->radeon_bld.soa.outputs[i];
+		LLVMValueRef *out_ptr = ctx->soa.outputs[i];
 		unsigned name = info->output_semantic_name[i];
 		unsigned index = info->output_semantic_index[i];
 		int param = si_shader_io_get_unique_index(name, index);
 		LLVMValueRef dw_addr = LLVMBuildAdd(gallivm->builder, base_dw_addr,
 					lp_build_const_int32(gallivm, param * 4), "");
 
 		for (chan = 0; chan < 4; chan++) {
 			lds_store(bld_base, chan, dw_addr,
 				  LLVMBuildLoad(gallivm->builder, out_ptr[chan], ""));
 		}
 	}
 }
 
 static void si_llvm_emit_es_epilogue(struct lp_build_tgsi_context *bld_base)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	struct si_shader *es = ctx->shader;
 	struct tgsi_shader_info *info = &es->selector->info;
-	LLVMValueRef soffset = LLVMGetParam(ctx->radeon_bld.main_fn,
+	LLVMValueRef soffset = LLVMGetParam(ctx->main_fn,
 					    ctx->param_es2gs_offset);
 	unsigned chan;
 	int i;
 
 	for (i = 0; i < info->num_outputs; i++) {
 		LLVMValueRef *out_ptr =
-			ctx->radeon_bld.soa.outputs[i];
+			ctx->soa.outputs[i];
 		int param_index;
 
 		if (info->output_semantic_name[i] == TGSI_SEMANTIC_VIEWPORT_INDEX ||
 		    info->output_semantic_name[i] == TGSI_SEMANTIC_LAYER)
 			continue;
 
 		param_index = si_shader_io_get_unique_index(info->output_semantic_name[i],
 							    info->output_semantic_index[i]);
 
 		for (chan = 0; chan < 4; chan++) {
@@ -2831,21 +2760,21 @@ static void si_llvm_emit_es_epilogue(struct lp_build_tgsi_context *bld_base)
 	}
 }
 
 static void si_llvm_emit_gs_epilogue(struct lp_build_tgsi_context *bld_base)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	LLVMValueRef args[2];
 
 	args[0] = lp_build_const_int32(gallivm,	SENDMSG_GS_OP_NOP | SENDMSG_GS_DONE);
-	args[1] = LLVMGetParam(ctx->radeon_bld.main_fn, SI_PARAM_GS_WAVE_ID);
+	args[1] = LLVMGetParam(ctx->main_fn, SI_PARAM_GS_WAVE_ID);
 	lp_build_intrinsic(gallivm->builder, "llvm.SI.sendmsg",
 			   ctx->voidt, args, 2, 0);
 }
 
 static void si_llvm_emit_vs_epilogue(struct lp_build_tgsi_context *bld_base)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	struct tgsi_shader_info *info = &ctx->shader->selector->info;
 	struct si_shader_output_values *outputs = NULL;
@@ -2867,47 +2796,47 @@ static void si_llvm_emit_vs_epilogue(struct lp_build_tgsi_context *bld_base)
 		LLVMValueRef addr, val;
 
 		for (i = 0; i < info->num_outputs; i++) {
 			if (info->output_semantic_name[i] != TGSI_SEMANTIC_COLOR &&
 			    info->output_semantic_name[i] != TGSI_SEMANTIC_BCOLOR)
 				continue;
 
 			/* We've found a color. */
 			if (!cond) {
 				/* The state is in the first bit of the user SGPR. */
-				cond = LLVMGetParam(ctx->radeon_bld.main_fn,
+				cond = LLVMGetParam(ctx->main_fn,
 						    SI_PARAM_VS_STATE_BITS);
 				cond = LLVMBuildTrunc(gallivm->builder, cond,
 						      ctx->i1, "");
 				lp_build_if(&if_ctx, gallivm, cond);
 			}
 
 			for (j = 0; j < 4; j++) {
-				addr = ctx->radeon_bld.soa.outputs[i][j];
+				addr = ctx->soa.outputs[i][j];
 				val = LLVMBuildLoad(gallivm->builder, addr, "");
 				val = radeon_llvm_saturate(bld_base, val);
 				LLVMBuildStore(gallivm->builder, val, addr);
 			}
 		}
 
 		if (cond)
 			lp_build_endif(&if_ctx);
 	}
 
 	for (i = 0; i < info->num_outputs; i++) {
 		outputs[i].name = info->output_semantic_name[i];
 		outputs[i].sid = info->output_semantic_index[i];
 
 		for (j = 0; j < 4; j++)
 			outputs[i].values[j] =
 				LLVMBuildLoad(gallivm->builder,
-					      ctx->radeon_bld.soa.outputs[i][j],
+					      ctx->soa.outputs[i][j],
 					      "");
 	}
 
 	if (ctx->is_monolithic) {
 		/* Export PrimitiveID when PS needs it. */
 		if (si_vs_exports_prim_id(ctx->shader)) {
 			outputs[i].name = TGSI_SEMANTIC_PRIMID;
 			outputs[i].sid = 0;
 			outputs[i].values[0] = bitcast(bld_base, TGSI_TYPE_FLOAT,
 						       get_primitive_id(bld_base, 0));
@@ -3089,21 +3018,21 @@ static void si_export_mrt_color(struct lp_build_tgsi_context *bld_base,
 			return; /* unnecessary NULL export */
 
 		memcpy(exp->args[exp->num++], args, sizeof(args));
 	}
 }
 
 static void si_emit_ps_exports(struct si_shader_context *ctx,
 			       struct si_ps_exports *exp)
 {
 	for (unsigned i = 0; i < exp->num; i++)
-		lp_build_intrinsic(ctx->radeon_bld.gallivm.builder,
+		lp_build_intrinsic(ctx->gallivm.builder,
 				   "llvm.SI.export", ctx->voidt,
 				   exp->args[i], 9, 0);
 }
 
 static void si_export_null(struct lp_build_tgsi_context *bld_base)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct lp_build_context *base = &bld_base->base;
 	struct lp_build_context *uint = &bld_base->uint_bld;
 	LLVMValueRef args[9];
@@ -3175,34 +3104,34 @@ static void si_llvm_emit_fs_epilogue(struct lp_build_tgsi_context *bld_base)
 	for (i = 0; i < info->num_outputs; i++) {
 		unsigned semantic_name = info->output_semantic_name[i];
 		unsigned semantic_index = info->output_semantic_index[i];
 		unsigned j;
 		LLVMValueRef color[4] = {};
 
 		/* Select the correct target */
 		switch (semantic_name) {
 		case TGSI_SEMANTIC_POSITION:
 			depth = LLVMBuildLoad(builder,
-					      ctx->radeon_bld.soa.outputs[i][2], "");
+					      ctx->soa.outputs[i][2], "");
 			break;
 		case TGSI_SEMANTIC_STENCIL:
 			stencil = LLVMBuildLoad(builder,
-						ctx->radeon_bld.soa.outputs[i][1], "");
+						ctx->soa.outputs[i][1], "");
 			break;
 		case TGSI_SEMANTIC_SAMPLEMASK:
 			samplemask = LLVMBuildLoad(builder,
-						   ctx->radeon_bld.soa.outputs[i][0], "");
+						   ctx->soa.outputs[i][0], "");
 			break;
 		case TGSI_SEMANTIC_COLOR:
 			for (j = 0; j < 4; j++)
 				color[j] = LLVMBuildLoad(builder,
-							 ctx->radeon_bld.soa.outputs[i][j], "");
+							 ctx->soa.outputs[i][j], "");
 
 			si_export_mrt_color(bld_base, color, semantic_index,
 					    SI_PARAM_SAMPLE_COVERAGE,
 					    last_color_export == i, &exp);
 			break;
 		default:
 			fprintf(stderr,
 				"Warning: SI unhandled fs output type:%d\n",
 				semantic_name);
 		}
@@ -3242,50 +3171,50 @@ static void si_llvm_return_fs_outputs(struct lp_build_tgsi_context *bld_base)
 
 	/* Read the output values. */
 	for (i = 0; i < info->num_outputs; i++) {
 		unsigned semantic_name = info->output_semantic_name[i];
 		unsigned semantic_index = info->output_semantic_index[i];
 
 		switch (semantic_name) {
 		case TGSI_SEMANTIC_COLOR:
 			assert(semantic_index < 8);
 			for (j = 0; j < 4; j++) {
-				LLVMValueRef ptr = ctx->radeon_bld.soa.outputs[i][j];
+				LLVMValueRef ptr = ctx->soa.outputs[i][j];
 				LLVMValueRef result = LLVMBuildLoad(builder, ptr, "");
 				color[semantic_index][j] = result;
 			}
 			break;
 		case TGSI_SEMANTIC_POSITION:
 			depth = LLVMBuildLoad(builder,
-					      ctx->radeon_bld.soa.outputs[i][2], "");
+					      ctx->soa.outputs[i][2], "");
 			break;
 		case TGSI_SEMANTIC_STENCIL:
 			stencil = LLVMBuildLoad(builder,
-						ctx->radeon_bld.soa.outputs[i][1], "");
+						ctx->soa.outputs[i][1], "");
 			break;
 		case TGSI_SEMANTIC_SAMPLEMASK:
 			samplemask = LLVMBuildLoad(builder,
-						   ctx->radeon_bld.soa.outputs[i][0], "");
+						   ctx->soa.outputs[i][0], "");
 			break;
 		default:
 			fprintf(stderr, "Warning: SI unhandled fs output type:%d\n",
 				semantic_name);
 		}
 	}
 
 	/* Fill the return structure. */
 	ret = ctx->return_value;
 
 	/* Set SGPRs. */
 	ret = LLVMBuildInsertValue(builder, ret,
 				   bitcast(bld_base, TGSI_TYPE_SIGNED,
-					   LLVMGetParam(ctx->radeon_bld.main_fn,
+					   LLVMGetParam(ctx->main_fn,
 							SI_PARAM_ALPHA_REF)),
 				   SI_SGPR_ALPHA_REF, "");
 
 	/* Set VGPRs */
 	first_vgpr = vgpr = SI_SGPR_ALPHA_REF + 1;
 	for (i = 0; i < ARRAY_SIZE(color); i++) {
 		if (!color[i][0])
 			continue;
 
 		for (j = 0; j < 4; j++)
@@ -3295,21 +3224,21 @@ static void si_llvm_return_fs_outputs(struct lp_build_tgsi_context *bld_base)
 		ret = LLVMBuildInsertValue(builder, ret, depth, vgpr++, "");
 	if (stencil)
 		ret = LLVMBuildInsertValue(builder, ret, stencil, vgpr++, "");
 	if (samplemask)
 		ret = LLVMBuildInsertValue(builder, ret, samplemask, vgpr++, "");
 
 	/* Add the input sample mask for smoothing at the end. */
 	if (vgpr < first_vgpr + PS_EPILOG_SAMPLEMASK_MIN_LOC)
 		vgpr = first_vgpr + PS_EPILOG_SAMPLEMASK_MIN_LOC;
 	ret = LLVMBuildInsertValue(builder, ret,
-				   LLVMGetParam(ctx->radeon_bld.main_fn,
+				   LLVMGetParam(ctx->main_fn,
 						SI_PARAM_SAMPLE_COVERAGE), vgpr++, "");
 
 	ctx->return_value = ret;
 }
 
 /**
  * Given a v8i32 resource descriptor for a buffer, extract the size of the
  * buffer in number of elements and return it as an i32.
  */
 static LLVMValueRef get_buffer_size(
@@ -3384,29 +3313,29 @@ static void build_type_name_for_intr(
 static void build_tex_intrinsic(const struct lp_build_tgsi_action *action,
 				struct lp_build_tgsi_context *bld_base,
 				struct lp_build_emit_data *emit_data);
 
 /* Prevent optimizations (at least of memory accesses) across the current
  * point in the program by emitting empty inline assembly that is marked as
  * having side effects.
  */
 static void emit_optimization_barrier(struct si_shader_context *ctx)
 {
-	LLVMBuilderRef builder = ctx->radeon_bld.gallivm.builder;
+	LLVMBuilderRef builder = ctx->gallivm.builder;
 	LLVMTypeRef ftype = LLVMFunctionType(ctx->voidt, NULL, 0, false);
 	LLVMValueRef inlineasm = LLVMConstInlineAsm(ftype, "", "", true, false);
 	LLVMBuildCall(builder, inlineasm, NULL, 0, "");
 }
 
 static void emit_waitcnt(struct si_shader_context *ctx)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
 	LLVMValueRef args[1] = {
 		lp_build_const_int32(gallivm, 0xf70)
 	};
 	lp_build_intrinsic(builder, "llvm.amdgcn.s.waitcnt",
 			   ctx->voidt, args, 1, 0);
 }
 
 static void membar_emit(
 		const struct lp_build_tgsi_action *action,
@@ -3416,21 +3345,21 @@ static void membar_emit(
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 
 	emit_waitcnt(ctx);
 }
 
 static LLVMValueRef
 shader_buffer_fetch_rsrc(struct si_shader_context *ctx,
 			 const struct tgsi_full_src_register *reg)
 {
 	LLVMValueRef index;
-	LLVMValueRef rsrc_ptr = LLVMGetParam(ctx->radeon_bld.main_fn,
+	LLVMValueRef rsrc_ptr = LLVMGetParam(ctx->main_fn,
 					     SI_PARAM_SHADER_BUFFERS);
 
 	if (!reg->Register.Indirect)
 		index = LLVMConstInt(ctx->i32, reg->Register.Index, 0);
 	else
 		index = get_bounded_indirect_index(ctx, &reg->Indirect,
 						   reg->Register.Index,
 						   SI_NUM_SHADER_BUFFERS);
 
 	return build_indexed_load_const(ctx, rsrc_ptr, index);
@@ -3467,21 +3396,21 @@ static bool tgsi_is_array_image(unsigned target)
  * program termination) in this case, but it doesn't cost much to be a bit
  * nicer: disabling DCC in the shader still leads to undefined results but
  * avoids the lockup.
  */
 static LLVMValueRef force_dcc_off(struct si_shader_context *ctx,
 				  LLVMValueRef rsrc)
 {
 	if (ctx->screen->b.chip_class <= CIK) {
 		return rsrc;
 	} else {
-		LLVMBuilderRef builder = ctx->radeon_bld.gallivm.builder;
+		LLVMBuilderRef builder = ctx->gallivm.builder;
 		LLVMValueRef i32_6 = LLVMConstInt(ctx->i32, 6, 0);
 		LLVMValueRef i32_C = LLVMConstInt(ctx->i32, C_008F28_COMPRESSION_EN, 0);
 		LLVMValueRef tmp;
 
 		tmp = LLVMBuildExtractElement(builder, rsrc, i32_6, "");
 		tmp = LLVMBuildAnd(builder, tmp, i32_C, "");
 		return LLVMBuildInsertElement(builder, rsrc, tmp, i32_6, "");
 	}
 }
 
@@ -3489,21 +3418,21 @@ static LLVMValueRef force_dcc_off(struct si_shader_context *ctx,
  * Load the resource descriptor for \p image.
  */
 static void
 image_fetch_rsrc(
 	struct lp_build_tgsi_context *bld_base,
 	const struct tgsi_full_src_register *image,
 	bool dcc_off,
 	LLVMValueRef *rsrc)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
-	LLVMValueRef rsrc_ptr = LLVMGetParam(ctx->radeon_bld.main_fn,
+	LLVMValueRef rsrc_ptr = LLVMGetParam(ctx->main_fn,
 					     SI_PARAM_IMAGES);
 	LLVMValueRef index, tmp;
 
 	assert(image->Register.File == TGSI_FILE_IMAGE);
 
 	if (!image->Register.Indirect) {
 		const struct tgsi_shader_info *info = bld_base->info;
 
 		index = LLVMConstInt(ctx->i32, image->Register.Index, 0);
 
@@ -3600,22 +3529,22 @@ static void image_append_args(
 }
 
 /**
  * Given a 256 bit resource, extract the top half (which stores the buffer
  * resource in the case of textures and images).
  */
 static LLVMValueRef extract_rsrc_top_half(
 		struct si_shader_context *ctx,
 		LLVMValueRef rsrc)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
-	struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base;
+	struct gallivm_state *gallivm = &ctx->gallivm;
+	struct lp_build_tgsi_context *bld_base = &ctx->soa.bld_base;
 	LLVMTypeRef v2i128 = LLVMVectorType(ctx->i128, 2);
 
 	rsrc = LLVMBuildBitCast(gallivm->builder, rsrc, v2i128, "");
 	rsrc = LLVMBuildExtractElement(gallivm->builder, rsrc, bld_base->uint_bld.one, "");
 	rsrc = LLVMBuildBitCast(gallivm->builder, rsrc, ctx->v4i32, "");
 
 	return rsrc;
 }
 
 /**
@@ -3690,21 +3619,21 @@ static void load_fetch_args(
 
 			image_append_args(ctx, emit_data, target, false);
 		}
 	}
 }
 
 static void load_emit_buffer(struct si_shader_context *ctx,
 			     struct lp_build_emit_data *emit_data)
 {
 	const struct tgsi_full_instruction *inst = emit_data->inst;
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
 	uint writemask = inst->Dst[0].Register.WriteMask;
 	uint count = util_last_bit(writemask);
 	const char *intrinsic_name;
 	LLVMTypeRef dst_type;
 
 	switch (count) {
 	case 1:
 		intrinsic_name = "llvm.amdgcn.buffer.load.f32";
 		dst_type = ctx->f32;
@@ -3722,43 +3651,43 @@ static void load_emit_buffer(struct si_shader_context *ctx,
 	emit_data->output[emit_data->chan] = lp_build_intrinsic(
 			builder, intrinsic_name, dst_type,
 			emit_data->args, emit_data->arg_count,
 			LLVMReadOnlyAttribute);
 }
 
 static LLVMValueRef get_memory_ptr(struct si_shader_context *ctx,
                                    const struct tgsi_full_instruction *inst,
                                    LLVMTypeRef type, int arg)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
 	LLVMValueRef offset, ptr;
 	int addr_space;
 
-	offset = lp_build_emit_fetch(&ctx->radeon_bld.soa.bld_base, inst, arg, 0);
+	offset = lp_build_emit_fetch(&ctx->soa.bld_base, inst, arg, 0);
 	offset = LLVMBuildBitCast(builder, offset, ctx->i32, "");
 
 	ptr = ctx->shared_memory;
 	ptr = LLVMBuildGEP(builder, ptr, &offset, 1, "");
 	addr_space = LLVMGetPointerAddressSpace(LLVMTypeOf(ptr));
 	ptr = LLVMBuildBitCast(builder, ptr, LLVMPointerType(type, addr_space), "");
 
 	return ptr;
 }
 
 static void load_emit_memory(
 		struct si_shader_context *ctx,
 		struct lp_build_emit_data *emit_data)
 {
 	const struct tgsi_full_instruction *inst = emit_data->inst;
-	struct lp_build_context *base = &ctx->radeon_bld.soa.bld_base.base;
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct lp_build_context *base = &ctx->soa.bld_base.base;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
 	unsigned writemask = inst->Dst[0].Register.WriteMask;
 	LLVMValueRef channels[4], ptr, derived_ptr, index;
 	int chan;
 
 	ptr = get_memory_ptr(ctx, inst, base->elem_type, 1);
 
 	for (chan = 0; chan < 4; ++chan) {
 		if (!(writemask & (1 << chan))) {
 			channels[chan] = LLVMGetUndef(base->elem_type);
@@ -3900,23 +3829,23 @@ static void store_fetch_args(
 			image_append_args(ctx, emit_data, target, false);
 		}
 	}
 }
 
 static void store_emit_buffer(
 		struct si_shader_context *ctx,
 		struct lp_build_emit_data *emit_data)
 {
 	const struct tgsi_full_instruction *inst = emit_data->inst;
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
-	struct lp_build_context *uint_bld = &ctx->radeon_bld.soa.bld_base.uint_bld;
+	struct lp_build_context *uint_bld = &ctx->soa.bld_base.uint_bld;
 	LLVMValueRef base_data = emit_data->args[0];
 	LLVMValueRef base_offset = emit_data->args[3];
 	unsigned writemask = inst->Dst[0].Register.WriteMask;
 
 	while (writemask) {
 		int start, count;
 		const char *intrinsic_name;
 		LLVMValueRef data;
 		LLVMValueRef offset;
 		LLVMValueRef tmp;
@@ -3972,34 +3901,34 @@ static void store_emit_buffer(
 			builder, intrinsic_name, emit_data->dst_type,
 			emit_data->args, emit_data->arg_count, 0);
 	}
 }
 
 static void store_emit_memory(
 		struct si_shader_context *ctx,
 		struct lp_build_emit_data *emit_data)
 {
 	const struct tgsi_full_instruction *inst = emit_data->inst;
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
-	struct lp_build_context *base = &ctx->radeon_bld.soa.bld_base.base;
+	struct gallivm_state *gallivm = &ctx->gallivm;
+	struct lp_build_context *base = &ctx->soa.bld_base.base;
 	LLVMBuilderRef builder = gallivm->builder;
 	unsigned writemask = inst->Dst[0].Register.WriteMask;
 	LLVMValueRef ptr, derived_ptr, data, index;
 	int chan;
 
 	ptr = get_memory_ptr(ctx, inst, base->elem_type, 0);
 
 	for (chan = 0; chan < 4; ++chan) {
 		if (!(writemask & (1 << chan))) {
 			continue;
 		}
-		data = lp_build_emit_fetch(&ctx->radeon_bld.soa.bld_base, inst, 1, chan);
+		data = lp_build_emit_fetch(&ctx->soa.bld_base, inst, 1, chan);
 		index = lp_build_const_int32(gallivm, chan);
 		derived_ptr = LLVMBuildGEP(builder, ptr, &index, 1, "");
 		LLVMBuildStore(builder, data, derived_ptr);
 	}
 }
 
 static void store_emit(
 		const struct lp_build_tgsi_action *action,
 		struct lp_build_tgsi_context *bld_base,
 		struct lp_build_emit_data *emit_data)
@@ -4098,33 +4027,33 @@ static void atomic_fetch_args(
 			emit_data->args[emit_data->arg_count++] = coords;
 			emit_data->args[emit_data->arg_count++] = rsrc;
 
 			image_append_args(ctx, emit_data, target, true);
 		}
 	}
 }
 
 static void atomic_emit_memory(struct si_shader_context *ctx,
                                struct lp_build_emit_data *emit_data) {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
 	const struct tgsi_full_instruction * inst = emit_data->inst;
 	LLVMValueRef ptr, result, arg;
 
 	ptr = get_memory_ptr(ctx, inst, ctx->i32, 1);
 
-	arg = lp_build_emit_fetch(&ctx->radeon_bld.soa.bld_base, inst, 2, 0);
+	arg = lp_build_emit_fetch(&ctx->soa.bld_base, inst, 2, 0);
 	arg = LLVMBuildBitCast(builder, arg, ctx->i32, "");
 
 	if (inst->Instruction.Opcode == TGSI_OPCODE_ATOMCAS) {
 		LLVMValueRef new_data;
-		new_data = lp_build_emit_fetch(&ctx->radeon_bld.soa.bld_base,
+		new_data = lp_build_emit_fetch(&ctx->soa.bld_base,
 		                               inst, 3, 0);
 
 		new_data = LLVMBuildBitCast(builder, new_data, ctx->i32, "");
 
 #if HAVE_LLVM >= 0x309
 		result = LLVMBuildAtomicCmpXchg(builder, ptr, arg, new_data,
 		                       LLVMAtomicOrderingSequentiallyConsistent,
 		                       LLVMAtomicOrderingSequentiallyConsistent,
 		                       false);
 #endif
@@ -4283,21 +4212,21 @@ static void resq_emit(
 	emit_data->output[emit_data->chan] = out;
 }
 
 static void set_tex_fetch_args(struct si_shader_context *ctx,
 			       struct lp_build_emit_data *emit_data,
 			       unsigned opcode, unsigned target,
 			       LLVMValueRef res_ptr, LLVMValueRef samp_ptr,
 			       LLVMValueRef *param, unsigned count,
 			       unsigned dmask)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	unsigned num_args;
 	unsigned is_rect = target == TGSI_TEXTURE_RECT;
 
 	/* Pad to power of two vector */
 	while (count < util_next_power_of_two(count))
 		param[count++] = LLVMGetUndef(ctx->i32);
 
 	/* Texture coordinates. */
 	if (count > 1)
 		emit_data->args[0] = lp_build_gather_values(gallivm, param, count);
@@ -4343,21 +4272,21 @@ static LLVMTypeRef const_array(LLVMTypeRef elem_type, int num_elements)
 			       CONST_ADDR_SPACE);
 }
 
 /**
  * Load an image view, fmask view. or sampler state descriptor.
  */
 static LLVMValueRef load_sampler_desc_custom(struct si_shader_context *ctx,
 					     LLVMValueRef list, LLVMValueRef index,
 					     enum desc_type type)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
 
 	switch (type) {
 	case DESC_IMAGE:
 		/* The image is at [0:7]. */
 		index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->i32, 2, 0), "");
 		break;
 	case DESC_FMASK:
 		/* The FMASK is at [8:15]. */
 		index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->i32, 2, 0), "");
@@ -4371,41 +4300,41 @@ static LLVMValueRef load_sampler_desc_custom(struct si_shader_context *ctx,
 					    const_array(ctx->v4i32, 0), "");
 		break;
 	}
 
 	return build_indexed_load_const(ctx, list, index);
 }
 
 static LLVMValueRef load_sampler_desc(struct si_shader_context *ctx,
 				     LLVMValueRef index, enum desc_type type)
 {
-	LLVMValueRef list = LLVMGetParam(ctx->radeon_bld.main_fn,
+	LLVMValueRef list = LLVMGetParam(ctx->main_fn,
 					 SI_PARAM_SAMPLERS);
 
 	return load_sampler_desc_custom(ctx, list, index, type);
 }
 
 /* Disable anisotropic filtering if BASE_LEVEL == LAST_LEVEL.
  *
  * SI-CI:
  *   If BASE_LEVEL == LAST_LEVEL, the shader must disable anisotropic
  *   filtering manually. The driver sets img7 to a mask clearing
  *   MAX_ANISO_RATIO if BASE_LEVEL == LAST_LEVEL. The shader must do:
  *     s_and_b32 samp0, samp0, img7
  *
  * VI:
  *   The ANISO_OVERRIDE sampler field enables this fix in TA.
  */
 static LLVMValueRef sici_fix_sampler_aniso(struct si_shader_context *ctx,
 					   LLVMValueRef res, LLVMValueRef samp)
 {
-	LLVMBuilderRef builder = ctx->radeon_bld.gallivm.builder;
+	LLVMBuilderRef builder = ctx->gallivm.builder;
 	LLVMValueRef img7, samp0;
 
 	if (ctx->screen->b.chip_class >= VI)
 		return samp;
 
 	img7 = LLVMBuildExtractElement(builder, res,
 				       LLVMConstInt(ctx->i32, 7, 0), "");
 	samp0 = LLVMBuildExtractElement(builder, samp,
 					LLVMConstInt(ctx->i32, 0, 0), "");
 	samp0 = LLVMBuildAnd(builder, samp0, img7, "");
@@ -4860,51 +4789,51 @@ static void tex_fetch_args(
  * the texel size.
  *
  * The workaround is to subtract 0.5 from the unnormalized coordinates,
  * or (0.5 / size) from the normalized coordinates.
  */
 static void si_lower_gather4_integer(struct si_shader_context *ctx,
 				     struct lp_build_emit_data *emit_data,
 				     const char *intr_name,
 				     unsigned coord_vgpr_index)
 {
-	LLVMBuilderRef builder = ctx->radeon_bld.gallivm.builder;
+	LLVMBuilderRef builder = ctx->gallivm.builder;
 	LLVMValueRef coord = emit_data->args[0];
 	LLVMValueRef half_texel[2];
 	int c;
 
 	if (emit_data->inst->Texture.Texture == TGSI_TEXTURE_RECT ||
 	    emit_data->inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT) {
 		half_texel[0] = half_texel[1] = LLVMConstReal(ctx->f32, -0.5);
 	} else {
 		struct tgsi_full_instruction txq_inst = {};
 		struct lp_build_emit_data txq_emit_data = {};
 
 		/* Query the texture size. */
 		txq_inst.Texture.Texture = emit_data->inst->Texture.Texture;
 		txq_emit_data.inst = &txq_inst;
 		txq_emit_data.dst_type = ctx->v4i32;
 		set_tex_fetch_args(ctx, &txq_emit_data, TGSI_OPCODE_TXQ,
 				   txq_inst.Texture.Texture,
 				   emit_data->args[1], NULL,
-				   &ctx->radeon_bld.soa.bld_base.uint_bld.zero,
+				   &ctx->soa.bld_base.uint_bld.zero,
 				   1, 0xf);
-		txq_emit(NULL, &ctx->radeon_bld.soa.bld_base, &txq_emit_data);
+		txq_emit(NULL, &ctx->soa.bld_base, &txq_emit_data);
 
 		/* Compute -0.5 / size. */
 		for (c = 0; c < 2; c++) {
 			half_texel[c] =
 				LLVMBuildExtractElement(builder, txq_emit_data.output[0],
 							LLVMConstInt(ctx->i32, c, 0), "");
 			half_texel[c] = LLVMBuildUIToFP(builder, half_texel[c], ctx->f32, "");
 			half_texel[c] =
-				lp_build_emit_llvm_unary(&ctx->radeon_bld.soa.bld_base,
+				lp_build_emit_llvm_unary(&ctx->soa.bld_base,
 							 TGSI_OPCODE_RCP, half_texel[c]);
 			half_texel[c] = LLVMBuildFMul(builder, half_texel[c],
 						      LLVMConstReal(ctx->f32, -0.5), "");
 		}
 	}
 
 	for (c = 0; c < 2; c++) {
 		LLVMValueRef tmp;
 		LLVMValueRef index = LLVMConstInt(ctx->i32, coord_vgpr_index + c, 0);
 
@@ -5190,21 +5119,21 @@ static void interp_fetch_args(
 		LLVMValueRef sample_id;
 		LLVMValueRef halfval = lp_build_const_float(gallivm, 0.5f);
 
 		/* fetch sample ID, then fetch its sample position,
 		 * and place into first two channels.
 		 */
 		sample_id = lp_build_emit_fetch(bld_base,
 						emit_data->inst, 1, TGSI_CHAN_X);
 		sample_id = LLVMBuildBitCast(gallivm->builder, sample_id,
 					     ctx->i32, "");
-		sample_position = load_sample_position(&ctx->radeon_bld, sample_id);
+		sample_position = load_sample_position(ctx, sample_id);
 
 		emit_data->args[0] = LLVMBuildExtractElement(gallivm->builder,
 							     sample_position,
 							     lp_build_const_int32(gallivm, 0), "");
 
 		emit_data->args[0] = LLVMBuildFSub(gallivm->builder, emit_data->args[0], halfval, "");
 		emit_data->args[1] = LLVMBuildExtractElement(gallivm->builder,
 							     sample_position,
 							     lp_build_const_int32(gallivm, 1), "");
 		emit_data->args[1] = LLVMBuildFSub(gallivm->builder, emit_data->args[1], halfval, "");
@@ -5219,21 +5148,21 @@ static void build_interp_intrinsic(const struct lp_build_tgsi_action *action,
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct si_shader *shader = ctx->shader;
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	LLVMValueRef interp_param;
 	const struct tgsi_full_instruction *inst = emit_data->inst;
 	const char *intr_name;
 	int input_index = inst->Src[0].Register.Index;
 	int chan;
 	int i;
 	LLVMValueRef attr_number;
-	LLVMValueRef params = LLVMGetParam(ctx->radeon_bld.main_fn, SI_PARAM_PRIM_MASK);
+	LLVMValueRef params = LLVMGetParam(ctx->main_fn, SI_PARAM_PRIM_MASK);
 	int interp_param_idx;
 	unsigned interp = shader->selector->info.input_interpolate[input_index];
 	unsigned location;
 
 	assert(inst->Src[0].Register.File == TGSI_FILE_INPUT);
 
 	if (inst->Instruction.Opcode == TGSI_OPCODE_INTERP_OFFSET ||
 	    inst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE)
 		location = TGSI_INTERPOLATE_LOC_CENTER;
 	else
@@ -5328,21 +5257,21 @@ static unsigned si_llvm_get_stream(struct lp_build_tgsi_context *bld_base,
 static void si_llvm_emit_vertex(
 	const struct lp_build_tgsi_action *action,
 	struct lp_build_tgsi_context *bld_base,
 	struct lp_build_emit_data *emit_data)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct lp_build_context *uint = &bld_base->uint_bld;
 	struct si_shader *shader = ctx->shader;
 	struct tgsi_shader_info *info = &shader->selector->info;
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
-	LLVMValueRef soffset = LLVMGetParam(ctx->radeon_bld.main_fn,
+	LLVMValueRef soffset = LLVMGetParam(ctx->main_fn,
 					    SI_PARAM_GS2VS_OFFSET);
 	LLVMValueRef gs_next_vertex;
 	LLVMValueRef can_emit, kill;
 	LLVMValueRef args[2];
 	unsigned chan;
 	int i;
 	unsigned stream;
 
 	stream = si_llvm_get_stream(bld_base, emit_data);
 
@@ -5361,21 +5290,21 @@ static void si_llvm_emit_vertex(
 						      shader->selector->gs_max_out_vertices), "");
 	kill = lp_build_select(&bld_base->base, can_emit,
 			       lp_build_const_float(gallivm, 1.0f),
 			       lp_build_const_float(gallivm, -1.0f));
 
 	lp_build_intrinsic(gallivm->builder, "llvm.AMDGPU.kill",
 			   ctx->voidt, &kill, 1, 0);
 
 	for (i = 0; i < info->num_outputs; i++) {
 		LLVMValueRef *out_ptr =
-			ctx->radeon_bld.soa.outputs[i];
+			ctx->soa.outputs[i];
 
 		for (chan = 0; chan < 4; chan++) {
 			LLVMValueRef out_val = LLVMBuildLoad(gallivm->builder, out_ptr[chan], "");
 			LLVMValueRef voffset =
 				lp_build_const_int32(gallivm, (i * 4 + chan) *
 						     shader->selector->gs_max_out_vertices);
 
 			voffset = lp_build_add(uint, voffset, gs_next_vertex);
 			voffset = lp_build_mul_imm(uint, voffset, 4);
 
@@ -5390,40 +5319,40 @@ static void si_llvm_emit_vertex(
 					    1, 0, 1, 1, 0);
 		}
 	}
 	gs_next_vertex = lp_build_add(uint, gs_next_vertex,
 				      lp_build_const_int32(gallivm, 1));
 
 	LLVMBuildStore(gallivm->builder, gs_next_vertex, ctx->gs_next_vertex[stream]);
 
 	/* Signal vertex emission */
 	args[0] = lp_build_const_int32(gallivm, SENDMSG_GS_OP_EMIT | SENDMSG_GS | (stream << 8));
-	args[1] = LLVMGetParam(ctx->radeon_bld.main_fn, SI_PARAM_GS_WAVE_ID);
+	args[1] = LLVMGetParam(ctx->main_fn, SI_PARAM_GS_WAVE_ID);
 	lp_build_intrinsic(gallivm->builder, "llvm.SI.sendmsg",
 			   ctx->voidt, args, 2, 0);
 }
 
 /* Cut one primitive from the geometry shader */
 static void si_llvm_emit_primitive(
 	const struct lp_build_tgsi_action *action,
 	struct lp_build_tgsi_context *bld_base,
 	struct lp_build_emit_data *emit_data)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	LLVMValueRef args[2];
 	unsigned stream;
 
 	/* Signal primitive cut */
 	stream = si_llvm_get_stream(bld_base, emit_data);
 	args[0] = lp_build_const_int32(gallivm,	SENDMSG_GS_OP_CUT | SENDMSG_GS | (stream << 8));
-	args[1] = LLVMGetParam(ctx->radeon_bld.main_fn, SI_PARAM_GS_WAVE_ID);
+	args[1] = LLVMGetParam(ctx->main_fn, SI_PARAM_GS_WAVE_ID);
 	lp_build_intrinsic(gallivm->builder, "llvm.SI.sendmsg",
 			   ctx->voidt, args, 2, 0);
 }
 
 static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
 				 struct lp_build_tgsi_context *bld_base,
 				 struct lp_build_emit_data *emit_data)
 {
 	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
@@ -5452,62 +5381,62 @@ static const struct lp_build_tgsi_action interp_action = {
 	.emit = build_interp_intrinsic,
 };
 
 static void si_create_function(struct si_shader_context *ctx,
 			       LLVMTypeRef *returns, unsigned num_returns,
 			       LLVMTypeRef *params, unsigned num_params,
 			       int last_sgpr)
 {
 	int i;
 
-	radeon_llvm_create_func(&ctx->radeon_bld, returns, num_returns,
+	radeon_llvm_create_func(ctx, returns, num_returns,
 				params, num_params);
-	radeon_llvm_shader_type(ctx->radeon_bld.main_fn, ctx->type);
-	ctx->return_value = LLVMGetUndef(ctx->radeon_bld.return_type);
+	radeon_llvm_shader_type(ctx->main_fn, ctx->type);
+	ctx->return_value = LLVMGetUndef(ctx->return_type);
 
 	for (i = 0; i <= last_sgpr; ++i) {
-		LLVMValueRef P = LLVMGetParam(ctx->radeon_bld.main_fn, i);
+		LLVMValueRef P = LLVMGetParam(ctx->main_fn, i);
 
 		/* The combination of:
 		 * - ByVal
 		 * - dereferenceable
 		 * - invariant.load
 		 * allows the optimization passes to move loads and reduces
 		 * SGPR spilling significantly.
 		 */
 		if (LLVMGetTypeKind(LLVMTypeOf(P)) == LLVMPointerTypeKind) {
 			LLVMAddAttribute(P, LLVMByValAttribute);
 			lp_add_attr_dereferenceable(P, UINT64_MAX);
 		} else
 			LLVMAddAttribute(P, LLVMInRegAttribute);
 	}
 
 	if (ctx->screen->b.debug_flags & DBG_UNSAFE_MATH) {
 		/* These were copied from some LLVM test. */
-		LLVMAddTargetDependentFunctionAttr(ctx->radeon_bld.main_fn,
+		LLVMAddTargetDependentFunctionAttr(ctx->main_fn,
 						   "less-precise-fpmad",
 						   "true");
-		LLVMAddTargetDependentFunctionAttr(ctx->radeon_bld.main_fn,
+		LLVMAddTargetDependentFunctionAttr(ctx->main_fn,
 						   "no-infs-fp-math",
 						   "true");
-		LLVMAddTargetDependentFunctionAttr(ctx->radeon_bld.main_fn,
+		LLVMAddTargetDependentFunctionAttr(ctx->main_fn,
 						   "no-nans-fp-math",
 						   "true");
-		LLVMAddTargetDependentFunctionAttr(ctx->radeon_bld.main_fn,
+		LLVMAddTargetDependentFunctionAttr(ctx->main_fn,
 						   "unsafe-fp-math",
 						   "true");
 	}
 }
 
 static void create_meta_data(struct si_shader_context *ctx)
 {
-	struct gallivm_state *gallivm = ctx->radeon_bld.soa.bld_base.base.gallivm;
+	struct gallivm_state *gallivm = ctx->soa.bld_base.base.gallivm;
 
 	ctx->invariant_load_md_kind = LLVMGetMDKindIDInContext(gallivm->context,
 							       "invariant.load", 14);
 	ctx->range_md_kind = LLVMGetMDKindIDInContext(gallivm->context,
 						     "range", 5);
 	ctx->uniform_md_kind = LLVMGetMDKindIDInContext(gallivm->context,
 							"amdgpu.uniform", 14);
 
 	ctx->empty_md = LLVMMDNodeInContext(gallivm->context, NULL, 0);
 }
@@ -5552,33 +5481,33 @@ static unsigned llvm_get_type_size(LLVMTypeRef type)
 		return LLVMGetVectorSize(type) *
 		       llvm_get_type_size(LLVMGetElementType(type));
 	default:
 		assert(0);
 		return 0;
 	}
 }
 
 static void declare_tess_lds(struct si_shader_context *ctx)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
-	struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base;
+	struct gallivm_state *gallivm = &ctx->gallivm;
+	struct lp_build_tgsi_context *bld_base = &ctx->soa.bld_base;
 	struct lp_build_context *uint = &bld_base->uint_bld;
 
 	unsigned lds_size = ctx->screen->b.chip_class >= CIK ? 65536 : 32768;
 	ctx->lds = LLVMBuildIntToPtr(gallivm->builder, uint->zero,
 		LLVMPointerType(LLVMArrayType(ctx->i32, lds_size / 4), LOCAL_ADDR_SPACE),
 		"tess_lds");
 }
 
 static void create_function(struct si_shader_context *ctx)
 {
-	struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base;
+	struct lp_build_tgsi_context *bld_base = &ctx->soa.bld_base;
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	struct si_shader *shader = ctx->shader;
 	LLVMTypeRef params[SI_NUM_PARAMS + SI_NUM_VERTEX_BUFFERS], v3i32;
 	LLVMTypeRef returns[16+32*4];
 	unsigned i, last_sgpr, num_params, num_return_sgprs;
 	unsigned num_returns = 0;
 
 	v3i32 = LLVMVectorType(ctx->i32, 3);
 
 	params[SI_PARAM_RW_BUFFERS] = const_array(ctx->v16i8, SI_NUM_RW_BUFFERS);
@@ -5776,21 +5705,21 @@ static void create_function(struct si_shader_context *ctx)
 	}
 
 	assert(num_params <= ARRAY_SIZE(params));
 
 	si_create_function(ctx, returns, num_returns, params,
 			   num_params, last_sgpr);
 
 	/* Reserve register locations for VGPR inputs the PS prolog may need. */
 	if (ctx->type == PIPE_SHADER_FRAGMENT &&
 	    !ctx->is_monolithic) {
-		radeon_llvm_add_attribute(ctx->radeon_bld.main_fn,
+		radeon_llvm_add_attribute(ctx->main_fn,
 					  "InitialPSInputAddr",
 					  S_0286D0_PERSP_SAMPLE_ENA(1) |
 					  S_0286D0_PERSP_CENTER_ENA(1) |
 					  S_0286D0_PERSP_CENTROID_ENA(1) |
 					  S_0286D0_LINEAR_SAMPLE_ENA(1) |
 					  S_0286D0_LINEAR_CENTER_ENA(1) |
 					  S_0286D0_LINEAR_CENTROID_ENA(1) |
 					  S_0286D0_FRONT_FACE_ENA(1) |
 					  S_0286D0_POS_FIXED_PT_ENA(1));
 	} else if (ctx->type == PIPE_SHADER_COMPUTE) {
@@ -5800,21 +5729,21 @@ static void create_function(struct si_shader_context *ctx)
 		               properties[TGSI_PROPERTY_CS_FIXED_BLOCK_HEIGHT] *
 		               properties[TGSI_PROPERTY_CS_FIXED_BLOCK_DEPTH];
 
 		if (!max_work_group_size) {
 			/* This is a variable group size compute shader,
 			 * compile it for the maximum possible group size.
 			 */
 			max_work_group_size = SI_MAX_VARIABLE_THREADS_PER_BLOCK;
 		}
 
-		radeon_llvm_add_attribute(ctx->radeon_bld.main_fn,
+		radeon_llvm_add_attribute(ctx->main_fn,
 		                          "amdgpu-max-work-group-size",
 		                          max_work_group_size);
 	}
 
 	shader->info.num_input_sgprs = 0;
 	shader->info.num_input_vgprs = 0;
 
 	for (i = 0; i <= last_sgpr; ++i)
 		shader->info.num_input_sgprs += llvm_get_type_size(params[i]) / 4;
 
@@ -5845,23 +5774,23 @@ static void create_function(struct si_shader_context *ctx)
 		declare_tess_lds(ctx);
 }
 
 /**
  * Load ESGS and GSVS ring buffer resource descriptors and save the variables
  * for later use.
  */
 static void preload_ring_buffers(struct si_shader_context *ctx)
 {
 	struct gallivm_state *gallivm =
-		ctx->radeon_bld.soa.bld_base.base.gallivm;
+		ctx->soa.bld_base.base.gallivm;
 
-	LLVMValueRef buf_ptr = LLVMGetParam(ctx->radeon_bld.main_fn,
+	LLVMValueRef buf_ptr = LLVMGetParam(ctx->main_fn,
 					    SI_PARAM_RW_BUFFERS);
 
 	if ((ctx->type == PIPE_SHADER_VERTEX &&
 	     ctx->shader->key.vs.as_es) ||
 	    (ctx->type == PIPE_SHADER_TESS_EVAL &&
 	     ctx->shader->key.tes.as_es) ||
 	    ctx->type == PIPE_SHADER_GEOMETRY) {
 		unsigned ring =
 			ctx->type == PIPE_SHADER_GEOMETRY ? SI_GS_RING_ESGS
 							     : SI_ES_RING_ESGS;
@@ -5886,21 +5815,21 @@ static void preload_ring_buffers(struct si_shader_context *ctx)
 				build_indexed_load_const(ctx, buf_ptr, offset);
 		}
 	}
 }
 
 static void si_llvm_emit_polygon_stipple(struct si_shader_context *ctx,
 					 LLVMValueRef param_rw_buffers,
 					 unsigned param_pos_fixed_pt)
 {
 	struct lp_build_tgsi_context *bld_base =
-		&ctx->radeon_bld.soa.bld_base;
+		&ctx->soa.bld_base;
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
 	LLVMValueRef slot, desc, offset, row, bit, address[2];
 
 	/* Use the fixed-point gl_FragCoord input.
 	 * Since the stipple pattern is 32x32 and it repeats, just get 5 bits
 	 * per coordinate to get the repeating effect.
 	 */
 	address[0] = unpack_param(ctx, param_pos_fixed_pt, 0, 5);
 	address[1] = unpack_param(ctx, param_pos_fixed_pt, 16, 5);
@@ -6355,52 +6284,52 @@ int si_compile_llvm(struct si_screen *sscreen,
 		fprintf(stderr, "radeonsi: The shader can't have rodata.");
 		return -EINVAL;
 	}
 
 	return r;
 }
 
 static void si_llvm_build_ret(struct si_shader_context *ctx, LLVMValueRef ret)
 {
 	if (LLVMGetTypeKind(LLVMTypeOf(ret)) == LLVMVoidTypeKind)
-		LLVMBuildRetVoid(ctx->radeon_bld.gallivm.builder);
+		LLVMBuildRetVoid(ctx->gallivm.builder);
 	else
-		LLVMBuildRet(ctx->radeon_bld.gallivm.builder, ret);
+		LLVMBuildRet(ctx->gallivm.builder, ret);
 }
 
 /* Generate code for the hardware VS shader stage to go with a geometry shader */
 static int si_generate_gs_copy_shader(struct si_screen *sscreen,
 				      struct si_shader_context *ctx,
 				      struct si_shader *gs,
 				      struct pipe_debug_callback *debug)
 {
-	struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
-	struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base;
+	struct gallivm_state *gallivm = &ctx->gallivm;
+	struct lp_build_tgsi_context *bld_base = &ctx->soa.bld_base;
 	struct lp_build_context *uint = &bld_base->uint_bld;
 	struct si_shader_output_values *outputs;
 	struct tgsi_shader_info *gsinfo = &gs->selector->info;
 	LLVMValueRef args[9];
 	int i, r;
 
 	outputs = MALLOC(gsinfo->num_outputs * sizeof(outputs[0]));
 
 	si_init_shader_ctx(ctx, sscreen, ctx->shader, ctx->tm);
 	ctx->type = PIPE_SHADER_VERTEX;
 	ctx->is_gs_copy_shader = true;
 
 	create_meta_data(ctx);
 	create_function(ctx);
 	preload_ring_buffers(ctx);
 
 	args[0] = ctx->gsvs_ring[0];
 	args[1] = lp_build_mul_imm(uint,
-				   LLVMGetParam(ctx->radeon_bld.main_fn,
+				   LLVMGetParam(ctx->main_fn,
 						ctx->param_vertex_id),
 				   4);
 	args[3] = uint->zero;
 	args[4] = uint->one;  /* OFFEN */
 	args[5] = uint->zero; /* IDXEN */
 	args[6] = uint->one;  /* GLC */
 	args[7] = uint->one;  /* SLC */
 	args[8] = uint->zero; /* TFE */
 
 	/* Fetch vertex data from GSVS ring */
@@ -6427,38 +6356,37 @@ static int si_generate_gs_copy_shader(struct si_screen *sscreen,
 
 	si_llvm_export_vs(bld_base, outputs, gsinfo->num_outputs);
 
 	LLVMBuildRetVoid(gallivm->builder);
 
 	/* Dump LLVM IR before any optimization passes */
 	if (sscreen->b.debug_flags & DBG_PREOPT_IR &&
 	    r600_can_dump_shader(&sscreen->b, PIPE_SHADER_GEOMETRY))
 		LLVMDumpModule(bld_base->base.gallivm->module);
 
-	radeon_llvm_finalize_module(
-		&ctx->radeon_bld,
+	radeon_llvm_finalize_module(ctx,
 		r600_extra_shader_checks(&sscreen->b, PIPE_SHADER_GEOMETRY));
 
 	r = si_compile_llvm(sscreen, &ctx->shader->binary,
 			    &ctx->shader->config, ctx->tm,
 			    bld_base->base.gallivm->module,
 			    debug, PIPE_SHADER_GEOMETRY,
 			    "GS Copy Shader");
 	if (!r) {
 		if (r600_can_dump_shader(&sscreen->b, PIPE_SHADER_GEOMETRY))
 			fprintf(stderr, "GS Copy Shader:\n");
 		si_shader_dump(sscreen, ctx->shader, debug,
 			       PIPE_SHADER_GEOMETRY, stderr);
 		r = si_shader_binary_upload(sscreen, ctx->shader);
 	}
 
-	radeon_llvm_dispose(&ctx->radeon_bld);
+	radeon_llvm_dispose(ctx);
 
 	FREE(outputs);
 	return r;
 }
 
 static void si_dump_shader_key(unsigned shader, union si_shader_key *key,
 			       FILE *f)
 {
 	int i;
 
@@ -6516,46 +6444,46 @@ static void si_dump_shader_key(unsigned shader, union si_shader_key *key,
 static void si_init_shader_ctx(struct si_shader_context *ctx,
 			       struct si_screen *sscreen,
 			       struct si_shader *shader,
 			       LLVMTargetMachineRef tm)
 {
 	struct lp_build_tgsi_context *bld_base;
 	struct lp_build_tgsi_action tmpl = {};
 
 	memset(ctx, 0, sizeof(*ctx));
 	radeon_llvm_context_init(
-		&ctx->radeon_bld, "amdgcn--",
+		ctx, "amdgcn--",
 		(shader && shader->selector) ? &shader->selector->info : NULL,
 		(shader && shader->selector) ? shader->selector->tokens : NULL);
-	si_shader_context_init_alu(&ctx->radeon_bld.soa.bld_base);
+	si_shader_context_init_alu(&ctx->soa.bld_base);
 	ctx->tm = tm;
 	ctx->screen = sscreen;
 	if (shader && shader->selector)
 		ctx->type = shader->selector->info.processor;
 	else
 		ctx->type = -1;
 	ctx->shader = shader;
 
-	ctx->voidt = LLVMVoidTypeInContext(ctx->radeon_bld.gallivm.context);
-	ctx->i1 = LLVMInt1TypeInContext(ctx->radeon_bld.gallivm.context);
-	ctx->i8 = LLVMInt8TypeInContext(ctx->radeon_bld.gallivm.context);
-	ctx->i32 = LLVMInt32TypeInContext(ctx->radeon_bld.gallivm.context);
-	ctx->i64 = LLVMInt64TypeInContext(ctx->radeon_bld.gallivm.context);
-	ctx->i128 = LLVMIntTypeInContext(ctx->radeon_bld.gallivm.context, 128);
-	ctx->f32 = LLVMFloatTypeInContext(ctx->radeon_bld.gallivm.context);
+	ctx->voidt = LLVMVoidTypeInContext(ctx->gallivm.context);
+	ctx->i1 = LLVMInt1TypeInContext(ctx->gallivm.context);
+	ctx->i8 = LLVMInt8TypeInContext(ctx->gallivm.context);
+	ctx->i32 = LLVMInt32TypeInContext(ctx->gallivm.context);
+	ctx->i64 = LLVMInt64TypeInContext(ctx->gallivm.context);
+	ctx->i128 = LLVMIntTypeInContext(ctx->gallivm.context, 128);
+	ctx->f32 = LLVMFloatTypeInContext(ctx->gallivm.context);
 	ctx->v16i8 = LLVMVectorType(ctx->i8, 16);
 	ctx->v2i32 = LLVMVectorType(ctx->i32, 2);
 	ctx->v4i32 = LLVMVectorType(ctx->i32, 4);
 	ctx->v4f32 = LLVMVectorType(ctx->f32, 4);
 	ctx->v8i32 = LLVMVectorType(ctx->i32, 8);
 
-	bld_base = &ctx->radeon_bld.soa.bld_base;
+	bld_base = &ctx->soa.bld_base;
 	bld_base->emit_fetch_funcs[TGSI_FILE_CONSTANT] = fetch_constant;
 
 	bld_base->op_actions[TGSI_OPCODE_INTERP_CENTROID] = interp_action;
 	bld_base->op_actions[TGSI_OPCODE_INTERP_SAMPLE] = interp_action;
 	bld_base->op_actions[TGSI_OPCODE_INTERP_OFFSET] = interp_action;
 
 	bld_base->op_actions[TGSI_OPCODE_TEX] = tex_action;
 	bld_base->op_actions[TGSI_OPCODE_TEX2] = tex_action;
 	bld_base->op_actions[TGSI_OPCODE_TXB] = tex_action;
 	bld_base->op_actions[TGSI_OPCODE_TXB2] = tex_action;
@@ -6630,26 +6558,26 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
 	    !(sscreen->b.debug_flags & DBG_NO_TGSI)) {
 		tgsi_dump(sel->tokens, 0);
 		si_dump_streamout(&sel->so);
 	}
 
 	si_init_shader_ctx(&ctx, sscreen, shader, tm);
 	ctx.is_monolithic = is_monolithic;
 
 	shader->info.uses_instanceid = sel->info.uses_instanceid;
 
-	bld_base = &ctx.radeon_bld.soa.bld_base;
-	ctx.radeon_bld.load_system_value = declare_system_value;
+	bld_base = &ctx.soa.bld_base;
+	ctx.load_system_value = declare_system_value;
 
 	switch (ctx.type) {
 	case PIPE_SHADER_VERTEX:
-		ctx.radeon_bld.load_input = declare_input_vs;
+		ctx.load_input = declare_input_vs;
 		if (shader->key.vs.as_ls)
 			bld_base->emit_epilogue = si_llvm_emit_ls_epilogue;
 		else if (shader->key.vs.as_es)
 			bld_base->emit_epilogue = si_llvm_emit_es_epilogue;
 		else
 			bld_base->emit_epilogue = si_llvm_emit_vs_epilogue;
 		break;
 	case PIPE_SHADER_TESS_CTRL:
 		bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_tcs;
 		bld_base->emit_fetch_funcs[TGSI_FILE_OUTPUT] = fetch_output_tcs;
@@ -6661,41 +6589,41 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
 		if (shader->key.tes.as_es)
 			bld_base->emit_epilogue = si_llvm_emit_es_epilogue;
 		else
 			bld_base->emit_epilogue = si_llvm_emit_vs_epilogue;
 		break;
 	case PIPE_SHADER_GEOMETRY:
 		bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_gs;
 		bld_base->emit_epilogue = si_llvm_emit_gs_epilogue;
 		break;
 	case PIPE_SHADER_FRAGMENT:
-		ctx.radeon_bld.load_input = declare_input_fs;
+		ctx.load_input = declare_input_fs;
 		if (is_monolithic)
 			bld_base->emit_epilogue = si_llvm_emit_fs_epilogue;
 		else
 			bld_base->emit_epilogue = si_llvm_return_fs_outputs;
 		break;
 	case PIPE_SHADER_COMPUTE:
-		ctx.radeon_bld.declare_memory_region = declare_compute_memory;
+		ctx.declare_memory_region = declare_compute_memory;
 		break;
 	default:
 		assert(!"Unsupported shader type");
 		return -1;
 	}
 
 	create_meta_data(&ctx);
 	create_function(&ctx);
 	preload_ring_buffers(&ctx);
 
 	if (ctx.is_monolithic && sel->type == PIPE_SHADER_FRAGMENT &&
 	    shader->key.ps.prolog.poly_stipple) {
-		LLVMValueRef list = LLVMGetParam(ctx.radeon_bld.main_fn,
+		LLVMValueRef list = LLVMGetParam(ctx.main_fn,
 						 SI_PARAM_RW_BUFFERS);
 		si_llvm_emit_polygon_stipple(&ctx, list,
 					     SI_PARAM_POS_FIXED_PT);
 	}
 
 	if (ctx.type == PIPE_SHADER_GEOMETRY) {
 		int i;
 		for (i = 0; i < 4; i++) {
 			ctx.gs_next_vertex[i] =
 				lp_build_alloca(bld_base->base.gallivm,
@@ -6709,32 +6637,31 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
 	}
 
 	si_llvm_build_ret(&ctx, ctx.return_value);
 	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, ctx.type))
 		LLVMDumpModule(mod);
 
-	radeon_llvm_finalize_module(
-		&ctx.radeon_bld,
-		r600_extra_shader_checks(&sscreen->b, ctx.type));
+	radeon_llvm_finalize_module(&ctx,
+				    r600_extra_shader_checks(&sscreen->b, ctx.type));
 
 	r = si_compile_llvm(sscreen, &shader->binary, &shader->config, tm,
 			    mod, debug, ctx.type, "TGSI shader");
 	if (r) {
 		fprintf(stderr, "LLVM failed to compile shader\n");
 		goto out;
 	}
 
-	radeon_llvm_dispose(&ctx.radeon_bld);
+	radeon_llvm_dispose(&ctx);
 
 	/* Validate SGPR and VGPR usage for compute to detect compiler bugs.
 	 * LLVM 3.9svn has this bug.
 	 */
 	if (sel->type == PIPE_SHADER_COMPUTE) {
 		unsigned *props = sel->info.properties;
 		unsigned wave_size = 64;
 		unsigned max_vgprs = 256;
 		unsigned max_sgprs = sscreen->b.chip_class >= VI ? 800 : 512;
 		unsigned max_sgprs_per_wave = 128;
@@ -6896,21 +6823,21 @@ si_get_shader_part(struct si_screen *sscreen,
  *   (InstanceID / 2 + StartInstance)
  */
 static bool si_compile_vs_prolog(struct si_screen *sscreen,
 				 LLVMTargetMachineRef tm,
 				 struct pipe_debug_callback *debug,
 				 struct si_shader_part *out)
 {
 	union si_shader_part_key *key = &out->key;
 	struct si_shader shader = {};
 	struct si_shader_context ctx;
-	struct gallivm_state *gallivm = &ctx.radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx.gallivm;
 	LLVMTypeRef *params, *returns;
 	LLVMValueRef ret, func;
 	int last_sgpr, num_params, num_returns, i;
 	bool status = true;
 
 	si_init_shader_ctx(&ctx, sscreen, &shader, tm);
 	ctx.type = PIPE_SHADER_VERTEX;
 	ctx.param_vertex_id = key->vs_prolog.num_input_sgprs;
 	ctx.param_instance_id = key->vs_prolog.num_input_sgprs + 3;
 
@@ -6937,21 +6864,21 @@ static bool si_compile_vs_prolog(struct si_screen *sscreen,
 		returns[num_returns++] = ctx.f32;
 	}
 
 	/* Vertex load indices. */
 	for (i = 0; i <= key->vs_prolog.last_input; i++)
 		returns[num_returns++] = ctx.f32;
 
 	/* Create the function. */
 	si_create_function(&ctx, returns, num_returns, params,
 			   num_params, last_sgpr);
-	func = ctx.radeon_bld.main_fn;
+	func = ctx.main_fn;
 
 	/* Copy inputs to outputs. This should be no-op, as the registers match,
 	 * but it will prevent the compiler from overwriting them unintentionally.
 	 */
 	ret = ctx.return_value;
 	for (i = 0; i < key->vs_prolog.num_input_sgprs; i++) {
 		LLVMValueRef p = LLVMGetParam(func, i);
 		ret = LLVMBuildInsertValue(gallivm->builder, ret, p, i, "");
 	}
 	for (i = num_params - 4; i < num_params; i++) {
@@ -6960,68 +6887,67 @@ static bool si_compile_vs_prolog(struct si_screen *sscreen,
 		ret = LLVMBuildInsertValue(gallivm->builder, ret, p, i, "");
 	}
 
 	/* Compute vertex load indices from instance divisors. */
 	for (i = 0; i <= key->vs_prolog.last_input; i++) {
 		unsigned divisor = key->vs_prolog.states.instance_divisors[i];
 		LLVMValueRef index;
 
 		if (divisor) {
 			/* InstanceID / Divisor + StartInstance */
-			index = get_instance_index_for_fetch(&ctx.radeon_bld,
+			index = get_instance_index_for_fetch(&ctx,
 							     SI_SGPR_START_INSTANCE,
 							     divisor);
 		} else {
 			/* VertexID + BaseVertex */
 			index = LLVMBuildAdd(gallivm->builder,
 					     LLVMGetParam(func, ctx.param_vertex_id),
 					     LLVMGetParam(func, SI_SGPR_BASE_VERTEX), "");
 		}
 
 		index = LLVMBuildBitCast(gallivm->builder, index, ctx.f32, "");
 		ret = LLVMBuildInsertValue(gallivm->builder, ret, index,
 					   num_params++, "");
 	}
 
 	/* Compile. */
 	si_llvm_build_ret(&ctx, ret);
-	radeon_llvm_finalize_module(
-		&ctx.radeon_bld,
+	radeon_llvm_finalize_module(&ctx,
 		r600_extra_shader_checks(&sscreen->b, PIPE_SHADER_VERTEX));
 
 	if (si_compile_llvm(sscreen, &out->binary, &out->config, tm,
 			    gallivm->module, debug, ctx.type,
 			    "Vertex Shader Prolog"))
 		status = false;
 
-	radeon_llvm_dispose(&ctx.radeon_bld);
+	radeon_llvm_dispose(&ctx);
 	return status;
 }
 
 /**
  * Compile the vertex shader epilog. This is also used by the tessellation
  * evaluation shader compiled as VS.
  *
  * The input is PrimitiveID.
  *
  * If PrimitiveID is required by the pixel shader, export it.
  * Otherwise, do nothing.
  */
 static bool si_compile_vs_epilog(struct si_screen *sscreen,
 				 LLVMTargetMachineRef tm,
 				 struct pipe_debug_callback *debug,
 				 struct si_shader_part *out)
 {
 	union si_shader_part_key *key = &out->key;
 	struct si_shader_context ctx;
-	struct gallivm_state *gallivm = &ctx.radeon_bld.gallivm;
-	struct lp_build_tgsi_context *bld_base = &ctx.radeon_bld.soa.bld_base;
+	struct gallivm_state *gallivm = &ctx.gallivm;
+	struct lp_build_tgsi_context *bld_base = &ctx.soa.bld_base;
 	LLVMTypeRef params[5];
 	int num_params, i;
 	bool status = true;
 
 	si_init_shader_ctx(&ctx, sscreen, NULL, tm);
 	ctx.type = PIPE_SHADER_VERTEX;
 
 	/* Declare input VGPRs. */
 	num_params = key->vs_epilog.states.export_prim_id ?
 			   (VS_EPILOG_PRIMID_LOC + 1) : 0;
@@ -7038,43 +6964,42 @@ static bool si_compile_vs_epilog(struct si_screen *sscreen,
 		struct lp_build_context *base = &bld_base->base;
 		struct lp_build_context *uint = &bld_base->uint_bld;
 		LLVMValueRef args[9];
 
 		args[0] = lp_build_const_int32(base->gallivm, 0x0); /* enabled channels */
 		args[1] = uint->zero; /* whether the EXEC mask is valid */
 		args[2] = uint->zero; /* DONE bit */
 		args[3] = lp_build_const_int32(base->gallivm, V_008DFC_SQ_EXP_PARAM +
 					       key->vs_epilog.prim_id_param_offset);
 		args[4] = uint->zero; /* COMPR flag (0 = 32-bit export) */
-		args[5] = LLVMGetParam(ctx.radeon_bld.main_fn,
+		args[5] = LLVMGetParam(ctx.main_fn,
 				       VS_EPILOG_PRIMID_LOC); /* X */
 		args[6] = uint->undef; /* Y */
 		args[7] = uint->undef; /* Z */
 		args[8] = uint->undef; /* W */
 
 		lp_build_intrinsic(base->gallivm->builder, "llvm.SI.export",
 				   LLVMVoidTypeInContext(base->gallivm->context),
 				   args, 9, 0);
 	}
 
 	/* Compile. */
 	LLVMBuildRetVoid(gallivm->builder);
-	radeon_llvm_finalize_module(
-		&ctx.radeon_bld,
+	radeon_llvm_finalize_module(&ctx,
 		r600_extra_shader_checks(&sscreen->b, PIPE_SHADER_VERTEX));
 
 	if (si_compile_llvm(sscreen, &out->binary, &out->config, tm,
 			    gallivm->module, debug, ctx.type,
 			    "Vertex Shader Epilog"))
 		status = false;
 
-	radeon_llvm_dispose(&ctx.radeon_bld);
+	radeon_llvm_dispose(&ctx);
 	return status;
 }
 
 /**
  * Create & compile a vertex shader epilog. This a helper used by VS and TES.
  */
 static bool si_get_vs_epilog(struct si_screen *sscreen,
 			     LLVMTargetMachineRef tm,
 		             struct si_shader *shader,
 		             struct pipe_debug_callback *debug,
@@ -7164,22 +7089,22 @@ static bool si_shader_select_tes_parts(struct si_screen *sscreen,
  * the output primitive type of the tesselator (determined by TES).
  */
 static bool si_compile_tcs_epilog(struct si_screen *sscreen,
 				  LLVMTargetMachineRef tm,
 				  struct pipe_debug_callback *debug,
 				  struct si_shader_part *out)
 {
 	union si_shader_part_key *key = &out->key;
 	struct si_shader shader = {};
 	struct si_shader_context ctx;
-	struct gallivm_state *gallivm = &ctx.radeon_bld.gallivm;
-	struct lp_build_tgsi_context *bld_base = &ctx.radeon_bld.soa.bld_base;
+	struct gallivm_state *gallivm = &ctx.gallivm;
+	struct lp_build_tgsi_context *bld_base = &ctx.soa.bld_base;
 	LLVMTypeRef params[16];
 	LLVMValueRef func;
 	int last_sgpr, num_params;
 	bool status = true;
 
 	si_init_shader_ctx(&ctx, sscreen, &shader, tm);
 	ctx.type = PIPE_SHADER_TESS_CTRL;
 	shader.key.tcs.epilog = key->tcs_epilog.states;
 
 	/* Declare inputs. Only RW_BUFFERS and TESS_FACTOR_OFFSET are used. */
@@ -7197,39 +7122,38 @@ static bool si_compile_tcs_epilog(struct si_screen *sscreen,
 	last_sgpr = SI_PARAM_TESS_FACTOR_OFFSET;
 	num_params = last_sgpr + 1;
 
 	params[num_params++] = ctx.i32; /* patch index within the wave (REL_PATCH_ID) */
 	params[num_params++] = ctx.i32; /* invocation ID within the patch */
 	params[num_params++] = ctx.i32; /* LDS offset where tess factors should be loaded from */
 
 	/* Create the function. */
 	si_create_function(&ctx, NULL, 0, params, num_params, last_sgpr);
 	declare_tess_lds(&ctx);
-	func = ctx.radeon_bld.main_fn;
+	func = ctx.main_fn;
 
 	si_write_tess_factors(bld_base,
 			      LLVMGetParam(func, last_sgpr + 1),
 			      LLVMGetParam(func, last_sgpr + 2),
 			      LLVMGetParam(func, last_sgpr + 3));
 
 	/* Compile. */
 	LLVMBuildRetVoid(gallivm->builder);
-	radeon_llvm_finalize_module(
-		&ctx.radeon_bld,
+	radeon_llvm_finalize_module(&ctx,
 		r600_extra_shader_checks(&sscreen->b, PIPE_SHADER_TESS_CTRL));
 
 	if (si_compile_llvm(sscreen, &out->binary, &out->config, tm,
 			    gallivm->module, debug, ctx.type,
 			    "Tessellation Control Shader Epilog"))
 		status = false;
 
-	radeon_llvm_dispose(&ctx.radeon_bld);
+	radeon_llvm_dispose(&ctx);
 	return status;
 }
 
 /**
  * Select and compile (or reuse) TCS parts (epilog).
  */
 static bool si_shader_select_tcs_parts(struct si_screen *sscreen,
 				       LLVMTargetMachineRef tm,
 				       struct si_shader *shader,
 				       struct pipe_debug_callback *debug)
@@ -7257,21 +7181,21 @@ static bool si_shader_select_tcs_parts(struct si_screen *sscreen,
  * Interpolated colors are stored after the preloaded VGPRs.
  */
 static bool si_compile_ps_prolog(struct si_screen *sscreen,
 				 LLVMTargetMachineRef tm,
 				 struct pipe_debug_callback *debug,
 				 struct si_shader_part *out)
 {
 	union si_shader_part_key *key = &out->key;
 	struct si_shader shader = {};
 	struct si_shader_context ctx;
-	struct gallivm_state *gallivm = &ctx.radeon_bld.gallivm;
+	struct gallivm_state *gallivm = &ctx.gallivm;
 	LLVMTypeRef *params;
 	LLVMValueRef ret, func;
 	int last_sgpr, num_params, num_returns, i, num_color_channels;
 	bool status = true;
 
 	si_init_shader_ctx(&ctx, sscreen, &shader, tm);
 	ctx.type = PIPE_SHADER_FRAGMENT;
 	shader.key.ps.prolog = key->ps_prolog.states;
 
 	/* Number of inputs + 8 color elements. */
@@ -7290,21 +7214,21 @@ static bool si_compile_ps_prolog(struct si_screen *sscreen,
 
 	/* Declare outputs (same as inputs + add colors if needed) */
 	num_returns = num_params;
 	num_color_channels = util_bitcount(key->ps_prolog.colors_read);
 	for (i = 0; i < num_color_channels; i++)
 		params[num_returns++] = ctx.f32;
 
 	/* Create the function. */
 	si_create_function(&ctx, params, num_returns, params,
 			   num_params, last_sgpr);
-	func = ctx.radeon_bld.main_fn;
+	func = ctx.main_fn;
 
 	/* Copy inputs to outputs. This should be no-op, as the registers match,
 	 * but it will prevent the compiler from overwriting them unintentionally.
 	 */
 	ret = ctx.return_value;
 	for (i = 0; i < num_params; i++) {
 		LLVMValueRef p = LLVMGetParam(func, i);
 		ret = LLVMBuildInsertValue(gallivm->builder, ret, p, i, "");
 	}
 
@@ -7492,47 +7416,46 @@ static bool si_compile_ps_prolog(struct si_screen *sscreen,
 	}
 
 	/* Tell LLVM to insert WQM instruction sequence when needed. */
 	if (key->ps_prolog.wqm) {
 		LLVMAddTargetDependentFunctionAttr(func,
 						   "amdgpu-ps-wqm-outputs", "");
 	}
 
 	/* Compile. */
 	si_llvm_build_ret(&ctx, ret);
-	radeon_llvm_finalize_module(
-		&ctx.radeon_bld,
+	radeon_llvm_finalize_module(&ctx,
 		r600_extra_shader_checks(&sscreen->b, PIPE_SHADER_FRAGMENT));
 
 	if (si_compile_llvm(sscreen, &out->binary, &out->config, tm,
 			    gallivm->module, debug, ctx.type,
 			    "Fragment Shader Prolog"))
 		status = false;
 
-	radeon_llvm_dispose(&ctx.radeon_bld);
+	radeon_llvm_dispose(&ctx);
 	return status;
 }
 
 /**
  * Compile the pixel shader epilog. This handles everything that must be
  * emulated for pixel shader exports. (alpha-test, format conversions, etc)
  */
 static bool si_compile_ps_epilog(struct si_screen *sscreen,
 				 LLVMTargetMachineRef tm,
 				 struct pipe_debug_callback *debug,
 				 struct si_shader_part *out)
 {
 	union si_shader_part_key *key = &out->key;
 	struct si_shader shader = {};
 	struct si_shader_context ctx;
-	struct gallivm_state *gallivm = &ctx.radeon_bld.gallivm;
-	struct lp_build_tgsi_context *bld_base = &ctx.radeon_bld.soa.bld_base;
+	struct gallivm_state *gallivm = &ctx.gallivm;
+	struct lp_build_tgsi_context *bld_base = &ctx.soa.bld_base;
 	LLVMTypeRef params[16+8*4+3];
 	LLVMValueRef depth = NULL, stencil = NULL, samplemask = NULL;
 	int last_sgpr, num_params, i;
 	bool status = true;
 	struct si_ps_exports exp = {};
 
 	si_init_shader_ctx(&ctx, sscreen, &shader, tm);
 	ctx.type = PIPE_SHADER_FRAGMENT;
 	shader.key.ps.epilog = key->ps_epilog.states;
 
@@ -7556,21 +7479,21 @@ static bool si_compile_ps_epilog(struct si_screen *sscreen,
 			  last_sgpr + 1 + PS_EPILOG_SAMPLEMASK_MIN_LOC + 1);
 
 	assert(num_params <= ARRAY_SIZE(params));
 
 	for (i = last_sgpr + 1; i < num_params; i++)
 		params[i] = ctx.f32;
 
 	/* Create the function. */
 	si_create_function(&ctx, NULL, 0, params, num_params, last_sgpr);
 	/* Disable elimination of unused inputs. */
-	radeon_llvm_add_attribute(ctx.radeon_bld.main_fn,
+	radeon_llvm_add_attribute(ctx.main_fn,
 				  "InitialPSInputAddr", 0xffffff);
 
 	/* Process colors. */
 	unsigned vgpr = last_sgpr + 1;
 	unsigned colors_written = key->ps_epilog.colors_written;
 	int last_color_export = -1;
 
 	/* Find the last color export. */
 	if (!key->ps_epilog.writes_z &&
 	    !key->ps_epilog.writes_stencil &&
@@ -7589,55 +7512,54 @@ static bool si_compile_ps_epilog(struct si_screen *sscreen,
 				    (spi_format >> (i * 4)) & 0xf)
 					last_color_export = i;
 		}
 	}
 
 	while (colors_written) {
 		LLVMValueRef color[4];
 		int mrt = u_bit_scan(&colors_written);
 
 		for (i = 0; i < 4; i++)
-			color[i] = LLVMGetParam(ctx.radeon_bld.main_fn, vgpr++);
+			color[i] = LLVMGetParam(ctx.main_fn, vgpr++);
 
 		si_export_mrt_color(bld_base, color, mrt,
 				    num_params - 1,
 				    mrt == last_color_export, &exp);
 	}
 
 	/* Process depth, stencil, samplemask. */
 	if (key->ps_epilog.writes_z)
-		depth = LLVMGetParam(ctx.radeon_bld.main_fn, vgpr++);
+		depth = LLVMGetParam(ctx.main_fn, vgpr++);
 	if (key->ps_epilog.writes_stencil)
-		stencil = LLVMGetParam(ctx.radeon_bld.main_fn, vgpr++);
+		stencil = LLVMGetParam(ctx.main_fn, vgpr++);
 	if (key->ps_epilog.writes_samplemask)
-		samplemask = LLVMGetParam(ctx.radeon_bld.main_fn, vgpr++);
+		samplemask = LLVMGetParam(ctx.main_fn, vgpr++);
 
 	if (depth || stencil || samplemask)
 		si_export_mrt_z(bld_base, depth, stencil, samplemask, &exp);
 	else if (last_color_export == -1)
 		si_export_null(bld_base);
 
 	if (exp.num)
 		si_emit_ps_exports(&ctx, &exp);
 
 	/* Compile. */
 	LLVMBuildRetVoid(gallivm->builder);
-	radeon_llvm_finalize_module(
-		&ctx.radeon_bld,
+	radeon_llvm_finalize_module(&ctx,
 		r600_extra_shader_checks(&sscreen->b, PIPE_SHADER_FRAGMENT));
 
 	if (si_compile_llvm(sscreen, &out->binary, &out->config, tm,
 			    gallivm->module, debug, ctx.type,
 			    "Fragment Shader Epilog"))
 		status = false;
 
-	radeon_llvm_dispose(&ctx.radeon_bld);
+	radeon_llvm_dispose(&ctx);
 	return status;
 }
 
 /**
  * Select and compile (or reuse) pixel shader parts (prolog & epilog).
  */
 static bool si_shader_select_ps_parts(struct si_screen *sscreen,
 				      LLVMTargetMachineRef tm,
 				      struct si_shader *shader,
 				      struct pipe_debug_callback *debug)
diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h
index b46cc1c..37001c0 100644
--- a/src/gallium/drivers/radeonsi/si_shader_internal.h
+++ b/src/gallium/drivers/radeonsi/si_shader_internal.h
@@ -38,115 +38,166 @@ struct radeon_shader_binary;
 #define RADEON_LLVM_MAX_INPUT_SLOTS 32
 #define RADEON_LLVM_MAX_INPUTS 32 * 4
 #define RADEON_LLVM_MAX_OUTPUTS 32 * 4
 
 #define RADEON_LLVM_INITIAL_CF_DEPTH 4
 
 #define RADEON_LLVM_MAX_SYSTEM_VALUES 4
 
 struct radeon_llvm_flow;
 
-struct radeon_llvm_context {
+struct si_shader_context {
 	struct lp_build_tgsi_soa_context soa;
+	struct gallivm_state gallivm;
+	struct si_shader *shader;
+	struct si_screen *screen;
 
-	/*=== Front end configuration ===*/
-
-	/* Instructions that are not described by any of the TGSI opcodes. */
+	unsigned type; /* PIPE_SHADER_* specifies the type of shader. */
+	bool is_gs_copy_shader;
+	/* Whether to generate the optimized shader variant compiled as a whole
+	 * (without a prolog and epilog)
+	 */
+	bool is_monolithic;
 
 	/** This function is responsible for initilizing the inputs array and will be
 	  * called once for each input declared in the TGSI shader.
 	  */
-	void (*load_input)(struct radeon_llvm_context *,
+	void (*load_input)(struct si_shader_context *,
 			   unsigned input_index,
 			   const struct tgsi_full_declaration *decl,
 			   LLVMValueRef out[4]);
 
-	void (*load_system_value)(struct radeon_llvm_context *,
+	void (*load_system_value)(struct si_shader_context *,
 				  unsigned index,
 				  const struct tgsi_full_declaration *decl);
 
-	void (*declare_memory_region)(struct radeon_llvm_context *,
+	void (*declare_memory_region)(struct si_shader_context *,
 				      const struct tgsi_full_declaration *decl);
 
 	/** This array contains the input values for the shader.  Typically these
 	  * values will be in the form of a target intrinsic that will inform the
 	  * backend how to load the actual inputs to the shader.
 	  */
 	struct tgsi_full_declaration input_decls[RADEON_LLVM_MAX_INPUT_SLOTS];
 	LLVMValueRef inputs[RADEON_LLVM_MAX_INPUTS];
 	LLVMValueRef outputs[RADEON_LLVM_MAX_OUTPUTS][TGSI_NUM_CHANNELS];
 
 	/** This pointer is used to contain the temporary values.
 	  * The amount of temporary used in tgsi can't be bound to a max value and
 	  * thus we must allocate this array at runtime.
 	  */
 	LLVMValueRef *temps;
 	unsigned temps_count;
 	LLVMValueRef system_values[RADEON_LLVM_MAX_SYSTEM_VALUES];
 
-	/*=== Private Members ===*/
-
 	struct radeon_llvm_flow *flow;
 	unsigned flow_depth;
 	unsigned flow_depth_max;
 
 	struct tgsi_array_info *temp_arrays;
 	LLVMValueRef *temp_array_allocas;
 
 	LLVMValueRef undef_alloca;
 
 	LLVMValueRef main_fn;
 	LLVMTypeRef return_type;
 
+	int param_streamout_config;
+	int param_streamout_write_index;
+	int param_streamout_offset[4];
+	int param_vertex_id;
+	int param_rel_auto_id;
+	int param_vs_prim_id;
+	int param_instance_id;
+	int param_vertex_index0;
+	int param_tes_u;
+	int param_tes_v;
+	int param_tes_rel_patch_id;
+	int param_tes_patch_id;
+	int param_es2gs_offset;
+	int param_oc_lds;
+
+	/* Sets a bit if the dynamic HS control word was 0x80000000. The bit is
+	 * 0x800000 for VS, 0x1 for ES.
+	 */
+	int param_tess_offchip;
+
+	LLVMTargetMachineRef tm;
+
+	unsigned invariant_load_md_kind;
+	unsigned range_md_kind;
+	unsigned uniform_md_kind;
 	unsigned fpmath_md_kind;
 	LLVMValueRef fpmath_md_2p5_ulp;
-
-	struct gallivm_state gallivm;
+	LLVMValueRef empty_md;
+
+	/* Preloaded descriptors. */
+	LLVMValueRef esgs_ring;
+	LLVMValueRef gsvs_ring[4];
+
+	LLVMValueRef lds;
+	LLVMValueRef gs_next_vertex[4];
+	LLVMValueRef return_value;
+
+	LLVMTypeRef voidt;
+	LLVMTypeRef i1;
+	LLVMTypeRef i8;
+	LLVMTypeRef i32;
+	LLVMTypeRef i64;
+	LLVMTypeRef i128;
+	LLVMTypeRef f32;
+	LLVMTypeRef v16i8;
+	LLVMTypeRef v2i32;
+	LLVMTypeRef v4i32;
+	LLVMTypeRef v4f32;
+	LLVMTypeRef v8i32;
+
+	LLVMValueRef shared_memory;
 };
 
-static inline struct radeon_llvm_context *
-radeon_llvm_context(struct lp_build_tgsi_context *bld_base)
+static inline struct si_shader_context *
+si_shader_context(struct lp_build_tgsi_context *bld_base)
 {
-	return (struct radeon_llvm_context*)bld_base;
+	return (struct si_shader_context*)bld_base;
 }
 
 void radeon_llvm_add_attribute(LLVMValueRef F, const char *name, int value);
 void radeon_llvm_shader_type(LLVMValueRef F, unsigned type);
 
 LLVMTargetRef radeon_llvm_get_r600_target(const char *triple);
 
 unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binary,
 			     LLVMTargetMachineRef tm,
 			     struct pipe_debug_callback *debug);
 
 LLVMTypeRef tgsi2llvmtype(struct lp_build_tgsi_context *bld_base,
 			  enum tgsi_opcode_type type);
 
 LLVMValueRef bitcast(struct lp_build_tgsi_context *bld_base,
 		     enum tgsi_opcode_type type, LLVMValueRef value);
 
-LLVMValueRef radeon_llvm_bound_index(struct radeon_llvm_context *ctx,
+LLVMValueRef radeon_llvm_bound_index(struct si_shader_context *ctx,
 				     LLVMValueRef index,
 				     unsigned num);
 
-void radeon_llvm_context_init(struct radeon_llvm_context *ctx,
+void radeon_llvm_context_init(struct si_shader_context *ctx,
                               const char *triple,
 			      const struct tgsi_shader_info *info,
 			      const struct tgsi_token *tokens);
 
-void radeon_llvm_create_func(struct radeon_llvm_context *ctx,
+void radeon_llvm_create_func(struct si_shader_context *ctx,
 			     LLVMTypeRef *return_types, unsigned num_return_elems,
 			     LLVMTypeRef *ParamTypes, unsigned ParamCount);
 
-void radeon_llvm_dispose(struct radeon_llvm_context *ctx);
+void radeon_llvm_dispose(struct si_shader_context *ctx);
 
-void radeon_llvm_finalize_module(struct radeon_llvm_context *ctx,
+void radeon_llvm_finalize_module(struct si_shader_context *ctx,
 				 bool run_verifier);
 
 LLVMValueRef radeon_llvm_emit_fetch_64bit(struct lp_build_tgsi_context *bld_base,
 					  enum tgsi_opcode_type type,
 					  LLVMValueRef ptr,
 					  LLVMValueRef ptr2);
 
 LLVMValueRef radeon_llvm_saturate(struct lp_build_tgsi_context *bld_base,
                                   LLVMValueRef value);
 
diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
index 75ceb57..1ee9afb 100644
--- a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
+++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
@@ -688,21 +688,21 @@ static void emit_up2h(const struct lp_build_tgsi_action *action,
 		val = LLVMBuildBitCast(builder, val, fp16, "");
 		emit_data->output[i] =
 			LLVMBuildFPExt(builder, val, bld_base->base.elem_type, "");
 	}
 }
 
 static void emit_fdiv(const struct lp_build_tgsi_action *action,
 		      struct lp_build_tgsi_context *bld_base,
 		      struct lp_build_emit_data *emit_data)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 
 	emit_data->output[emit_data->chan] =
 		LLVMBuildFDiv(bld_base->base.gallivm->builder,
 			      emit_data->args[0], emit_data->args[1], "");
 
 	/* Use v_rcp_f32 instead of precise division. */
 	if (HAVE_LLVM >= 0x0309 &&
 	    !LLVMIsConstant(emit_data->output[emit_data->chan]))
 		LLVMSetMetadata(emit_data->output[emit_data->chan],
 				ctx->fpmath_md_kind, ctx->fpmath_md_2p5_ulp);
diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
index e1534c7..b0174b1 100644
--- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
+++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
@@ -278,21 +278,21 @@ LLVMValueRef bitcast(struct lp_build_tgsi_context *bld_base,
 	if (dst_type)
 		return LLVMBuildBitCast(builder, value, dst_type, "");
 	else
 		return value;
 }
 
 /**
  * Return a value that is equal to the given i32 \p index if it lies in [0,num)
  * or an undefined value in the same interval otherwise.
  */
-LLVMValueRef radeon_llvm_bound_index(struct radeon_llvm_context *ctx,
+LLVMValueRef radeon_llvm_bound_index(struct si_shader_context *ctx,
 				     LLVMValueRef index,
 				     unsigned num)
 {
 	struct gallivm_state *gallivm = &ctx->gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
 	LLVMValueRef c_max = lp_build_const_int32(gallivm, num - 1);
 	LLVMValueRef cc;
 
 	if (util_is_power_of_two(num)) {
 		index = LLVMBuildAnd(builder, index, c_max, "");
@@ -304,39 +304,39 @@ LLVMValueRef radeon_llvm_bound_index(struct radeon_llvm_context *ctx,
 		 * writing), because its value tracking is not strong enough.
 		 */
 		cc = LLVMBuildICmp(builder, LLVMIntULE, index, c_max, "");
 		index = LLVMBuildSelect(builder, cc, index, c_max, "");
 	}
 
 	return index;
 }
 
 static struct radeon_llvm_flow *
-get_current_flow(struct radeon_llvm_context *ctx)
+get_current_flow(struct si_shader_context *ctx)
 {
 	if (ctx->flow_depth > 0)
 		return &ctx->flow[ctx->flow_depth - 1];
 	return NULL;
 }
 
 static struct radeon_llvm_flow *
-get_innermost_loop(struct radeon_llvm_context *ctx)
+get_innermost_loop(struct si_shader_context *ctx)
 {
 	for (unsigned i = ctx->flow_depth; i > 0; --i) {
 		if (ctx->flow[i - 1].loop_entry_block)
 			return &ctx->flow[i - 1];
 	}
 	return NULL;
 }
 
 static struct radeon_llvm_flow *
-push_flow(struct radeon_llvm_context *ctx)
+push_flow(struct si_shader_context *ctx)
 {
 	struct radeon_llvm_flow *flow;
 
 	if (ctx->flow_depth >= ctx->flow_depth_max) {
 		unsigned new_max = MAX2(ctx->flow_depth << 1, RADEON_LLVM_INITIAL_CF_DEPTH);
 		ctx->flow = REALLOC(ctx->flow,
 				    ctx->flow_depth_max * sizeof(*ctx->flow),
 				    new_max * sizeof(*ctx->flow));
 		ctx->flow_depth_max = new_max;
 	}
@@ -373,21 +373,21 @@ static LLVMValueRef emit_swizzle(struct lp_build_tgsi_context *bld_base,
 
 /**
  * Return the description of the array covering the given temporary register
  * index.
  */
 static unsigned
 get_temp_array_id(struct lp_build_tgsi_context *bld_base,
 		  unsigned reg_index,
 		  const struct tgsi_ind_register *reg)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	unsigned num_arrays = ctx->soa.bld_base.info->array_max[TGSI_FILE_TEMPORARY];
 	unsigned i;
 
 	if (reg && reg->ArrayID > 0 && reg->ArrayID <= num_arrays)
 		return reg->ArrayID;
 
 	for (i = 0; i < num_arrays; i++) {
 		const struct tgsi_array_info *array = &ctx->temp_arrays[i];
 
 		if (reg_index >= array->range.First && reg_index <= array->range.Last)
@@ -395,21 +395,21 @@ get_temp_array_id(struct lp_build_tgsi_context *bld_base,
 	}
 
 	return 0;
 }
 
 static struct tgsi_declaration_range
 get_array_range(struct lp_build_tgsi_context *bld_base,
 		unsigned File, unsigned reg_index,
 		const struct tgsi_ind_register *reg)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct tgsi_declaration_range range;
 
 	if (File == TGSI_FILE_TEMPORARY) {
 		unsigned array_id = get_temp_array_id(bld_base, reg_index, reg);
 		if (array_id)
 			return ctx->temp_arrays[array_id - 1].range;
 	}
 
 	range.First = 0;
 	range.Last = bld_base->info->file_max[File];
@@ -431,21 +431,21 @@ emit_array_index(struct lp_build_tgsi_soa_context *bld,
 }
 
 /**
  * For indirect registers, construct a pointer directly to the requested
  * element using getelementptr if possible.
  *
  * Returns NULL if the insertelement/extractelement fallback for array access
  * must be used.
  */
 static LLVMValueRef
-get_pointer_into_array(struct radeon_llvm_context *ctx,
+get_pointer_into_array(struct si_shader_context *ctx,
 		       unsigned file,
 		       unsigned swizzle,
 		       unsigned reg_index,
 		       const struct tgsi_ind_register *reg_indirect)
 {
 	unsigned array_id;
 	struct tgsi_array_info *array;
 	struct gallivm_state *gallivm = ctx->soa.bld_base.base.gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
 	LLVMValueRef idxs[2];
@@ -549,21 +549,21 @@ emit_array_fetch(struct lp_build_tgsi_context *bld_base,
 }
 
 static LLVMValueRef
 load_value_from_array(struct lp_build_tgsi_context *bld_base,
 		      unsigned file,
 		      enum tgsi_opcode_type type,
 		      unsigned swizzle,
 		      unsigned reg_index,
 		      const struct tgsi_ind_register *reg_indirect)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
 	LLVMValueRef ptr;
 
 	ptr = get_pointer_into_array(ctx, file, swizzle, reg_index, reg_indirect);
 	if (ptr) {
 		LLVMValueRef val = LLVMBuildLoad(builder, ptr, "");
 		if (tgsi_type_is_64bit(type)) {
 			LLVMValueRef ptr_hi, val_hi;
@@ -585,21 +585,21 @@ load_value_from_array(struct lp_build_tgsi_context *bld_base,
 }
 
 static void
 store_value_to_array(struct lp_build_tgsi_context *bld_base,
 		     LLVMValueRef value,
 		     unsigned file,
 		     unsigned chan_index,
 		     unsigned reg_index,
 		     const struct tgsi_ind_register *reg_indirect)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	LLVMBuilderRef builder = gallivm->builder;
 	LLVMValueRef ptr;
 
 	ptr = get_pointer_into_array(ctx, file, chan_index, reg_index, reg_indirect);
 	if (ptr) {
 		LLVMBuildStore(builder, value, ptr);
 	} else {
 		unsigned i, size;
@@ -632,21 +632,21 @@ store_value_to_array(struct lp_build_tgsi_context *bld_base,
 			LLVMBuildStore(builder, value, temp_ptr);
 		}
 	}
 }
 
 LLVMValueRef radeon_llvm_emit_fetch(struct lp_build_tgsi_context *bld_base,
 				    const struct tgsi_full_src_register *reg,
 				    enum tgsi_opcode_type type,
 				    unsigned swizzle)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base);
 	LLVMBuilderRef builder = bld_base->base.gallivm->builder;
 	LLVMValueRef result = NULL, ptr, ptr2;
 
 	if (swizzle == ~0) {
 		LLVMValueRef values[TGSI_NUM_CHANNELS];
 		unsigned chan;
 		for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) {
 			values[chan] = radeon_llvm_emit_fetch(bld_base, reg, type, chan);
 		}
@@ -730,35 +730,35 @@ LLVMValueRef radeon_llvm_emit_fetch(struct lp_build_tgsi_context *bld_base,
 	}
 
 	return bitcast(bld_base, type, result);
 }
 
 static LLVMValueRef fetch_system_value(struct lp_build_tgsi_context *bld_base,
 				       const struct tgsi_full_src_register *reg,
 				       enum tgsi_opcode_type type,
 				       unsigned swizzle)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 
 	LLVMValueRef cval = ctx->system_values[reg->Register.Index];
 	if (LLVMGetTypeKind(LLVMTypeOf(cval)) == LLVMVectorTypeKind) {
 		cval = LLVMBuildExtractElement(gallivm->builder, cval,
 					       lp_build_const_int32(gallivm, swizzle), "");
 	}
 	return bitcast(bld_base, type, cval);
 }
 
 static void emit_declaration(struct lp_build_tgsi_context *bld_base,
 			     const struct tgsi_full_declaration *decl)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	LLVMBuilderRef builder = bld_base->base.gallivm->builder;
 	unsigned first, last, i;
 	switch(decl->Declaration.File) {
 	case TGSI_FILE_ADDRESS:
 	{
 		 unsigned idx;
 		for (idx = decl->Range.First; idx <= decl->Range.Last; idx++) {
 			unsigned chan;
 			for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) {
 				 ctx->soa.addr[idx][chan] = lp_build_alloca_undef(
@@ -937,21 +937,21 @@ LLVMValueRef radeon_llvm_saturate(struct lp_build_tgsi_context *bld_base,
 
 	return lp_build_emit_llvm(bld_base, TGSI_OPCODE_CLAMP,
 				  &clamp_emit_data);
 }
 
 void radeon_llvm_emit_store(struct lp_build_tgsi_context *bld_base,
 			    const struct tgsi_full_instruction *inst,
 			    const struct tgsi_opcode_info *info,
 			    LLVMValueRef dst[4])
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base);
 	struct gallivm_state *gallivm = bld->bld_base.base.gallivm;
 	const struct tgsi_full_dst_register *reg = &inst->Dst[0];
 	LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder;
 	LLVMValueRef temp_ptr, temp_ptr2 = NULL;
 	unsigned chan, chan_index;
 	bool is_vec_store = false;
 	enum tgsi_opcode_type dtype = tgsi_opcode_infer_dst_type(inst->Instruction.Opcode);
 
 	if (dst[0]) {
@@ -1038,21 +1038,21 @@ static void set_basicblock_name(LLVMBasicBlockRef bb, const char *base, int pc)
 	/* Subtract 1 so that the number shown is that of the corresponding
 	 * opcode in the TGSI dump, e.g. an if block has the same suffix as
 	 * the instruction number of the corresponding TGSI IF.
 	 */
 	snprintf(buf, sizeof(buf), "%s%d", base, pc - 1);
 	LLVMSetValueName(LLVMBasicBlockAsValue(bb), buf);
 }
 
 /* Append a basic block at the level of the parent flow.
  */
-static LLVMBasicBlockRef append_basic_block(struct radeon_llvm_context *ctx,
+static LLVMBasicBlockRef append_basic_block(struct si_shader_context *ctx,
 					    const char *name)
 {
 	struct gallivm_state *gallivm = &ctx->gallivm;
 
 	assert(ctx->flow_depth >= 1);
 
 	if (ctx->flow_depth >= 2) {
 		struct radeon_llvm_flow *flow = &ctx->flow[ctx->flow_depth - 2];
 
 		return LLVMInsertBasicBlockInContext(gallivm->context,
@@ -1069,112 +1069,112 @@ static LLVMBasicBlockRef append_basic_block(struct radeon_llvm_context *ctx,
 static void emit_default_branch(LLVMBuilderRef builder, LLVMBasicBlockRef target)
 {
 	if (!LLVMGetBasicBlockTerminator(LLVMGetInsertBlock(builder)))
 		 LLVMBuildBr(builder, target);
 }
 
 static void bgnloop_emit(const struct lp_build_tgsi_action *action,
 			 struct lp_build_tgsi_context *bld_base,
 			 struct lp_build_emit_data *emit_data)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	struct radeon_llvm_flow *flow = push_flow(ctx);
 	flow->loop_entry_block = append_basic_block(ctx, "LOOP");
 	flow->next_block = append_basic_block(ctx, "ENDLOOP");
 	set_basicblock_name(flow->loop_entry_block, "loop", bld_base->pc);
 	LLVMBuildBr(gallivm->builder, flow->loop_entry_block);
 	LLVMPositionBuilderAtEnd(gallivm->builder, flow->loop_entry_block);
 }
 
 static void brk_emit(const struct lp_build_tgsi_action *action,
 		     struct lp_build_tgsi_context *bld_base,
 		     struct lp_build_emit_data *emit_data)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	struct radeon_llvm_flow *flow = get_innermost_loop(ctx);
 
 	LLVMBuildBr(gallivm->builder, flow->next_block);
 }
 
 static void cont_emit(const struct lp_build_tgsi_action *action,
 		      struct lp_build_tgsi_context *bld_base,
 		      struct lp_build_emit_data *emit_data)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	struct radeon_llvm_flow *flow = get_innermost_loop(ctx);
 
 	LLVMBuildBr(gallivm->builder, flow->loop_entry_block);
 }
 
 static void else_emit(const struct lp_build_tgsi_action *action,
 		      struct lp_build_tgsi_context *bld_base,
 		      struct lp_build_emit_data *emit_data)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	struct radeon_llvm_flow *current_branch = get_current_flow(ctx);
 	LLVMBasicBlockRef endif_block;
 
 	assert(!current_branch->loop_entry_block);
 
 	endif_block = append_basic_block(ctx, "ENDIF");
 	emit_default_branch(gallivm->builder, endif_block);
 
 	LLVMPositionBuilderAtEnd(gallivm->builder, current_branch->next_block);
 	set_basicblock_name(current_branch->next_block, "else", bld_base->pc);
 
 	current_branch->next_block = endif_block;
 }
 
 static void endif_emit(const struct lp_build_tgsi_action *action,
 		       struct lp_build_tgsi_context *bld_base,
 		       struct lp_build_emit_data *emit_data)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	struct radeon_llvm_flow *current_branch = get_current_flow(ctx);
 
 	assert(!current_branch->loop_entry_block);
 
 	emit_default_branch(gallivm->builder, current_branch->next_block);
 	LLVMPositionBuilderAtEnd(gallivm->builder, current_branch->next_block);
 	set_basicblock_name(current_branch->next_block, "endif", bld_base->pc);
 
 	ctx->flow_depth--;
 }
 
 static void endloop_emit(const struct lp_build_tgsi_action *action,
 			 struct lp_build_tgsi_context *bld_base,
 			 struct lp_build_emit_data *emit_data)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	struct radeon_llvm_flow *current_loop = get_current_flow(ctx);
 
 	assert(current_loop->loop_entry_block);
 
 	emit_default_branch(gallivm->builder, current_loop->loop_entry_block);
 
 	LLVMPositionBuilderAtEnd(gallivm->builder, current_loop->next_block);
 	set_basicblock_name(current_loop->next_block, "endloop", bld_base->pc);
 	ctx->flow_depth--;
 }
 
 static void if_cond_emit(const struct lp_build_tgsi_action *action,
 			 struct lp_build_tgsi_context *bld_base,
 			 struct lp_build_emit_data *emit_data,
 			 LLVMValueRef cond)
 {
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 	struct gallivm_state *gallivm = bld_base->base.gallivm;
 	struct radeon_llvm_flow *flow = push_flow(ctx);
 	LLVMBasicBlockRef if_block;
 
 	if_block = append_basic_block(ctx, "IF");
 	flow->next_block = append_basic_block(ctx, "ELSE");
 	set_basicblock_name(if_block, "if", bld_base->pc);
 	LLVMBuildCondBr(gallivm->builder, cond, if_block, flow->next_block);
 	LLVMPositionBuilderAtEnd(gallivm->builder, if_block);
 }
@@ -1204,31 +1204,31 @@ static void uif_emit(const struct lp_build_tgsi_action *action,
 	        bitcast(bld_base, TGSI_TYPE_UNSIGNED, emit_data->args[0]),
 			bld_base->int_bld.zero, "");
 
 	if_cond_emit(action, bld_base, emit_data, cond);
 }
 
 static void emit_immediate(struct lp_build_tgsi_context *bld_base,
 			   const struct tgsi_full_immediate *imm)
 {
 	unsigned i;
-	struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
+	struct si_shader_context *ctx = si_shader_context(bld_base);
 
 	for (i = 0; i < 4; ++i) {
 		ctx->soa.immediates[ctx->soa.num_immediates][i] =
 				LLVMConstInt(bld_base->uint_bld.elem_type, imm->u[i].Uint, false   );
 	}
 
 	ctx->soa.num_immediates++;
 }
 
-void radeon_llvm_context_init(struct radeon_llvm_context *ctx, const char *triple,
+void radeon_llvm_context_init(struct si_shader_context *ctx, const char *triple,
 			      const struct tgsi_shader_info *info,
 			      const struct tgsi_token *tokens)
 {
 	struct lp_type type;
 
 	/* Initialize the gallivm object:
 	 * We are only using the module, context, and builder fields of this struct.
 	 * This should be enough for us to be able to pass our gallivm struct to the
 	 * helper functions in the gallivm module.
 	 */
@@ -1295,21 +1295,21 @@ void radeon_llvm_context_init(struct radeon_llvm_context *ctx, const char *tripl
 	bld_base->op_actions[TGSI_OPCODE_BGNLOOP].emit = bgnloop_emit;
 	bld_base->op_actions[TGSI_OPCODE_BRK].emit = brk_emit;
 	bld_base->op_actions[TGSI_OPCODE_CONT].emit = cont_emit;
 	bld_base->op_actions[TGSI_OPCODE_IF].emit = if_emit;
 	bld_base->op_actions[TGSI_OPCODE_UIF].emit = uif_emit;
 	bld_base->op_actions[TGSI_OPCODE_ELSE].emit = else_emit;
 	bld_base->op_actions[TGSI_OPCODE_ENDIF].emit = endif_emit;
 	bld_base->op_actions[TGSI_OPCODE_ENDLOOP].emit = endloop_emit;
 }
 
-void radeon_llvm_create_func(struct radeon_llvm_context *ctx,
+void radeon_llvm_create_func(struct si_shader_context *ctx,
 			     LLVMTypeRef *return_types, unsigned num_return_elems,
 			     LLVMTypeRef *ParamTypes, unsigned ParamCount)
 {
 	LLVMTypeRef main_fn_type, ret_type;
 	LLVMBasicBlockRef main_fn_body;
 
 	if (num_return_elems)
 		ret_type = LLVMStructTypeInContext(ctx->gallivm.context,
 						   return_types,
 						   num_return_elems, true);
@@ -1318,21 +1318,21 @@ void radeon_llvm_create_func(struct radeon_llvm_context *ctx,
 
 	/* Setup the function */
 	ctx->return_type = ret_type;
 	main_fn_type = LLVMFunctionType(ret_type, ParamTypes, ParamCount, 0);
 	ctx->main_fn = LLVMAddFunction(ctx->gallivm.module, "main", main_fn_type);
 	main_fn_body = LLVMAppendBasicBlockInContext(ctx->gallivm.context,
 			ctx->main_fn, "main_body");
 	LLVMPositionBuilderAtEnd(ctx->gallivm.builder, main_fn_body);
 }
 
-void radeon_llvm_finalize_module(struct radeon_llvm_context *ctx,
+void radeon_llvm_finalize_module(struct si_shader_context *ctx,
 				 bool run_verifier)
 {
 	struct gallivm_state *gallivm = ctx->soa.bld_base.base.gallivm;
 	const char *triple = LLVMGetTarget(gallivm->module);
 	LLVMTargetLibraryInfoRef target_library_info;
 
 	/* Create the pass manager */
 	gallivm->passmgr = LLVMCreateFunctionPassManagerForModule(
 							gallivm->module);
 
@@ -1355,21 +1355,21 @@ void radeon_llvm_finalize_module(struct radeon_llvm_context *ctx,
 	/* Run the pass */
 	LLVMInitializeFunctionPassManager(gallivm->passmgr);
 	LLVMRunFunctionPassManager(gallivm->passmgr, ctx->main_fn);
 	LLVMFinalizeFunctionPassManager(gallivm->passmgr);
 
 	LLVMDisposeBuilder(gallivm->builder);
 	LLVMDisposePassManager(gallivm->passmgr);
 	gallivm_dispose_target_library_info(target_library_info);
 }
 
-void radeon_llvm_dispose(struct radeon_llvm_context *ctx)
+void radeon_llvm_dispose(struct si_shader_context *ctx)
 {
 	LLVMDisposeModule(ctx->soa.bld_base.base.gallivm->module);
 	LLVMContextDispose(ctx->soa.bld_base.base.gallivm->context);
 	FREE(ctx->temp_arrays);
 	ctx->temp_arrays = NULL;
 	FREE(ctx->temp_array_allocas);
 	ctx->temp_array_allocas = NULL;
 	FREE(ctx->temps);
 	ctx->temps = NULL;
 	ctx->temps_count = 0;
-- 
2.7.4



More information about the mesa-dev mailing list