radeonsi: move shader debug helpers out of r600_pipe_common.c
[mesa.git] / src / gallium / drivers / radeonsi / si_shader.c
index b07c35cf2733b415bad40427ed93577d3f1877bc..e942d345dbcce20e8fce75871ccc16cc648c5bcd 100644 (file)
  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  * USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *     Tom Stellard <thomas.stellard@amd.com>
- *     Michel Dänzer <michel.daenzer@amd.com>
- *      Christian König <christian.koenig@amd.com>
  */
 
 #include "gallivm/lp_bld_const.h"
@@ -240,7 +235,6 @@ static LLVMValueRef unpack_param(struct si_shader_context *ctx,
                                 unsigned param, unsigned rshift,
                                 unsigned bitwidth)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
        LLVMValueRef value = LLVMGetParam(ctx->main_fn,
                                          param);
 
@@ -248,12 +242,12 @@ static LLVMValueRef unpack_param(struct si_shader_context *ctx,
                value = ac_to_integer(&ctx->ac, value);
 
        if (rshift)
-               value = LLVMBuildLShr(gallivm->builder, value,
+               value = LLVMBuildLShr(ctx->ac.builder, value,
                                      LLVMConstInt(ctx->i32, rshift, 0), "");
 
        if (rshift + bitwidth < 32) {
                unsigned mask = (1 << bitwidth) - 1;
-               value = LLVMBuildAnd(gallivm->builder, value,
+               value = LLVMBuildAnd(ctx->ac.builder, value,
                                     LLVMConstInt(ctx->i32, mask, 0), "");
        }
 
@@ -357,23 +351,21 @@ get_tcs_out_patch0_patch_data_offset(struct si_shader_context *ctx)
 static LLVMValueRef
 get_tcs_in_current_patch_offset(struct si_shader_context *ctx)
 {
-       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, "");
+       return LLVMBuildMul(ctx->ac.builder, patch_stride, rel_patch_id, "");
 }
 
 static LLVMValueRef
 get_tcs_out_current_patch_offset(struct si_shader_context *ctx)
 {
-       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,
+       return LLVMBuildAdd(ctx->ac.builder, patch0_offset,
+                           LLVMBuildMul(ctx->ac.builder, patch_stride,
                                         rel_patch_id, ""),
                            "");
 }
@@ -381,14 +373,13 @@ get_tcs_out_current_patch_offset(struct si_shader_context *ctx)
 static LLVMValueRef
 get_tcs_out_current_patch_data_offset(struct si_shader_context *ctx)
 {
-       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,
+       return LLVMBuildAdd(ctx->ac.builder, patch0_patch_data_offset,
+                           LLVMBuildMul(ctx->ac.builder, patch_stride,
                                         rel_patch_id, ""),
                            "");
 }
@@ -433,15 +424,13 @@ static LLVMValueRef get_instance_index_for_fetch(
        struct si_shader_context *ctx,
        unsigned param_start_instance, LLVMValueRef divisor)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
-
        LLVMValueRef result = ctx->abi.instance_id;
 
        /* The division must be done before START_INSTANCE is added. */
        if (divisor != ctx->i32_1)
-               result = LLVMBuildUDiv(gallivm->builder, result, divisor, "");
+               result = LLVMBuildUDiv(ctx->ac.builder, result, divisor, "");
 
-       return LLVMBuildAdd(gallivm->builder, result,
+       return LLVMBuildAdd(ctx->ac.builder, result,
                            LLVMGetParam(ctx->main_fn, param_start_instance), "");
 }
 
@@ -451,8 +440,8 @@ static LLVMValueRef extract_double_to_float(struct si_shader_context *ctx,
                                            LLVMValueRef vec4,
                                            unsigned double_index)
 {
-       LLVMBuilderRef builder = ctx->gallivm.builder;
-       LLVMTypeRef f64 = LLVMDoubleTypeInContext(ctx->gallivm.context);
+       LLVMBuilderRef builder = ctx->ac.builder;
+       LLVMTypeRef f64 = LLVMDoubleTypeInContext(ctx->ac.context);
        LLVMValueRef dvec2 = LLVMBuildBitCast(builder, vec4,
                                              LLVMVectorType(f64, 2), "");
        LLVMValueRef index = LLVMConstInt(ctx->i32, double_index, 0);
@@ -460,12 +449,96 @@ static LLVMValueRef extract_double_to_float(struct si_shader_context *ctx,
        return LLVMBuildFPTrunc(builder, value, ctx->f32, "");
 }
 
+static LLVMValueRef unpack_sint16(struct si_shader_context *ctx,
+                                LLVMValueRef i32, unsigned index)
+{
+       assert(index <= 1);
+
+       if (index == 1)
+               return LLVMBuildAShr(ctx->ac.builder, i32,
+                                    LLVMConstInt(ctx->i32, 16, 0), "");
+
+       return LLVMBuildSExt(ctx->ac.builder,
+                            LLVMBuildTrunc(ctx->ac.builder, i32,
+                                           ctx->ac.i16, ""),
+                            ctx->i32, "");
+}
+
 void si_llvm_load_input_vs(
        struct si_shader_context *ctx,
        unsigned input_index,
        LLVMValueRef out[4])
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
+       unsigned vs_blit_property =
+               ctx->shader->selector->info.properties[TGSI_PROPERTY_VS_BLIT_SGPRS];
+
+       if (vs_blit_property) {
+               LLVMValueRef vertex_id = ctx->abi.vertex_id;
+               LLVMValueRef sel_x1 = LLVMBuildICmp(ctx->ac.builder,
+                                                   LLVMIntULE, vertex_id,
+                                                   ctx->i32_1, "");
+               /* Use LLVMIntNE, because we have 3 vertices and only
+                * the middle one should use y2.
+                */
+               LLVMValueRef sel_y1 = LLVMBuildICmp(ctx->ac.builder,
+                                                   LLVMIntNE, vertex_id,
+                                                   ctx->i32_1, "");
+
+               if (input_index == 0) {
+                       /* Position: */
+                       LLVMValueRef x1y1 = LLVMGetParam(ctx->main_fn,
+                                                        ctx->param_vs_blit_inputs);
+                       LLVMValueRef x2y2 = LLVMGetParam(ctx->main_fn,
+                                                        ctx->param_vs_blit_inputs + 1);
+
+                       LLVMValueRef x1 = unpack_sint16(ctx, x1y1, 0);
+                       LLVMValueRef y1 = unpack_sint16(ctx, x1y1, 1);
+                       LLVMValueRef x2 = unpack_sint16(ctx, x2y2, 0);
+                       LLVMValueRef y2 = unpack_sint16(ctx, x2y2, 1);
+
+                       LLVMValueRef x = LLVMBuildSelect(ctx->ac.builder, sel_x1,
+                                                        x1, x2, "");
+                       LLVMValueRef y = LLVMBuildSelect(ctx->ac.builder, sel_y1,
+                                                        y1, y2, "");
+
+                       out[0] = LLVMBuildSIToFP(ctx->ac.builder, x, ctx->f32, "");
+                       out[1] = LLVMBuildSIToFP(ctx->ac.builder, y, ctx->f32, "");
+                       out[2] = LLVMGetParam(ctx->main_fn,
+                                             ctx->param_vs_blit_inputs + 2);
+                       out[3] = ctx->ac.f32_1;
+                       return;
+               }
+
+               /* Color or texture coordinates: */
+               assert(input_index == 1);
+
+               if (vs_blit_property == SI_VS_BLIT_SGPRS_POS_COLOR) {
+                       for (int i = 0; i < 4; i++) {
+                               out[i] = LLVMGetParam(ctx->main_fn,
+                                                     ctx->param_vs_blit_inputs + 3 + i);
+                       }
+               } else {
+                       assert(vs_blit_property == SI_VS_BLIT_SGPRS_POS_TEXCOORD);
+                       LLVMValueRef x1 = LLVMGetParam(ctx->main_fn,
+                                                      ctx->param_vs_blit_inputs + 3);
+                       LLVMValueRef y1 = LLVMGetParam(ctx->main_fn,
+                                                      ctx->param_vs_blit_inputs + 4);
+                       LLVMValueRef x2 = LLVMGetParam(ctx->main_fn,
+                                                      ctx->param_vs_blit_inputs + 5);
+                       LLVMValueRef y2 = LLVMGetParam(ctx->main_fn,
+                                                      ctx->param_vs_blit_inputs + 6);
+
+                       out[0] = LLVMBuildSelect(ctx->ac.builder, sel_x1,
+                                                x1, x2, "");
+                       out[1] = LLVMBuildSelect(ctx->ac.builder, sel_y1,
+                                                y1, y2, "");
+                       out[2] = LLVMGetParam(ctx->main_fn,
+                                             ctx->param_vs_blit_inputs + 7);
+                       out[3] = LLVMGetParam(ctx->main_fn,
+                                             ctx->param_vs_blit_inputs + 8);
+               }
+               return;
+       }
 
        unsigned chan;
        unsigned fix_fetch;
@@ -483,7 +556,7 @@ void si_llvm_load_input_vs(
 
        t_offset = LLVMConstInt(ctx->i32, input_index, 0);
 
-       t_list = ac_build_indexed_load_const(&ctx->ac, t_list_ptr, t_offset);
+       t_list = ac_build_load_to_sgpr(&ctx->ac, t_list_ptr, t_offset);
 
        vertex_index = LLVMGetParam(ctx->main_fn,
                                    ctx->param_vertex_index0 +
@@ -527,7 +600,7 @@ void si_llvm_load_input_vs(
        /* Break up the vec4 into individual components */
        for (chan = 0; chan < 4; chan++) {
                LLVMValueRef llvm_chan = LLVMConstInt(ctx->i32, chan, 0);
-               out[chan] = LLVMBuildExtractElement(gallivm->builder,
+               out[chan] = LLVMBuildExtractElement(ctx->ac.builder,
                                                    input[0], llvm_chan, "");
        }
 
@@ -543,7 +616,7 @@ void si_llvm_load_input_vs(
 
                /* First, recover the sign-extended signed integer value. */
                if (fix_fetch == SI_FIX_FETCH_A2_SSCALED)
-                       tmp = LLVMBuildFPToUI(gallivm->builder, tmp, ctx->i32, "");
+                       tmp = LLVMBuildFPToUI(ctx->ac.builder, tmp, ctx->i32, "");
                else
                        tmp = ac_to_integer(&ctx->ac, tmp);
 
@@ -553,20 +626,20 @@ void si_llvm_load_input_vs(
                 * and happen to contain 0, 1, 2, 3 as the two LSBs of the
                 * exponent.
                 */
-               tmp = LLVMBuildShl(gallivm->builder, tmp,
+               tmp = LLVMBuildShl(ctx->ac.builder, tmp,
                                   fix_fetch == SI_FIX_FETCH_A2_SNORM ?
                                   LLVMConstInt(ctx->i32, 7, 0) : c30, "");
-               tmp = LLVMBuildAShr(gallivm->builder, tmp, c30, "");
+               tmp = LLVMBuildAShr(ctx->ac.builder, tmp, c30, "");
 
                /* Convert back to the right type. */
                if (fix_fetch == SI_FIX_FETCH_A2_SNORM) {
                        LLVMValueRef clamp;
                        LLVMValueRef neg_one = LLVMConstReal(ctx->f32, -1.0);
-                       tmp = LLVMBuildSIToFP(gallivm->builder, tmp, ctx->f32, "");
-                       clamp = LLVMBuildFCmp(gallivm->builder, LLVMRealULT, tmp, neg_one, "");
-                       tmp = LLVMBuildSelect(gallivm->builder, clamp, neg_one, tmp, "");
+                       tmp = LLVMBuildSIToFP(ctx->ac.builder, tmp, ctx->f32, "");
+                       clamp = LLVMBuildFCmp(ctx->ac.builder, LLVMRealULT, tmp, neg_one, "");
+                       tmp = LLVMBuildSelect(ctx->ac.builder, clamp, neg_one, tmp, "");
                } else if (fix_fetch == SI_FIX_FETCH_A2_SSCALED) {
-                       tmp = LLVMBuildSIToFP(gallivm->builder, tmp, ctx->f32, "");
+                       tmp = LLVMBuildSIToFP(ctx->ac.builder, tmp, ctx->f32, "");
                }
 
                out[3] = tmp;
@@ -576,9 +649,9 @@ void si_llvm_load_input_vs(
        case SI_FIX_FETCH_RGBX_32_UNORM:
                for (chan = 0; chan < 4; chan++) {
                        out[chan] = ac_to_integer(&ctx->ac, out[chan]);
-                       out[chan] = LLVMBuildUIToFP(gallivm->builder,
+                       out[chan] = LLVMBuildUIToFP(ctx->ac.builder,
                                                    out[chan], ctx->f32, "");
-                       out[chan] = LLVMBuildFMul(gallivm->builder, out[chan],
+                       out[chan] = LLVMBuildFMul(ctx->ac.builder, out[chan],
                                                  LLVMConstReal(ctx->f32, 1.0 / UINT_MAX), "");
                }
                /* RGBX UINT returns 1 in alpha, which would be rounded to 0 by normalizing. */
@@ -597,9 +670,9 @@ void si_llvm_load_input_vs(
 
                for (chan = 0; chan < 4; chan++) {
                        out[chan] = ac_to_integer(&ctx->ac, out[chan]);
-                       out[chan] = LLVMBuildSIToFP(gallivm->builder,
+                       out[chan] = LLVMBuildSIToFP(ctx->ac.builder,
                                                    out[chan], ctx->f32, "");
-                       out[chan] = LLVMBuildFMul(gallivm->builder, out[chan],
+                       out[chan] = LLVMBuildFMul(ctx->ac.builder, out[chan],
                                                  LLVMConstReal(ctx->f32, scale), "");
                }
                /* RGBX SINT returns 1 in alpha, which would be rounded to 0 by normalizing. */
@@ -611,14 +684,14 @@ void si_llvm_load_input_vs(
        case SI_FIX_FETCH_RGBA_32_USCALED:
                for (chan = 0; chan < 4; chan++) {
                        out[chan] = ac_to_integer(&ctx->ac, out[chan]);
-                       out[chan] = LLVMBuildUIToFP(gallivm->builder,
+                       out[chan] = LLVMBuildUIToFP(ctx->ac.builder,
                                                    out[chan], ctx->f32, "");
                }
                break;
        case SI_FIX_FETCH_RGBA_32_SSCALED:
                for (chan = 0; chan < 4; chan++) {
                        out[chan] = ac_to_integer(&ctx->ac, out[chan]);
-                       out[chan] = LLVMBuildSIToFP(gallivm->builder,
+                       out[chan] = LLVMBuildSIToFP(ctx->ac.builder,
                                                    out[chan], ctx->f32, "");
                }
                break;
@@ -646,7 +719,7 @@ void si_llvm_load_input_vs(
        case SI_FIX_FETCH_RGB_16:
        case SI_FIX_FETCH_RGB_16_INT:
                for (chan = 0; chan < 3; chan++) {
-                       out[chan] = LLVMBuildExtractElement(gallivm->builder,
+                       out[chan] = LLVMBuildExtractElement(ctx->ac.builder,
                                                            input[chan],
                                                            ctx->i32_0, "");
                }
@@ -686,8 +759,7 @@ static LLVMValueRef get_primitive_id(struct si_shader_context *ctx,
                return LLVMGetParam(ctx->main_fn,
                                    ctx->param_tes_patch_id);
        case PIPE_SHADER_GEOMETRY:
-               return LLVMGetParam(ctx->main_fn,
-                                   ctx->param_gs_prim_id);
+               return ctx->abi.gs_prim_id;
        default:
                assert(0);
                return ctx->i32_0;
@@ -703,13 +775,11 @@ LLVMValueRef si_get_indirect_index(struct si_shader_context *ctx,
                                   unsigned addr_mul,
                                   int rel_index)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
        LLVMValueRef result;
 
-
        if (ind->File == TGSI_FILE_ADDRESS) {
                result = ctx->addrs[ind->Index][ind->Swizzle];
-               result = LLVMBuildLoad(gallivm->builder, result, "");
+               result = LLVMBuildLoad(ctx->ac.builder, result, "");
        } else {
                struct tgsi_full_src_register src = {};
 
@@ -727,9 +797,9 @@ LLVMValueRef si_get_indirect_index(struct si_shader_context *ctx,
        }
 
        if (addr_mul != 1)
-               result = LLVMBuildMul(gallivm->builder, result,
+               result = LLVMBuildMul(ctx->ac.builder, result,
                                      LLVMConstInt(ctx->i32, addr_mul, 0), "");
-       result = LLVMBuildAdd(gallivm->builder, result,
+       result = LLVMBuildAdd(ctx->ac.builder, result,
                              LLVMConstInt(ctx->i32, rel_index, 0), "");
        return result;
 }
@@ -757,7 +827,6 @@ static LLVMValueRef get_dw_address(struct si_shader_context *ctx,
                                   LLVMValueRef vertex_dw_stride,
                                   LLVMValueRef base_addr)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
        struct tgsi_shader_info *info = &ctx->shader->selector->info;
        ubyte *name, *index, *array_first;
        int first, param;
@@ -787,8 +856,8 @@ static LLVMValueRef get_dw_address(struct si_shader_context *ctx,
                else
                        index = LLVMConstInt(ctx->i32, reg.Dimension.Index, 0);
 
-               base_addr = LLVMBuildAdd(gallivm->builder, base_addr,
-                                        LLVMBuildMul(gallivm->builder, index,
+               base_addr = LLVMBuildAdd(ctx->ac.builder, base_addr,
+                                        LLVMBuildMul(ctx->ac.builder, index,
                                                      vertex_dw_stride, ""), "");
        }
 
@@ -818,8 +887,8 @@ static LLVMValueRef get_dw_address(struct si_shader_context *ctx,
                ind_index = si_get_indirect_index(ctx, &reg.Indirect,
                                                  1, reg.Register.Index - first);
 
-               base_addr = LLVMBuildAdd(gallivm->builder, base_addr,
-                                   LLVMBuildMul(gallivm->builder, ind_index,
+               base_addr = LLVMBuildAdd(ctx->ac.builder, base_addr,
+                                   LLVMBuildMul(ctx->ac.builder, ind_index,
                                                 LLVMConstInt(ctx->i32, 4, 0), ""), "");
 
                param = reg.Register.Dimension ?
@@ -834,7 +903,7 @@ static LLVMValueRef get_dw_address(struct si_shader_context *ctx,
        }
 
        /* Add the base address of the element. */
-       return LLVMBuildAdd(gallivm->builder, base_addr,
+       return LLVMBuildAdd(ctx->ac.builder, base_addr,
                            LLVMConstInt(ctx->i32, param * 4, 0), "");
 }
 
@@ -861,21 +930,20 @@ static LLVMValueRef get_tcs_tes_buffer_address(struct si_shader_context *ctx,
                                                LLVMValueRef vertex_index,
                                                LLVMValueRef param_index)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
        LLVMValueRef base_addr, vertices_per_patch, num_patches, total_vertices;
        LLVMValueRef param_stride, constant16;
 
        vertices_per_patch = get_num_tcs_out_vertices(ctx);
        num_patches = unpack_param(ctx, ctx->param_tcs_offchip_layout, 0, 6);
-       total_vertices = LLVMBuildMul(gallivm->builder, vertices_per_patch,
+       total_vertices = LLVMBuildMul(ctx->ac.builder, vertices_per_patch,
                                      num_patches, "");
 
        constant16 = LLVMConstInt(ctx->i32, 16, 0);
        if (vertex_index) {
-               base_addr = LLVMBuildMul(gallivm->builder, rel_patch_id,
+               base_addr = LLVMBuildMul(ctx->ac.builder, rel_patch_id,
                                         vertices_per_patch, "");
 
-               base_addr = LLVMBuildAdd(gallivm->builder, base_addr,
+               base_addr = LLVMBuildAdd(ctx->ac.builder, base_addr,
                                         vertex_index, "");
 
                param_stride = total_vertices;
@@ -884,17 +952,17 @@ static LLVMValueRef get_tcs_tes_buffer_address(struct si_shader_context *ctx,
                param_stride = num_patches;
        }
 
-       base_addr = LLVMBuildAdd(gallivm->builder, base_addr,
-                                LLVMBuildMul(gallivm->builder, param_index,
+       base_addr = LLVMBuildAdd(ctx->ac.builder, base_addr,
+                                LLVMBuildMul(ctx->ac.builder, param_index,
                                              param_stride, ""), "");
 
-       base_addr = LLVMBuildMul(gallivm->builder, base_addr, constant16, "");
+       base_addr = LLVMBuildMul(ctx->ac.builder, base_addr, constant16, "");
 
        if (!vertex_index) {
                LLVMValueRef patch_data_offset =
                           unpack_param(ctx, ctx->param_tcs_offchip_layout, 12, 20);
 
-               base_addr = LLVMBuildAdd(gallivm->builder, base_addr,
+               base_addr = LLVMBuildAdd(ctx->ac.builder, base_addr,
                                         patch_data_offset, "");
        }
        return base_addr;
@@ -905,7 +973,6 @@ static LLVMValueRef get_tcs_tes_buffer_address_from_reg(
                                        const struct tgsi_full_dst_register *dst,
                                        const struct tgsi_full_src_register *src)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
        struct tgsi_shader_info *info = &ctx->shader->selector->info;
        ubyte *name, *index, *array_first;
        struct tgsi_full_src_register reg;
@@ -956,7 +1023,7 @@ static LLVMValueRef get_tcs_tes_buffer_address_from_reg(
                si_shader_io_get_unique_index(name[param_base], index[param_base]) :
                si_shader_io_get_unique_index_patch(name[param_base], index[param_base]);
 
-       param_index = LLVMBuildAdd(gallivm->builder, param_index,
+       param_index = LLVMBuildAdd(ctx->ac.builder, param_index,
                                   LLVMConstInt(ctx->i32, param_index_base, 0),
                                   "");
 
@@ -970,7 +1037,6 @@ static LLVMValueRef buffer_load(struct lp_build_tgsi_context *bld_base,
                                 LLVMValueRef base, bool can_speculate)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = &ctx->gallivm;
        LLVMValueRef value, value2;
        LLVMTypeRef llvm_type = tgsi2llvmtype(bld_base, type);
        LLVMTypeRef vec_type = LLVMVectorType(llvm_type, 4);
@@ -979,15 +1045,15 @@ static LLVMValueRef buffer_load(struct lp_build_tgsi_context *bld_base,
                value = ac_build_buffer_load(&ctx->ac, buffer, 4, NULL, base, offset,
                                             0, 1, 0, can_speculate, false);
 
-               return LLVMBuildBitCast(gallivm->builder, value, vec_type, "");
+               return LLVMBuildBitCast(ctx->ac.builder, value, vec_type, "");
        }
 
        if (!tgsi_type_is_64bit(type)) {
                value = ac_build_buffer_load(&ctx->ac, buffer, 4, NULL, base, offset,
                                             0, 1, 0, can_speculate, false);
 
-               value = LLVMBuildBitCast(gallivm->builder, value, vec_type, "");
-               return LLVMBuildExtractElement(gallivm->builder, value,
+               value = LLVMBuildBitCast(ctx->ac.builder, value, vec_type, "");
+               return LLVMBuildExtractElement(ctx->ac.builder, value,
                                    LLVMConstInt(ctx->i32, swizzle, 0), "");
        }
 
@@ -1012,7 +1078,6 @@ static LLVMValueRef lds_load(struct lp_build_tgsi_context *bld_base,
                             LLVMValueRef dw_addr)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = &ctx->gallivm;
        LLVMValueRef value;
 
        if (swizzle == ~0) {
@@ -1021,21 +1086,23 @@ static LLVMValueRef lds_load(struct lp_build_tgsi_context *bld_base,
                for (unsigned chan = 0; chan < TGSI_NUM_CHANNELS; chan++)
                        values[chan] = lds_load(bld_base, type, chan, dw_addr);
 
-               return lp_build_gather_values(gallivm, values,
+               return lp_build_gather_values(&ctx->gallivm, values,
                                              TGSI_NUM_CHANNELS);
        }
 
+       /* Split 64-bit loads. */
+       if (tgsi_type_is_64bit(type)) {
+               LLVMValueRef lo, hi;
+
+               lo = lds_load(bld_base, TGSI_TYPE_UNSIGNED, swizzle, dw_addr);
+               hi = lds_load(bld_base, TGSI_TYPE_UNSIGNED, swizzle + 1, dw_addr);
+               return si_llvm_emit_fetch_64bit(bld_base, type, lo, hi);
+       }
+
        dw_addr = lp_build_add(&bld_base->uint_bld, dw_addr,
                            LLVMConstInt(ctx->i32, swizzle, 0));
 
-       value = ac_build_indexed_load(&ctx->ac, ctx->lds, dw_addr, false);
-       if (tgsi_type_is_64bit(type)) {
-               LLVMValueRef value2;
-               dw_addr = lp_build_add(&bld_base->uint_bld, dw_addr,
-                                      ctx->i32_1);
-               value2 = ac_build_indexed_load(&ctx->ac, ctx->lds, dw_addr, false);
-               return si_llvm_emit_fetch_64bit(bld_base, type, value, value2);
-       }
+       value = ac_lds_load(&ctx->ac, dw_addr);
 
        return bitcast(bld_base, type, value);
 }
@@ -1056,15 +1123,13 @@ static void lds_store(struct lp_build_tgsi_context *bld_base,
        dw_addr = lp_build_add(&bld_base->uint_bld, dw_addr,
                            LLVMConstInt(ctx->i32, dw_offset_imm, 0));
 
-       value = ac_to_integer(&ctx->ac, value);
-       ac_build_indexed_store(&ctx->ac, ctx->lds,
-                              dw_addr, value);
+       ac_lds_store(&ctx->ac, dw_addr, value);
 }
 
 static LLVMValueRef desc_from_addr_base64k(struct si_shader_context *ctx,
                                                  unsigned param)
 {
-       LLVMBuilderRef builder = ctx->gallivm.builder;
+       LLVMBuilderRef builder = ctx->ac.builder;
 
        LLVMValueRef addr = LLVMGetParam(ctx->main_fn, param);
        addr = LLVMBuildZExt(builder, addr, ctx->i64, "");
@@ -1143,7 +1208,6 @@ static void store_output_tcs(struct lp_build_tgsi_context *bld_base,
                             LLVMValueRef dst[4])
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = &ctx->gallivm;
        const struct tgsi_full_dst_register *reg = &inst->Dst[index];
        const struct tgsi_shader_info *sh_info = &ctx->shader->selector->info;
        unsigned chan_index;
@@ -1217,17 +1281,17 @@ static void store_output_tcs(struct lp_build_tgsi_context *bld_base,
                if (is_tess_factor &&
                    ctx->shader->selector->tcs_info.tessfactors_are_def_in_all_invocs) {
                        if (!is_tess_inner) {
-                               LLVMBuildStore(gallivm->builder, value, /* outer */
+                               LLVMBuildStore(ctx->ac.builder, value, /* outer */
                                               ctx->invoc0_tess_factors[chan_index]);
                        } else if (chan_index < 2) {
-                               LLVMBuildStore(gallivm->builder, value, /* inner */
+                               LLVMBuildStore(ctx->ac.builder, value, /* inner */
                                               ctx->invoc0_tess_factors[4 + chan_index]);
                        }
                }
        }
 
        if (reg->Register.WriteMask == 0xF && !is_tess_factor) {
-               LLVMValueRef value = lp_build_gather_values(gallivm,
+               LLVMValueRef value = lp_build_gather_values(&ctx->gallivm,
                                                            values, 4);
                ac_build_buffer_store_dword(&ctx->ac, buffer, value, 4, buf_addr,
                                            base, 0, 1, 0, true, false);
@@ -1243,7 +1307,6 @@ static LLVMValueRef fetch_input_gs(
        struct si_shader_context *ctx = si_shader_context(bld_base);
        struct si_shader *shader = ctx->shader;
        struct lp_build_context *uint = &ctx->bld_base.uint_bld;
-       struct gallivm_state *gallivm = &ctx->gallivm;
        LLVMValueRef vtx_offset, soffset;
        struct tgsi_shader_info *info = &shader->selector->info;
        unsigned semantic_name = info->input_semantic_name[reg->Register.Index];
@@ -1281,7 +1344,7 @@ static LLVMValueRef fetch_input_gs(
                        return NULL;
                }
 
-               vtx_offset = LLVMBuildAdd(gallivm->builder, vtx_offset,
+               vtx_offset = LLVMBuildAdd(ctx->ac.builder, vtx_offset,
                                          LLVMConstInt(ctx->i32, param * 4, 0), "");
                return lds_load(bld_base, type, swizzle, vtx_offset);
        }
@@ -1293,22 +1356,15 @@ static LLVMValueRef fetch_input_gs(
                for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) {
                        values[chan] = fetch_input_gs(bld_base, reg, type, chan);
                }
-               return lp_build_gather_values(gallivm, values,
+               return lp_build_gather_values(&ctx->gallivm, values,
                                              TGSI_NUM_CHANNELS);
        }
 
        /* Get the vertex offset parameter on GFX6. */
        unsigned vtx_offset_param = reg->Dimension.Index;
-       if (vtx_offset_param < 2) {
-               vtx_offset_param += ctx->param_gs_vtx0_offset;
-       } else {
-               assert(vtx_offset_param < 6);
-               vtx_offset_param += ctx->param_gs_vtx2_offset - 2;
-       }
-       vtx_offset = lp_build_mul_imm(uint,
-                                     LLVMGetParam(ctx->main_fn,
-                                                  vtx_offset_param),
-                                     4);
+       LLVMValueRef gs_vtx_offset = ctx->gs_vtx_offset[vtx_offset_param];
+
+       vtx_offset = lp_build_mul_imm(uint, gs_vtx_offset, 4);
 
        soffset = LLVMConstInt(ctx->i32, (param * 4 + swizzle) * 256, 0);
 
@@ -1399,7 +1455,6 @@ static void interp_fs_input(struct si_shader_context *ctx,
                            LLVMValueRef face,
                            LLVMValueRef result[4])
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
        LLVMValueRef i = NULL, j = NULL;
        unsigned chan;
 
@@ -1419,12 +1474,12 @@ static void interp_fs_input(struct si_shader_context *ctx,
        bool interp = interp_param != NULL;
 
        if (interp) {
-               interp_param = LLVMBuildBitCast(gallivm->builder, interp_param,
+               interp_param = LLVMBuildBitCast(ctx->ac.builder, interp_param,
                                                LLVMVectorType(ctx->f32, 2), "");
 
-               i = LLVMBuildExtractElement(gallivm->builder, interp_param,
+               i = LLVMBuildExtractElement(ctx->ac.builder, interp_param,
                                                ctx->i32_0, "");
-               j = LLVMBuildExtractElement(gallivm->builder, interp_param,
+               j = LLVMBuildExtractElement(ctx->ac.builder, interp_param,
                                                ctx->i32_1, "");
        }
 
@@ -1439,7 +1494,7 @@ static void interp_fs_input(struct si_shader_context *ctx,
                if (semantic_index == 1 && colors_read_mask & 0xf)
                        back_attr_offset += 1;
 
-               is_face_positive = LLVMBuildICmp(gallivm->builder, LLVMIntNE,
+               is_face_positive = LLVMBuildICmp(ctx->ac.builder, LLVMIntNE,
                                                 face, ctx->i32_0, "");
 
                for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) {
@@ -1452,7 +1507,7 @@ static void interp_fs_input(struct si_shader_context *ctx,
                                                  back_attr_offset, chan,
                                                  prim_mask, i, j);
 
-                       result[chan] = LLVMBuildSelect(gallivm->builder,
+                       result[chan] = LLVMBuildSelect(ctx->ac.builder,
                                                is_face_positive,
                                                front,
                                                back,
@@ -1547,15 +1602,13 @@ static LLVMValueRef buffer_load_const(struct si_shader_context *ctx,
 static LLVMValueRef load_sample_position(struct si_shader_context *ctx, LLVMValueRef sample_id)
 {
        struct lp_build_context *uint_bld = &ctx->bld_base.uint_bld;
-       struct gallivm_state *gallivm = &ctx->gallivm;
-       LLVMBuilderRef builder = gallivm->builder;
        LLVMValueRef desc = LLVMGetParam(ctx->main_fn, ctx->param_rw_buffers);
        LLVMValueRef buf_index = LLVMConstInt(ctx->i32, SI_PS_CONST_SAMPLE_POSITIONS, 0);
-       LLVMValueRef resource = ac_build_indexed_load_const(&ctx->ac, desc, buf_index);
+       LLVMValueRef resource = ac_build_load_to_sgpr(&ctx->ac, 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, LLVMConstInt(ctx->i32, 4, 0), "");
+       LLVMValueRef offset1 = LLVMBuildAdd(ctx->ac.builder, offset0, LLVMConstInt(ctx->i32, 4, 0), "");
 
        LLVMValueRef pos[4] = {
                buffer_load_const(ctx, resource, offset0),
@@ -1564,7 +1617,7 @@ static LLVMValueRef load_sample_position(struct si_shader_context *ctx, LLVMValu
                LLVMConstReal(ctx->f32, 0)
        };
 
-       return lp_build_gather_values(gallivm, pos, 4);
+       return lp_build_gather_values(&ctx->gallivm, pos, 4);
 }
 
 void si_load_system_value(struct si_shader_context *ctx,
@@ -1572,7 +1625,6 @@ void si_load_system_value(struct si_shader_context *ctx,
                          const struct tgsi_full_declaration *decl)
 {
        struct lp_build_context *bld = &ctx->bld_base.base;
-       struct gallivm_state *gallivm = &ctx->gallivm;
        LLVMValueRef value = 0;
 
        assert(index < RADEON_LLVM_MAX_SYSTEM_VALUES);
@@ -1583,7 +1635,7 @@ void si_load_system_value(struct si_shader_context *ctx,
                break;
 
        case TGSI_SEMANTIC_VERTEXID:
-               value = LLVMBuildAdd(gallivm->builder,
+               value = LLVMBuildAdd(ctx->ac.builder,
                                     ctx->abi.vertex_id,
                                     ctx->abi.base_vertex, "");
                break;
@@ -1603,10 +1655,10 @@ void si_load_system_value(struct si_shader_context *ctx,
                LLVMValueRef vs_state = LLVMGetParam(ctx->main_fn, ctx->param_vs_state_bits);
                LLVMValueRef indexed;
 
-               indexed = LLVMBuildLShr(gallivm->builder, vs_state, ctx->i32_1, "");
-               indexed = LLVMBuildTrunc(gallivm->builder, indexed, ctx->i1, "");
+               indexed = LLVMBuildLShr(ctx->ac.builder, vs_state, ctx->i32_1, "");
+               indexed = LLVMBuildTrunc(ctx->ac.builder, indexed, ctx->i1, "");
 
-               value = LLVMBuildSelect(gallivm->builder, indexed,
+               value = LLVMBuildSelect(ctx->ac.builder, indexed,
                                        ctx->abi.base_vertex, ctx->i32_0, "");
                break;
        }
@@ -1623,8 +1675,7 @@ void si_load_system_value(struct si_shader_context *ctx,
                if (ctx->type == PIPE_SHADER_TESS_CTRL)
                        value = unpack_param(ctx, ctx->param_tcs_rel_ids, 8, 5);
                else if (ctx->type == PIPE_SHADER_GEOMETRY)
-                       value = LLVMGetParam(ctx->main_fn,
-                                            ctx->param_gs_instance_id);
+                       value = ctx->abi.gs_invocation_id;
                else
                        assert(!"INVOCATIONID not implemented");
                break;
@@ -1639,7 +1690,7 @@ void si_load_system_value(struct si_shader_context *ctx,
                                                 LLVMGetParam(ctx->main_fn,
                                                              SI_PARAM_POS_W_FLOAT)),
                };
-               value = lp_build_gather_values(gallivm, pos, 4);
+               value = lp_build_gather_values(&ctx->gallivm, pos, 4);
                break;
        }
 
@@ -1662,7 +1713,7 @@ void si_load_system_value(struct si_shader_context *ctx,
                                                  TGSI_OPCODE_FRC, pos[0]);
                pos[1] = lp_build_emit_llvm_unary(&ctx->bld_base,
                                                  TGSI_OPCODE_FRC, pos[1]);
-               value = lp_build_gather_values(gallivm, pos, 4);
+               value = lp_build_gather_values(&ctx->gallivm, pos, 4);
                break;
        }
 
@@ -1678,17 +1729,17 @@ void si_load_system_value(struct si_shader_context *ctx,
                LLVMValueRef coord[4] = {
                        LLVMGetParam(ctx->main_fn, ctx->param_tes_u),
                        LLVMGetParam(ctx->main_fn, ctx->param_tes_v),
-                       bld->zero,
-                       bld->zero
+                       ctx->ac.f32_0,
+                       ctx->ac.f32_0
                };
 
                /* For triangles, the vector should be (u, v, 1-u-v). */
                if (ctx->shader->selector->info.properties[TGSI_PROPERTY_TES_PRIM_MODE] ==
                    PIPE_PRIM_TRIANGLES)
-                       coord[2] = lp_build_sub(bld, bld->one,
+                       coord[2] = lp_build_sub(bld, ctx->ac.f32_1,
                                                lp_build_add(bld, coord[0], coord[1]));
 
-               value = lp_build_gather_values(gallivm, coord, 4);
+               value = lp_build_gather_values(&ctx->gallivm, coord, 4);
                break;
        }
 
@@ -1727,13 +1778,13 @@ void si_load_system_value(struct si_shader_context *ctx,
 
                slot = LLVMConstInt(ctx->i32, SI_HS_CONST_DEFAULT_TESS_LEVELS, 0);
                buf = LLVMGetParam(ctx->main_fn, ctx->param_rw_buffers);
-               buf = ac_build_indexed_load_const(&ctx->ac, buf, slot);
+               buf = ac_build_load_to_sgpr(&ctx->ac, 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,
                                                   LLVMConstInt(ctx->i32, (offset + i) * 4, 0));
-               value = lp_build_gather_values(gallivm, val, 4);
+               value = lp_build_gather_values(&ctx->gallivm, val, 4);
                break;
        }
 
@@ -1761,7 +1812,7 @@ void si_load_system_value(struct si_shader_context *ctx,
                        for (i = 0; i < 3; ++i)
                                values[i] = LLVMConstInt(ctx->i32, sizes[i], 0);
 
-                       value = lp_build_gather_values(gallivm, values, 3);
+                       value = lp_build_gather_values(&ctx->gallivm, values, 3);
                } else {
                        value = LLVMGetParam(ctx->main_fn, ctx->param_block_size);
                }
@@ -1779,7 +1830,7 @@ void si_load_system_value(struct si_shader_context *ctx,
                                                         ctx->param_block_id[i]);
                        }
                }
-               value = lp_build_gather_values(gallivm, values, 3);
+               value = lp_build_gather_values(&ctx->gallivm, values, 3);
                break;
        }
 
@@ -1788,12 +1839,12 @@ void si_load_system_value(struct si_shader_context *ctx,
                break;
 
        case TGSI_SEMANTIC_HELPER_INVOCATION:
-               value = lp_build_intrinsic(gallivm->builder,
+               value = lp_build_intrinsic(ctx->ac.builder,
                                           "llvm.amdgcn.ps.live",
                                           ctx->i1, NULL, 0,
                                           LP_FUNC_ATTR_READNONE);
-               value = LLVMBuildNot(gallivm->builder, value, "");
-               value = LLVMBuildSExt(gallivm->builder, value, ctx->i32, "");
+               value = LLVMBuildNot(ctx->ac.builder, value, "");
+               value = LLVMBuildSExt(ctx->ac.builder, value, ctx->i32, "");
                break;
 
        case TGSI_SEMANTIC_SUBGROUP_SIZE:
@@ -1807,9 +1858,9 @@ void si_load_system_value(struct si_shader_context *ctx,
        case TGSI_SEMANTIC_SUBGROUP_EQ_MASK:
        {
                LLVMValueRef id = ac_get_thread_id(&ctx->ac);
-               id = LLVMBuildZExt(gallivm->builder, id, ctx->i64, "");
-               value = LLVMBuildShl(gallivm->builder, LLVMConstInt(ctx->i64, 1, 0), id, "");
-               value = LLVMBuildBitCast(gallivm->builder, value, ctx->v2i32, "");
+               id = LLVMBuildZExt(ctx->ac.builder, id, ctx->i64, "");
+               value = LLVMBuildShl(ctx->ac.builder, LLVMConstInt(ctx->i64, 1, 0), id, "");
+               value = LLVMBuildBitCast(ctx->ac.builder, value, ctx->v2i32, "");
                break;
        }
 
@@ -1827,12 +1878,12 @@ void si_load_system_value(struct si_shader_context *ctx,
                        /* All bits set */
                        value = LLVMConstInt(ctx->i64, -1, 0);
                }
-               id = LLVMBuildZExt(gallivm->builder, id, ctx->i64, "");
-               value = LLVMBuildShl(gallivm->builder, value, id, "");
+               id = LLVMBuildZExt(ctx->ac.builder, id, ctx->i64, "");
+               value = LLVMBuildShl(ctx->ac.builder, value, id, "");
                if (decl->Semantic.Name == TGSI_SEMANTIC_SUBGROUP_LE_MASK ||
                    decl->Semantic.Name == TGSI_SEMANTIC_SUBGROUP_LT_MASK)
-                       value = LLVMBuildNot(gallivm->builder, value, "");
-               value = LLVMBuildBitCast(gallivm->builder, value, ctx->v2i32, "");
+                       value = LLVMBuildNot(ctx->ac.builder, value, "");
+               value = LLVMBuildBitCast(ctx->ac.builder, value, ctx->v2i32, "");
                break;
        }
 
@@ -1848,22 +1899,21 @@ void si_declare_compute_memory(struct si_shader_context *ctx,
                               const struct tgsi_full_declaration *decl)
 {
        struct si_shader_selector *sel = ctx->shader->selector;
-       struct gallivm_state *gallivm = &ctx->gallivm;
 
        LLVMTypeRef i8p = LLVMPointerType(ctx->i8, LOCAL_ADDR_SPACE);
        LLVMValueRef var;
 
        assert(decl->Declaration.MemType == TGSI_MEMORY_TYPE_SHARED);
        assert(decl->Range.First == decl->Range.Last);
-       assert(!ctx->shared_memory);
+       assert(!ctx->ac.lds);
 
-       var = LLVMAddGlobalInAddressSpace(gallivm->module,
+       var = LLVMAddGlobalInAddressSpace(ctx->ac.module,
                                          LLVMArrayType(ctx->i8, sel->local_size),
                                          "compute_lds",
                                          LOCAL_ADDR_SPACE);
        LLVMSetAlignment(var, 4);
 
-       ctx->shared_memory = LLVMBuildBitCast(gallivm->builder, var, i8p, "");
+       ctx->ac.lds = LLVMBuildBitCast(ctx->ac.builder, var, i8p, "");
 }
 
 static LLVMValueRef load_const_buffer_desc(struct si_shader_context *ctx, int i)
@@ -1871,8 +1921,8 @@ static LLVMValueRef load_const_buffer_desc(struct si_shader_context *ctx, int i)
        LLVMValueRef list_ptr = LLVMGetParam(ctx->main_fn,
                                             ctx->param_const_and_shader_buffers);
 
-       return ac_build_indexed_load_const(&ctx->ac, list_ptr,
-                       LLVMConstInt(ctx->i32, si_get_constbuf_slot(i), 0));
+       return ac_build_load_to_sgpr(&ctx->ac, list_ptr,
+                                    LLVMConstInt(ctx->i32, si_get_constbuf_slot(i), 0));
 }
 
 static LLVMValueRef load_ubo(struct ac_shader_abi *abi, LLVMValueRef index)
@@ -1881,10 +1931,10 @@ static LLVMValueRef load_ubo(struct ac_shader_abi *abi, LLVMValueRef index)
        LLVMValueRef ptr = LLVMGetParam(ctx->main_fn, ctx->param_const_and_shader_buffers);
 
        index = si_llvm_bound_index(ctx, index, ctx->num_const_buffers);
-       index = LLVMBuildAdd(ctx->gallivm.builder, index,
+       index = LLVMBuildAdd(ctx->ac.builder, index,
                             LLVMConstInt(ctx->i32, SI_NUM_SHADER_BUFFERS, 0), "");
 
-       return ac_build_indexed_load_const(&ctx->ac, ptr, index);
+       return ac_build_load_to_sgpr(&ctx->ac, ptr, index);
 }
 
 static LLVMValueRef
@@ -1895,11 +1945,11 @@ load_ssbo(struct ac_shader_abi *abi, LLVMValueRef index, bool write)
                                             ctx->param_const_and_shader_buffers);
 
        index = si_llvm_bound_index(ctx, index, ctx->num_shader_buffers);
-       index = LLVMBuildSub(ctx->gallivm.builder,
+       index = LLVMBuildSub(ctx->ac.builder,
                             LLVMConstInt(ctx->i32, SI_NUM_SHADER_BUFFERS - 1, 0),
                             index, "");
 
-       return ac_build_indexed_load_const(&ctx->ac, rsrc_ptr, index);
+       return ac_build_load_to_sgpr(&ctx->ac, rsrc_ptr, index);
 }
 
 static LLVMValueRef fetch_constant(
@@ -1909,11 +1959,11 @@ static LLVMValueRef fetch_constant(
        unsigned swizzle)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
+       struct si_shader_selector *sel = ctx->shader->selector;
        const struct tgsi_ind_register *ireg = &reg->Indirect;
        unsigned buf, idx;
 
        LLVMValueRef addr, bufp;
-       LLVMValueRef result;
 
        if (swizzle == LP_CHAN_ALL) {
                unsigned chan;
@@ -1924,9 +1974,76 @@ static LLVMValueRef fetch_constant(
                return lp_build_gather_values(&ctx->gallivm, values, 4);
        }
 
+       /* Split 64-bit loads. */
+       if (tgsi_type_is_64bit(type)) {
+               LLVMValueRef lo, hi;
+
+               lo = fetch_constant(bld_base, reg, TGSI_TYPE_UNSIGNED, swizzle);
+               hi = fetch_constant(bld_base, reg, TGSI_TYPE_UNSIGNED, swizzle + 1);
+               return si_llvm_emit_fetch_64bit(bld_base, type, lo, hi);
+       }
+
+       idx = reg->Register.Index * 4 + swizzle;
+       if (reg->Register.Indirect) {
+               addr = si_get_indirect_index(ctx, ireg, 16, idx * 4);
+       } else {
+               addr = LLVMConstInt(ctx->i32, idx * 4, 0);
+       }
+
+       /* Fast path when user data SGPRs point to constant buffer 0 directly. */
+       if (sel->info.const_buffers_declared == 1 &&
+           sel->info.shader_buffers_declared == 0) {
+               LLVMValueRef ptr =
+                       LLVMGetParam(ctx->main_fn, ctx->param_const_and_shader_buffers);
+
+               /* This enables use of s_load_dword and flat_load_dword for const buffer 0
+                * loads, and up to x4 load opcode merging. However, it leads to horrible
+                * code reducing SIMD wave occupancy from 8 to 2 in many cases.
+                *
+                * Using s_buffer_load_dword (x1) seems to be the best option right now.
+                *
+                * LLVM 5.0 on SI doesn't insert a required s_nop between SALU setting
+                * a descriptor and s_buffer_load_dword using it, so we can't expand
+                * the pointer into a full descriptor like below. We have to use
+                * s_load_dword instead. The only case when LLVM 5.0 would select
+                * s_buffer_load_dword (that we have to prevent) is when we use use
+                * a literal offset where we don't need bounds checking.
+                */
+               if (ctx->screen->b.chip_class == SI &&
+                    HAVE_LLVM < 0x0600 &&
+                    !reg->Register.Indirect) {
+                       addr = LLVMBuildLShr(ctx->ac.builder, addr, LLVMConstInt(ctx->i32, 2, 0), "");
+                       LLVMValueRef result = ac_build_load_invariant(&ctx->ac, ptr, addr);
+                       return bitcast(bld_base, type, result);
+               }
+
+               /* Do the bounds checking with a descriptor, because
+                * doing computation and manual bounds checking of 64-bit
+                * addresses generates horrible VALU code with very high
+                * VGPR usage and very low SIMD occupancy.
+                */
+               ptr = LLVMBuildPtrToInt(ctx->ac.builder, ptr, ctx->i64, "");
+               ptr = LLVMBuildBitCast(ctx->ac.builder, ptr, ctx->v2i32, "");
+
+               LLVMValueRef desc_elems[] = {
+                       LLVMBuildExtractElement(ctx->ac.builder, ptr, ctx->i32_0, ""),
+                       LLVMBuildExtractElement(ctx->ac.builder, ptr, ctx->i32_1, ""),
+                       LLVMConstInt(ctx->i32, (sel->info.const_file_max[0] + 1) * 16, 0),
+                       LLVMConstInt(ctx->i32,
+                               S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
+                               S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
+                               S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |
+                               S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W) |
+                               S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
+                               S_008F0C_DATA_FORMAT(V_008F0C_BUF_DATA_FORMAT_32), 0)
+               };
+               LLVMValueRef desc = ac_build_gather_values(&ctx->ac, desc_elems, 4);
+               LLVMValueRef result = buffer_load_const(ctx, desc, addr);
+               return bitcast(bld_base, type, result);
+       }
+
        assert(reg->Register.Dimension);
        buf = reg->Dimension.Index;
-       idx = reg->Register.Index * 4 + swizzle;
 
        if (reg->Dimension.Indirect) {
                LLVMValueRef ptr = LLVMGetParam(ctx->main_fn, ctx->param_const_and_shader_buffers);
@@ -1934,41 +2051,21 @@ static LLVMValueRef fetch_constant(
                index = si_get_bounded_indirect_index(ctx, &reg->DimIndirect,
                                                      reg->Dimension.Index,
                                                      ctx->num_const_buffers);
-               index = LLVMBuildAdd(ctx->gallivm.builder, index,
+               index = LLVMBuildAdd(ctx->ac.builder, index,
                                     LLVMConstInt(ctx->i32, SI_NUM_SHADER_BUFFERS, 0), "");
-               bufp = ac_build_indexed_load_const(&ctx->ac, ptr, index);
+               bufp = ac_build_load_to_sgpr(&ctx->ac, ptr, index);
        } else
                bufp = load_const_buffer_desc(ctx, buf);
 
-       if (reg->Register.Indirect) {
-               addr = si_get_indirect_index(ctx, ireg, 16, idx * 4);
-       } else {
-               addr = LLVMConstInt(ctx->i32, idx * 4, 0);
-       }
-
-       result = buffer_load_const(ctx, bufp, addr);
-
-       if (!tgsi_type_is_64bit(type))
-               result = bitcast(bld_base, type, result);
-       else {
-               LLVMValueRef addr2, result2;
-
-               addr2 = lp_build_add(&bld_base->uint_bld, addr,
-                                    LLVMConstInt(ctx->i32, 4, 0));
-               result2 = buffer_load_const(ctx, bufp, addr2);
-
-               result = si_llvm_emit_fetch_64bit(bld_base, type,
-                                                 result, result2);
-       }
-       return result;
+       return bitcast(bld_base, type, buffer_load_const(ctx, bufp, addr));
 }
 
 /* Upper 16 bits must be zero. */
 static LLVMValueRef si_llvm_pack_two_int16(struct si_shader_context *ctx,
                                           LLVMValueRef val[2])
 {
-       return LLVMBuildOr(ctx->gallivm.builder, val[0],
-                          LLVMBuildShl(ctx->gallivm.builder, val[1],
+       return LLVMBuildOr(ctx->ac.builder, val[0],
+                          LLVMBuildShl(ctx->ac.builder, val[1],
                                        LLVMConstInt(ctx->i32, 16, 0),
                                        ""), "");
 }
@@ -1978,7 +2075,7 @@ static LLVMValueRef si_llvm_pack_two_int32_as_int16(struct si_shader_context *ct
                                                    LLVMValueRef val[2])
 {
        LLVMValueRef v[2] = {
-               LLVMBuildAnd(ctx->gallivm.builder, val[0],
+               LLVMBuildAnd(ctx->ac.builder, val[0],
                             LLVMConstInt(ctx->i32, 0xffff, 0), ""),
                val[1],
        };
@@ -1986,14 +2083,13 @@ static LLVMValueRef si_llvm_pack_two_int32_as_int16(struct si_shader_context *ct
 }
 
 /* Initialize arguments for the shader export intrinsic */
-static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
+static void si_llvm_init_export_args(struct si_shader_context *ctx,
                                     LLVMValueRef *values,
                                     unsigned target,
                                     struct ac_export_args *args)
 {
-       struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct lp_build_context *base = &bld_base->base;
-       LLVMBuilderRef builder = ctx->gallivm.builder;
+       LLVMValueRef f32undef = LLVMGetUndef(ctx->ac.f32);
+       LLVMBuilderRef builder = ctx->ac.builder;
        LLVMValueRef val[4];
        unsigned spi_shader_col_format = V_028714_SPI_SHADER_32_ABGR;
        unsigned chan;
@@ -2023,10 +2119,10 @@ static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
        }
 
        args->compr = false;
-       args->out[0] = base->undef;
-       args->out[1] = base->undef;
-       args->out[2] = base->undef;
-       args->out[3] = base->undef;
+       args->out[0] = f32undef;
+       args->out[1] = f32undef;
+       args->out[2] = f32undef;
+       args->out[3] = f32undef;
 
        switch (spi_shader_col_format) {
        case V_028714_SPI_SHADER_ZERO:
@@ -2085,10 +2181,10 @@ static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
        case V_028714_SPI_SHADER_SNORM16_ABGR:
                for (chan = 0; chan < 4; chan++) {
                        /* Clamp between [-1, 1]. */
-                       val[chan] = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MIN,
+                       val[chan] = lp_build_emit_llvm_binary(&ctx->bld_base, TGSI_OPCODE_MIN,
                                                              values[chan],
                                                              LLVMConstReal(ctx->f32, 1));
-                       val[chan] = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MAX,
+                       val[chan] = lp_build_emit_llvm_binary(&ctx->bld_base, TGSI_OPCODE_MAX,
                                                              val[chan],
                                                              LLVMConstReal(ctx->f32, -1));
                        /* Convert to a signed integer in [-32767, 32767]. */
@@ -2098,7 +2194,7 @@ static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
                        val[chan] = LLVMBuildFAdd(builder, val[chan],
                                        LLVMBuildSelect(builder,
                                                LLVMBuildFCmp(builder, LLVMRealOGE,
-                                                             val[chan], base->zero, ""),
+                                                             val[chan], ctx->ac.f32_0, ""),
                                                LLVMConstReal(ctx->f32, 0.5),
                                                LLVMConstReal(ctx->f32, -0.5), ""), "");
                        val[chan] = LLVMBuildFPToSI(builder, val[chan], ctx->i32, "");
@@ -2118,7 +2214,7 @@ static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
                /* Clamp. */
                for (chan = 0; chan < 4; chan++) {
                        val[chan] = ac_to_integer(&ctx->ac, values[chan]);
-                       val[chan] = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_UMIN,
+                       val[chan] = lp_build_emit_llvm_binary(&ctx->bld_base, TGSI_OPCODE_UMIN,
                                        val[chan],
                                        chan == 3 ? max_alpha : max_rgb);
                }
@@ -2142,10 +2238,10 @@ static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
                /* Clamp. */
                for (chan = 0; chan < 4; chan++) {
                        val[chan] = ac_to_integer(&ctx->ac, values[chan]);
-                       val[chan] = lp_build_emit_llvm_binary(bld_base,
+                       val[chan] = lp_build_emit_llvm_binary(&ctx->bld_base,
                                        TGSI_OPCODE_IMIN,
                                        val[chan], chan == 3 ? max_alpha : max_rgb);
-                       val[chan] = lp_build_emit_llvm_binary(bld_base,
+                       val[chan] = lp_build_emit_llvm_binary(&ctx->bld_base,
                                        TGSI_OPCODE_IMAX,
                                        val[chan], chan == 3 ? min_alpha : min_rgb);
                }
@@ -2168,22 +2264,24 @@ static void si_alpha_test(struct lp_build_tgsi_context *bld_base,
        struct si_shader_context *ctx = si_shader_context(bld_base);
 
        if (ctx->shader->key.part.ps.epilog.alpha_func != PIPE_FUNC_NEVER) {
+               static LLVMRealPredicate cond_map[PIPE_FUNC_ALWAYS + 1] = {
+                       [PIPE_FUNC_LESS] = LLVMRealOLT,
+                       [PIPE_FUNC_EQUAL] = LLVMRealOEQ,
+                       [PIPE_FUNC_LEQUAL] = LLVMRealOLE,
+                       [PIPE_FUNC_GREATER] = LLVMRealOGT,
+                       [PIPE_FUNC_NOTEQUAL] = LLVMRealONE,
+                       [PIPE_FUNC_GEQUAL] = LLVMRealOGE,
+               };
+               LLVMRealPredicate cond = cond_map[ctx->shader->key.part.ps.epilog.alpha_func];
+               assert(cond);
+
                LLVMValueRef alpha_ref = LLVMGetParam(ctx->main_fn,
                                SI_PARAM_ALPHA_REF);
-
                LLVMValueRef alpha_pass =
-                       lp_build_cmp(&bld_base->base,
-                                    ctx->shader->key.part.ps.epilog.alpha_func,
-                                    alpha, alpha_ref);
-               LLVMValueRef arg =
-                       lp_build_select(&bld_base->base,
-                                       alpha_pass,
-                                       LLVMConstReal(ctx->f32, 1.0f),
-                                       LLVMConstReal(ctx->f32, -1.0f));
-
-               ac_build_kill(&ctx->ac, arg);
+                       LLVMBuildFCmp(ctx->ac.builder, cond, alpha, alpha_ref, "");
+               ac_build_kill_if_false(&ctx->ac, alpha_pass);
        } else {
-               ac_build_kill(&ctx->ac, NULL);
+               ac_build_kill_if_false(&ctx->ac, LLVMConstInt(ctx->i1, 0, 0));
        }
 }
 
@@ -2192,7 +2290,6 @@ static LLVMValueRef si_scale_alpha_by_sample_mask(struct lp_build_tgsi_context *
                                                  unsigned samplemask_param)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = &ctx->gallivm;
        LLVMValueRef coverage;
 
        /* alpha = alpha * popcount(coverage) / SI_NUM_SMOOTH_AA_SAMPLES */
@@ -2200,25 +2297,23 @@ static LLVMValueRef si_scale_alpha_by_sample_mask(struct lp_build_tgsi_context *
                                samplemask_param);
        coverage = ac_to_integer(&ctx->ac, coverage);
 
-       coverage = lp_build_intrinsic(gallivm->builder, "llvm.ctpop.i32",
+       coverage = lp_build_intrinsic(ctx->ac.builder, "llvm.ctpop.i32",
                                   ctx->i32,
                                   &coverage, 1, LP_FUNC_ATTR_READNONE);
 
-       coverage = LLVMBuildUIToFP(gallivm->builder, coverage,
+       coverage = LLVMBuildUIToFP(ctx->ac.builder, coverage,
                                   ctx->f32, "");
 
-       coverage = LLVMBuildFMul(gallivm->builder, coverage,
+       coverage = LLVMBuildFMul(ctx->ac.builder, coverage,
                                 LLVMConstReal(ctx->f32,
                                        1.0 / SI_NUM_SMOOTH_AA_SAMPLES), "");
 
-       return LLVMBuildFMul(gallivm->builder, alpha, coverage, "");
+       return LLVMBuildFMul(ctx->ac.builder, alpha, coverage, "");
 }
 
-static void si_llvm_emit_clipvertex(struct lp_build_tgsi_context *bld_base,
+static void si_llvm_emit_clipvertex(struct si_shader_context *ctx,
                                    struct ac_export_args *pos, LLVMValueRef *out_elts)
 {
-       struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct lp_build_context *base = &bld_base->base;
        unsigned reg_index;
        unsigned chan;
        unsigned const_chan;
@@ -2226,7 +2321,7 @@ static void si_llvm_emit_clipvertex(struct lp_build_tgsi_context *bld_base,
        LLVMValueRef ptr = LLVMGetParam(ctx->main_fn, ctx->param_rw_buffers);
        LLVMValueRef constbuf_index = LLVMConstInt(ctx->i32,
                                                   SI_VS_CONST_CLIP_PLANES, 0);
-       LLVMValueRef const_resource = ac_build_indexed_load_const(&ctx->ac, ptr, constbuf_index);
+       LLVMValueRef const_resource = ac_build_load_to_sgpr(&ctx->ac, ptr, constbuf_index);
 
        for (reg_index = 0; reg_index < 2; reg_index ++) {
                struct ac_export_args *args = &pos[2 + reg_index];
@@ -2245,8 +2340,8 @@ static void si_llvm_emit_clipvertex(struct lp_build_tgsi_context *bld_base,
                                base_elt = buffer_load_const(ctx, const_resource,
                                                             addr);
                                args->out[chan] =
-                                       lp_build_add(base, args->out[chan],
-                                                    lp_build_mul(base, base_elt,
+                                       lp_build_add(&ctx->bld_base.base, args->out[chan],
+                                                    lp_build_mul(&ctx->bld_base.base, base_elt,
                                                                  out_elts[const_chan]));
                        }
                }
@@ -2286,8 +2381,6 @@ static void emit_streamout_output(struct si_shader_context *ctx,
                                  struct pipe_stream_output *stream_out,
                                  struct si_shader_output_values *shader_out)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
-       LLVMBuilderRef builder = gallivm->builder;
        unsigned buf_idx = stream_out->output_buffer;
        unsigned start = stream_out->start_component;
        unsigned num_comps = stream_out->num_components;
@@ -2316,7 +2409,7 @@ static void emit_streamout_output(struct si_shader_context *ctx,
        case 4: /* as v4i32 */
                vdata = LLVMGetUndef(LLVMVectorType(ctx->i32, util_next_power_of_two(num_comps)));
                for (int j = 0; j < num_comps; j++) {
-                       vdata = LLVMBuildInsertElement(builder, vdata, out[j],
+                       vdata = LLVMBuildInsertElement(ctx->ac.builder, vdata, out[j],
                                                       LLVMConstInt(ctx->i32, j, 0), "");
                }
                break;
@@ -2339,8 +2432,7 @@ static void si_llvm_emit_streamout(struct si_shader_context *ctx,
 {
        struct si_shader_selector *sel = ctx->shader->selector;
        struct pipe_stream_output_info *so = &sel->so;
-       struct gallivm_state *gallivm = &ctx->gallivm;
-       LLVMBuilderRef builder = gallivm->builder;
+       LLVMBuilderRef builder = ctx->ac.builder;
        int i;
        struct lp_build_if_state if_ctx;
 
@@ -2357,7 +2449,7 @@ static void si_llvm_emit_streamout(struct si_shader_context *ctx,
        /* Emit the streamout code conditionally. This actually avoids
         * out-of-bounds buffer access. The hw tells us via the SGPR
         * (so_vtx_count) which threads are allowed to emit streamout data. */
-       lp_build_if(&if_ctx, gallivm, can_emit);
+       lp_build_if(&if_ctx, &ctx->gallivm, can_emit);
        {
                /* The buffer offset is computed as follows:
                 *   ByteOffset = streamout_offset[buffer_id]*4 +
@@ -2386,7 +2478,7 @@ static void si_llvm_emit_streamout(struct si_shader_context *ctx,
                        LLVMValueRef offset = LLVMConstInt(ctx->i32,
                                                           SI_VS_STREAMOUT_BUF0 + i, 0);
 
-                       so_buffers[i] = ac_build_indexed_load_const(&ctx->ac, buf_ptr, offset);
+                       so_buffers[i] = ac_build_load_to_sgpr(&ctx->ac, buf_ptr, offset);
 
                        LLVMValueRef so_offset = LLVMGetParam(ctx->main_fn,
                                                              ctx->param_streamout_offset[i]);
@@ -2419,7 +2511,7 @@ static void si_export_param(struct si_shader_context *ctx, unsigned index,
 {
        struct ac_export_args args;
 
-       si_llvm_init_export_args(&ctx->bld_base, values,
+       si_llvm_init_export_args(ctx, values,
                                 V_008DFC_SQ_EXP_PARAM + index, &args);
        ac_build_export(&ctx->ac, &args);
 }
@@ -2472,13 +2564,11 @@ static void si_build_param_exports(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,
+static void si_llvm_export_vs(struct si_shader_context *ctx,
                              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 ac_export_args pos_args[4] = {};
        LLVMValueRef psize_value = NULL, edgeflag_value = NULL, layer_value = NULL, viewport_index_value = NULL;
        unsigned pos_idx;
@@ -2488,7 +2578,7 @@ static void si_llvm_export_vs(struct lp_build_tgsi_context *bld_base,
        for (i = 0; i < noutput; i++) {
                switch (outputs[i].semantic_name) {
                case TGSI_SEMANTIC_POSITION:
-                       si_llvm_init_export_args(bld_base, outputs[i].values,
+                       si_llvm_init_export_args(ctx, outputs[i].values,
                                                 V_008DFC_SQ_EXP_POS, &pos_args[0]);
                        break;
                case TGSI_SEMANTIC_PSIZE:
@@ -2506,14 +2596,14 @@ static void si_llvm_export_vs(struct lp_build_tgsi_context *bld_base,
                case TGSI_SEMANTIC_CLIPDIST:
                        if (!shader->key.opt.clip_disable) {
                                unsigned index = 2 + outputs[i].semantic_index;
-                               si_llvm_init_export_args(bld_base, outputs[i].values,
+                               si_llvm_init_export_args(ctx, outputs[i].values,
                                                         V_008DFC_SQ_EXP_POS + index,
                                                         &pos_args[index]);
                        }
                        break;
                case TGSI_SEMANTIC_CLIPVERTEX:
                        if (!shader->key.opt.clip_disable) {
-                               si_llvm_emit_clipvertex(bld_base, pos_args,
+                               si_llvm_emit_clipvertex(ctx, pos_args,
                                                        outputs[i].values);
                        }
                        break;
@@ -2527,10 +2617,10 @@ static void si_llvm_export_vs(struct lp_build_tgsi_context *bld_base,
                pos_args[0].done = 0; /* last export? */
                pos_args[0].target = V_008DFC_SQ_EXP_POS;
                pos_args[0].compr = 0; /* COMPR flag */
-               pos_args[0].out[0] = base->zero; /* X */
-               pos_args[0].out[1] = base->zero; /* Y */
-               pos_args[0].out[2] = base->zero; /* Z */
-               pos_args[0].out[3] = base->one;  /* W */
+               pos_args[0].out[0] = ctx->ac.f32_0; /* X */
+               pos_args[0].out[1] = ctx->ac.f32_0; /* Y */
+               pos_args[0].out[2] = ctx->ac.f32_0; /* Z */
+               pos_args[0].out[3] = ctx->ac.f32_1;  /* W */
        }
 
        /* Write the misc vector (point size, edgeflag, layer, viewport). */
@@ -2546,10 +2636,10 @@ static void si_llvm_export_vs(struct lp_build_tgsi_context *bld_base,
                pos_args[1].done = 0; /* last export? */
                pos_args[1].target = V_008DFC_SQ_EXP_POS + 1;
                pos_args[1].compr = 0; /* COMPR flag */
-               pos_args[1].out[0] = base->zero; /* X */
-               pos_args[1].out[1] = base->zero; /* Y */
-               pos_args[1].out[2] = base->zero; /* Z */
-               pos_args[1].out[3] = base->zero; /* W */
+               pos_args[1].out[0] = ctx->ac.f32_0; /* X */
+               pos_args[1].out[1] = ctx->ac.f32_0; /* Y */
+               pos_args[1].out[2] = ctx->ac.f32_0; /* Z */
+               pos_args[1].out[3] = ctx->ac.f32_0; /* W */
 
                if (shader->selector->info.writes_psize)
                        pos_args[1].out[0] = psize_value;
@@ -2557,7 +2647,7 @@ static void si_llvm_export_vs(struct lp_build_tgsi_context *bld_base,
                if (shader->selector->info.writes_edgeflag) {
                        /* The output is a float, but the hw expects an integer
                         * with the first bit containing the edge flag. */
-                       edgeflag_value = LLVMBuildFPToUI(ctx->gallivm.builder,
+                       edgeflag_value = LLVMBuildFPToUI(ctx->ac.builder,
                                                         edgeflag_value,
                                                         ctx->i32, "");
                        edgeflag_value = ac_build_umin(&ctx->ac,
@@ -2579,9 +2669,9 @@ static void si_llvm_export_vs(struct lp_build_tgsi_context *bld_base,
                                LLVMValueRef v = viewport_index_value;
 
                                v = ac_to_integer(&ctx->ac, v);
-                               v = LLVMBuildShl(ctx->gallivm.builder, v,
+                               v = LLVMBuildShl(ctx->ac.builder, v,
                                                 LLVMConstInt(ctx->i32, 16, 0), "");
-                               v = LLVMBuildOr(ctx->gallivm.builder, v,
+                               v = LLVMBuildOr(ctx->ac.builder, v,
                                                ac_to_integer(&ctx->ac,  pos_args[1].out[2]), "");
                                pos_args[1].out[2] = ac_to_float(&ctx->ac, v);
                                pos_args[1].enabled_channels |= 1 << 2;
@@ -2627,7 +2717,6 @@ static void si_llvm_export_vs(struct lp_build_tgsi_context *bld_base,
 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 = &ctx->gallivm;
        LLVMValueRef invocation_id, buffer, buffer_offset;
        LLVMValueRef lds_vertex_stride, lds_vertex_offset, lds_base;
        uint64_t inputs;
@@ -2637,16 +2726,16 @@ static void si_copy_tcs_inputs(struct lp_build_tgsi_context *bld_base)
        buffer_offset = LLVMGetParam(ctx->main_fn, ctx->param_tcs_offchip_offset);
 
        lds_vertex_stride = get_tcs_in_vertex_dw_stride(ctx);
-       lds_vertex_offset = LLVMBuildMul(gallivm->builder, invocation_id,
+       lds_vertex_offset = LLVMBuildMul(ctx->ac.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, "");
+       lds_base = LLVMBuildAdd(ctx->ac.builder, lds_base, lds_vertex_offset, "");
 
        inputs = ctx->shader->key.mono.u.ff_tcs_inputs_to_copy;
        while (inputs) {
                unsigned i = u_bit_scan64(&inputs);
 
-               LLVMValueRef lds_ptr = LLVMBuildAdd(gallivm->builder, lds_base,
+               LLVMValueRef lds_ptr = LLVMBuildAdd(ctx->ac.builder, lds_base,
                                            LLVMConstInt(ctx->i32, 4 * i, 0),
                                             "");
 
@@ -2671,7 +2760,6 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
                                  LLVMValueRef invoc0_tf_inner[2])
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = &ctx->gallivm;
        struct si_shader *shader = ctx->shader;
        unsigned tess_inner_index, tess_outer_index;
        LLVMValueRef lds_base, lds_inner, lds_outer, byteoffset, buffer;
@@ -2689,8 +2777,8 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
         * This can't jump, because invocation 0 executes this. It should
         * at least mask out the loads and stores for other invocations.
         */
-       lp_build_if(&if_ctx, gallivm,
-                   LLVMBuildICmp(gallivm->builder, LLVMIntEQ,
+       lp_build_if(&if_ctx, &ctx->gallivm,
+                   LLVMBuildICmp(ctx->ac.builder, LLVMIntEQ,
                                  invocation_id, ctx->i32_0, ""));
 
        /* Determine the layout of one tess factor element in the buffer. */
@@ -2734,10 +2822,10 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
                tess_outer_index = si_shader_io_get_unique_index_patch(TGSI_SEMANTIC_TESSOUTER, 0);
 
                lds_base = tcs_out_current_patch_data_offset;
-               lds_inner = LLVMBuildAdd(gallivm->builder, lds_base,
+               lds_inner = LLVMBuildAdd(ctx->ac.builder, lds_base,
                                         LLVMConstInt(ctx->i32,
                                                      tess_inner_index * 4, 0), "");
-               lds_outer = LLVMBuildAdd(gallivm->builder, lds_base,
+               lds_outer = LLVMBuildAdd(ctx->ac.builder, lds_base,
                                         LLVMConstInt(ctx->i32,
                                                      tess_outer_index * 4, 0), "");
 
@@ -2761,11 +2849,11 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
        }
 
        /* Convert the outputs to vectors for stores. */
-       vec0 = lp_build_gather_values(gallivm, out, MIN2(stride, 4));
+       vec0 = lp_build_gather_values(&ctx->gallivm, out, MIN2(stride, 4));
        vec1 = NULL;
 
        if (stride > 4)
-               vec1 = lp_build_gather_values(gallivm, out+4, stride - 4);
+               vec1 = lp_build_gather_values(&ctx->gallivm, out+4, stride - 4);
 
        /* Get the buffer. */
        buffer = desc_from_addr_base64k(ctx, ctx->param_tcs_factor_addr_base64k);
@@ -2773,11 +2861,11 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
        /* Get the offset. */
        tf_base = LLVMGetParam(ctx->main_fn,
                               ctx->param_tcs_factor_offset);
-       byteoffset = LLVMBuildMul(gallivm->builder, rel_patch_id,
+       byteoffset = LLVMBuildMul(ctx->ac.builder, rel_patch_id,
                                  LLVMConstInt(ctx->i32, 4 * stride, 0), "");
 
-       lp_build_if(&inner_if_ctx, gallivm,
-                   LLVMBuildICmp(gallivm->builder, LLVMIntEQ,
+       lp_build_if(&inner_if_ctx, &ctx->gallivm,
+                   LLVMBuildICmp(ctx->ac.builder, LLVMIntEQ,
                                  rel_patch_id, ctx->i32_0, ""));
 
        /* Store the dynamic HS control word. */
@@ -2816,7 +2904,7 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
                tf_outer_offset = get_tcs_tes_buffer_address(ctx, rel_patch_id, NULL,
                                        LLVMConstInt(ctx->i32, param_outer, 0));
 
-               outer_vec = lp_build_gather_values(gallivm, outer,
+               outer_vec = lp_build_gather_values(&ctx->gallivm, outer,
                                                   util_next_power_of_two(outer_comps));
 
                ac_build_buffer_store_dword(&ctx->ac, buf, outer_vec,
@@ -2829,7 +2917,7 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
                                        LLVMConstInt(ctx->i32, param_inner, 0));
 
                        inner_vec = inner_comps == 1 ? inner[0] :
-                                   lp_build_gather_values(gallivm, inner, inner_comps);
+                                   lp_build_gather_values(&ctx->gallivm, inner, inner_comps);
                        ac_build_buffer_store_dword(&ctx->ac, buf, inner_vec,
                                                    inner_comps, tf_inner_offset,
                                                    base, 0, 1, 0, true, false);
@@ -2843,7 +2931,7 @@ static LLVMValueRef
 si_insert_input_ret(struct si_shader_context *ctx, LLVMValueRef ret,
                    unsigned param, unsigned return_index)
 {
-       return LLVMBuildInsertValue(ctx->gallivm.builder, ret,
+       return LLVMBuildInsertValue(ctx->ac.builder, ret,
                                    LLVMGetParam(ctx->main_fn, param),
                                    return_index, "");
 }
@@ -2852,7 +2940,7 @@ static LLVMValueRef
 si_insert_input_ret_float(struct si_shader_context *ctx, LLVMValueRef ret,
                          unsigned param, unsigned return_index)
 {
-       LLVMBuilderRef builder = ctx->gallivm.builder;
+       LLVMBuilderRef builder = ctx->ac.builder;
        LLVMValueRef p = LLVMGetParam(ctx->main_fn, param);
 
        return LLVMBuildInsertValue(builder, ret,
@@ -2864,7 +2952,7 @@ static LLVMValueRef
 si_insert_input_ptr_as_2xi32(struct si_shader_context *ctx, LLVMValueRef ret,
                             unsigned param, unsigned return_index)
 {
-       LLVMBuilderRef builder = ctx->gallivm.builder;
+       LLVMBuilderRef builder = ctx->ac.builder;
        LLVMValueRef ptr, lo, hi;
 
        ptr = LLVMGetParam(ctx->main_fn, param);
@@ -2880,7 +2968,7 @@ si_insert_input_ptr_as_2xi32(struct si_shader_context *ctx, LLVMValueRef ret,
 static void si_llvm_emit_tcs_epilogue(struct lp_build_tgsi_context *bld_base)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       LLVMBuilderRef builder = ctx->gallivm.builder;
+       LLVMBuilderRef builder = ctx->ac.builder;
        LLVMValueRef rel_patch_id, invocation_id, tf_lds_offset;
 
        si_copy_tcs_inputs(bld_base);
@@ -2974,11 +3062,13 @@ static void si_set_ls_return_value_for_tcs(struct si_shader_context *ctx)
 {
        LLVMValueRef ret = ctx->return_value;
 
-       ret = si_insert_input_ptr_as_2xi32(ctx, ret, ctx->param_rw_buffers, 0);
        ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_offchip_offset, 2);
        ret = si_insert_input_ret(ctx, ret, ctx->param_merged_wave_info, 3);
        ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_factor_offset, 4);
        ret = si_insert_input_ret(ctx, ret, ctx->param_merged_scratch_offset, 5);
+
+       ret = si_insert_input_ptr_as_2xi32(ctx, ret, ctx->param_rw_buffers,
+                                          8 + SI_SGPR_RW_BUFFERS);
        ret = si_insert_input_ptr_as_2xi32(ctx, ret,
                ctx->param_bindless_samplers_and_images,
                8 + SI_SGPR_BINDLESS_SAMPLERS_AND_IMAGES);
@@ -3015,11 +3105,12 @@ static void si_set_es_return_value_for_gs(struct si_shader_context *ctx)
 {
        LLVMValueRef ret = ctx->return_value;
 
-       ret = si_insert_input_ptr_as_2xi32(ctx, ret, ctx->param_rw_buffers, 0);
        ret = si_insert_input_ret(ctx, ret, ctx->param_gs2vs_offset, 2);
        ret = si_insert_input_ret(ctx, ret, ctx->param_merged_wave_info, 3);
-
        ret = si_insert_input_ret(ctx, ret, ctx->param_merged_scratch_offset, 5);
+
+       ret = si_insert_input_ptr_as_2xi32(ctx, ret, ctx->param_rw_buffers,
+                                          8 + SI_SGPR_RW_BUFFERS);
        ret = si_insert_input_ptr_as_2xi32(ctx, ret,
                ctx->param_bindless_samplers_and_images,
                8 + SI_SGPR_BINDLESS_SAMPLERS_AND_IMAGES);
@@ -3043,12 +3134,11 @@ 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 = &ctx->gallivm;
        unsigned i, chan;
        LLVMValueRef vertex_id = LLVMGetParam(ctx->main_fn,
                                              ctx->param_rel_auto_id);
        LLVMValueRef vertex_dw_stride = get_tcs_in_vertex_dw_stride(ctx);
-       LLVMValueRef base_dw_addr = LLVMBuildMul(gallivm->builder, vertex_id,
+       LLVMValueRef base_dw_addr = LLVMBuildMul(ctx->ac.builder, vertex_id,
                                                 vertex_dw_stride, "");
 
        /* Write outputs to LDS. The next shader (TCS aka HS) will read
@@ -3078,12 +3168,15 @@ static void si_llvm_emit_ls_epilogue(struct lp_build_tgsi_context *bld_base)
                        continue;
 
                int param = si_shader_io_get_unique_index(name, index);
-               LLVMValueRef dw_addr = LLVMBuildAdd(gallivm->builder, base_dw_addr,
+               LLVMValueRef dw_addr = LLVMBuildAdd(ctx->ac.builder, base_dw_addr,
                                        LLVMConstInt(ctx->i32, param * 4, 0), "");
 
                for (chan = 0; chan < 4; chan++) {
+                       if (!(info->output_usagemask[i] & (1 << chan)))
+                               continue;
+
                        lds_store(bld_base, chan, dw_addr,
-                                 LLVMBuildLoad(gallivm->builder, out_ptr[chan], ""));
+                                 LLVMBuildLoad(ctx->ac.builder, out_ptr[chan], ""));
                }
        }
 
@@ -3094,7 +3187,6 @@ static void si_llvm_emit_ls_epilogue(struct lp_build_tgsi_context *bld_base)
 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 = &ctx->gallivm;
        struct si_shader *es = ctx->shader;
        struct tgsi_shader_info *info = &es->selector->info;
        LLVMValueRef soffset = LLVMGetParam(ctx->main_fn,
@@ -3107,10 +3199,10 @@ static void si_llvm_emit_es_epilogue(struct lp_build_tgsi_context *bld_base)
                unsigned itemsize_dw = es->selector->esgs_itemsize / 4;
                LLVMValueRef vertex_idx = ac_get_thread_id(&ctx->ac);
                LLVMValueRef wave_idx = unpack_param(ctx, ctx->param_merged_wave_info, 24, 4);
-               vertex_idx = LLVMBuildOr(gallivm->builder, vertex_idx,
-                                        LLVMBuildMul(gallivm->builder, wave_idx,
+               vertex_idx = LLVMBuildOr(ctx->ac.builder, vertex_idx,
+                                        LLVMBuildMul(ctx->ac.builder, wave_idx,
                                                      LLVMConstInt(ctx->i32, 64, false), ""), "");
-               lds_base = LLVMBuildMul(gallivm->builder, vertex_idx,
+               lds_base = LLVMBuildMul(ctx->ac.builder, vertex_idx,
                                        LLVMConstInt(ctx->i32, itemsize_dw, 0), "");
        }
 
@@ -3126,7 +3218,7 @@ static void si_llvm_emit_es_epilogue(struct lp_build_tgsi_context *bld_base)
                                                      info->output_semantic_index[i]);
 
                for (chan = 0; chan < 4; chan++) {
-                       LLVMValueRef out_val = LLVMBuildLoad(gallivm->builder, out_ptr[chan], "");
+                       LLVMValueRef out_val = LLVMBuildLoad(ctx->ac.builder, out_ptr[chan], "");
                        out_val = ac_to_integer(&ctx->ac, out_val);
 
                        /* GFX9 has the ESGS ring in LDS. */
@@ -3171,7 +3263,6 @@ static void si_llvm_emit_vs_epilogue(struct ac_shader_abi *abi,
                                     LLVMValueRef *addrs)
 {
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
-       struct gallivm_state *gallivm = &ctx->gallivm;
        struct tgsi_shader_info *info = &ctx->shader->selector->info;
        struct si_shader_output_values *outputs = NULL;
        int i,j;
@@ -3202,16 +3293,16 @@ static void si_llvm_emit_vs_epilogue(struct ac_shader_abi *abi,
                                /* The state is in the first bit of the user SGPR. */
                                cond = LLVMGetParam(ctx->main_fn,
                                                    ctx->param_vs_state_bits);
-                               cond = LLVMBuildTrunc(gallivm->builder, cond,
+                               cond = LLVMBuildTrunc(ctx->ac.builder, cond,
                                                      ctx->i1, "");
-                               lp_build_if(&if_ctx, gallivm, cond);
+                               lp_build_if(&if_ctx, &ctx->gallivm, cond);
                        }
 
                        for (j = 0; j < 4; j++) {
                                addr = addrs[4 * i + j];
-                               val = LLVMBuildLoad(gallivm->builder, addr, "");
+                               val = LLVMBuildLoad(ctx->ac.builder, addr, "");
                                val = ac_build_clamp(&ctx->ac, val);
-                               LLVMBuildStore(gallivm->builder, val, addr);
+                               LLVMBuildStore(ctx->ac.builder, val, addr);
                        }
                }
 
@@ -3225,7 +3316,7 @@ static void si_llvm_emit_vs_epilogue(struct ac_shader_abi *abi,
 
                for (j = 0; j < 4; j++) {
                        outputs[i].values[j] =
-                               LLVMBuildLoad(gallivm->builder,
+                               LLVMBuildLoad(ctx->ac.builder,
                                              addrs[4 * i + j],
                                              "");
                        outputs[i].vertex_stream[j] =
@@ -3249,7 +3340,7 @@ static void si_llvm_emit_vs_epilogue(struct ac_shader_abi *abi,
                i++;
        }
 
-       si_llvm_export_vs(&ctx->bld_base, outputs, i);
+       si_llvm_export_vs(ctx, outputs, i);
        FREE(outputs);
 }
 
@@ -3318,7 +3409,7 @@ static void si_export_mrt_z(struct lp_build_tgsi_context *bld_base,
                if (stencil) {
                        /* Stencil should be in X[23:16]. */
                        stencil = ac_to_integer(&ctx->ac, stencil);
-                       stencil = LLVMBuildShl(ctx->gallivm.builder, stencil,
+                       stencil = LLVMBuildShl(ctx->ac.builder, stencil,
                                               LLVMConstInt(ctx->i32, 16, 0), "");
                        args.out[0] = ac_to_float(&ctx->ac, stencil);
                        mask |= 0x3;
@@ -3362,7 +3453,6 @@ static void si_export_mrt_color(struct lp_build_tgsi_context *bld_base,
                                bool is_last, struct si_ps_exports *exp)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct lp_build_context *base = &bld_base->base;
        int i;
 
        /* Clamp color */
@@ -3372,7 +3462,7 @@ static void si_export_mrt_color(struct lp_build_tgsi_context *bld_base,
 
        /* Alpha to one */
        if (ctx->shader->key.part.ps.epilog.alpha_to_one)
-               color[3] = base->one;
+               color[3] = ctx->ac.f32_1;
 
        /* Alpha test */
        if (index == 0 &&
@@ -3391,7 +3481,7 @@ static void si_export_mrt_color(struct lp_build_tgsi_context *bld_base,
 
                /* Get the export arguments, also find out what the last one is. */
                for (c = 0; c <= ctx->shader->key.part.ps.epilog.last_cbuf; c++) {
-                       si_llvm_init_export_args(bld_base, color,
+                       si_llvm_init_export_args(ctx, color,
                                                 V_008DFC_SQ_EXP_MRT + c, &args[c]);
                        if (args[c].enabled_channels)
                                last = c;
@@ -3411,7 +3501,7 @@ static void si_export_mrt_color(struct lp_build_tgsi_context *bld_base,
                struct ac_export_args args;
 
                /* Export */
-               si_llvm_init_export_args(bld_base, color, V_008DFC_SQ_EXP_MRT + index,
+               si_llvm_init_export_args(ctx, color, V_008DFC_SQ_EXP_MRT + index,
                                         &args);
                if (is_last) {
                        args.valid_mask = 1; /* whether the EXEC mask is valid */
@@ -3469,7 +3559,7 @@ static void si_llvm_return_fs_outputs(struct ac_shader_abi *abi,
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
        struct si_shader *shader = ctx->shader;
        struct tgsi_shader_info *info = &shader->selector->info;
-       LLVMBuilderRef builder = ctx->gallivm.builder;
+       LLVMBuilderRef builder = ctx->ac.builder;
        unsigned i, j, first_vgpr, vgpr;
 
        LLVMValueRef color[8][4] = {};
@@ -3477,7 +3567,7 @@ static void si_llvm_return_fs_outputs(struct ac_shader_abi *abi,
        LLVMValueRef ret;
 
        if (ctx->postponed_kill)
-               ac_build_kill(&ctx->ac, LLVMBuildLoad(builder, ctx->postponed_kill, ""));
+               ac_build_kill_if_false(&ctx->ac, LLVMBuildLoad(builder, ctx->postponed_kill, ""));
 
        /* Read the output values. */
        for (i = 0; i < info->num_outputs; i++) {
@@ -3549,12 +3639,10 @@ static void si_llvm_return_fs_outputs(struct ac_shader_abi *abi,
 
 void si_emit_waitcnt(struct si_shader_context *ctx, unsigned simm16)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
-       LLVMBuilderRef builder = gallivm->builder;
        LLVMValueRef args[1] = {
                LLVMConstInt(ctx->i32, simm16, 0)
        };
-       lp_build_intrinsic(builder, "llvm.amdgcn.s.waitcnt",
+       lp_build_intrinsic(ctx->ac.builder, "llvm.amdgcn.s.waitcnt",
                           ctx->voidt, args, 1, 0);
 }
 
@@ -3589,17 +3677,16 @@ static void clock_emit(
                struct lp_build_emit_data *emit_data)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = &ctx->gallivm;
        LLVMValueRef tmp;
 
-       tmp = lp_build_intrinsic(gallivm->builder, "llvm.readcyclecounter",
+       tmp = lp_build_intrinsic(ctx->ac.builder, "llvm.readcyclecounter",
                                 ctx->i64, NULL, 0, 0);
-       tmp = LLVMBuildBitCast(gallivm->builder, tmp, ctx->v2i32, "");
+       tmp = LLVMBuildBitCast(ctx->ac.builder, tmp, ctx->v2i32, "");
 
        emit_data->output[0] =
-               LLVMBuildExtractElement(gallivm->builder, tmp, ctx->i32_0, "");
+               LLVMBuildExtractElement(ctx->ac.builder, tmp, ctx->i32_0, "");
        emit_data->output[1] =
-               LLVMBuildExtractElement(gallivm->builder, tmp, ctx->i32_1, "");
+               LLVMBuildExtractElement(ctx->ac.builder, tmp, ctx->i32_1, "");
 }
 
 LLVMTypeRef si_const_array(LLVMTypeRef elem_type, int num_elements)
@@ -3644,18 +3731,17 @@ static LLVMValueRef si_llvm_emit_ddxy_interp(
        LLVMValueRef interp_ij)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = &ctx->gallivm;
        LLVMValueRef result[4], a;
        unsigned i;
 
        for (i = 0; i < 2; i++) {
-               a = LLVMBuildExtractElement(gallivm->builder, interp_ij,
+               a = LLVMBuildExtractElement(ctx->ac.builder, interp_ij,
                                            LLVMConstInt(ctx->i32, i, 0), "");
                result[i] = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_DDX, a);
                result[2+i] = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_DDY, a);
        }
 
-       return lp_build_gather_values(gallivm, result, 4);
+       return lp_build_gather_values(&ctx->gallivm, result, 4);
 }
 
 static void interp_fetch_args(
@@ -3663,7 +3749,6 @@ static void interp_fetch_args(
        struct lp_build_emit_data *emit_data)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = &ctx->gallivm;
        const struct tgsi_full_instruction *inst = emit_data->inst;
 
        if (inst->Instruction.Opcode == TGSI_OPCODE_INTERP_OFFSET) {
@@ -3709,20 +3794,20 @@ static void interp_fetch_args(
                                ctx->ac.f32_0,
                        };
 
-                       sample_position = lp_build_gather_values(gallivm, center, 4);
+                       sample_position = lp_build_gather_values(&ctx->gallivm, center, 4);
                } else {
                        sample_position = load_sample_position(ctx, sample_id);
                }
 
-               emit_data->args[0] = LLVMBuildExtractElement(gallivm->builder,
+               emit_data->args[0] = LLVMBuildExtractElement(ctx->ac.builder,
                                                             sample_position,
                                                             ctx->i32_0, "");
 
-               emit_data->args[0] = LLVMBuildFSub(gallivm->builder, emit_data->args[0], halfval, "");
-               emit_data->args[1] = LLVMBuildExtractElement(gallivm->builder,
+               emit_data->args[0] = LLVMBuildFSub(ctx->ac.builder, emit_data->args[0], halfval, "");
+               emit_data->args[1] = LLVMBuildExtractElement(ctx->ac.builder,
                                                             sample_position,
                                                             ctx->i32_1, "");
-               emit_data->args[1] = LLVMBuildFSub(gallivm->builder, emit_data->args[1], halfval, "");
+               emit_data->args[1] = LLVMBuildFSub(ctx->ac.builder, emit_data->args[1], halfval, "");
                emit_data->arg_count = 2;
        }
 }
@@ -3733,7 +3818,6 @@ 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 = &ctx->gallivm;
        const struct tgsi_shader_info *info = &shader->selector->info;
        LLVMValueRef interp_param;
        const struct tgsi_full_instruction *inst = emit_data->inst;
@@ -3800,25 +3884,25 @@ static void build_interp_intrinsic(const struct lp_build_tgsi_action *action,
                for (i = 0; i < 2; i++) {
                        LLVMValueRef ix_ll = LLVMConstInt(ctx->i32, i, 0);
                        LLVMValueRef iy_ll = LLVMConstInt(ctx->i32, i + 2, 0);
-                       LLVMValueRef ddx_el = LLVMBuildExtractElement(gallivm->builder,
+                       LLVMValueRef ddx_el = LLVMBuildExtractElement(ctx->ac.builder,
                                                                      ddxy_out, ix_ll, "");
-                       LLVMValueRef ddy_el = LLVMBuildExtractElement(gallivm->builder,
+                       LLVMValueRef ddy_el = LLVMBuildExtractElement(ctx->ac.builder,
                                                                      ddxy_out, iy_ll, "");
-                       LLVMValueRef interp_el = LLVMBuildExtractElement(gallivm->builder,
+                       LLVMValueRef interp_el = LLVMBuildExtractElement(ctx->ac.builder,
                                                                         interp_param, ix_ll, "");
                        LLVMValueRef temp1, temp2;
 
                        interp_el = ac_to_float(&ctx->ac, interp_el);
 
-                       temp1 = LLVMBuildFMul(gallivm->builder, ddx_el, emit_data->args[0], "");
+                       temp1 = LLVMBuildFMul(ctx->ac.builder, ddx_el, emit_data->args[0], "");
 
-                       temp1 = LLVMBuildFAdd(gallivm->builder, temp1, interp_el, "");
+                       temp1 = LLVMBuildFAdd(ctx->ac.builder, temp1, interp_el, "");
 
-                       temp2 = LLVMBuildFMul(gallivm->builder, ddy_el, emit_data->args[1], "");
+                       temp2 = LLVMBuildFMul(ctx->ac.builder, ddy_el, emit_data->args[1], "");
 
-                       ij_out[i] = LLVMBuildFAdd(gallivm->builder, temp2, temp1, "");
+                       ij_out[i] = LLVMBuildFAdd(ctx->ac.builder, temp2, temp1, "");
                }
-               interp_param = lp_build_gather_values(gallivm, ij_out, 2);
+               interp_param = lp_build_gather_values(&ctx->gallivm, ij_out, 2);
        }
 
        if (interp_param)
@@ -3833,19 +3917,19 @@ static void build_interp_intrinsic(const struct lp_build_tgsi_action *action,
 
                        if (interp_param) {
                                i = LLVMBuildExtractElement(
-                                       gallivm->builder, interp_param, ctx->i32_0, "");
+                                       ctx->ac.builder, interp_param, ctx->i32_0, "");
                                j = LLVMBuildExtractElement(
-                                       gallivm->builder, interp_param, ctx->i32_1, "");
+                                       ctx->ac.builder, interp_param, ctx->i32_1, "");
                        }
                        v = si_build_fs_interp(ctx, input_base + idx, schan,
                                               prim_mask, i, j);
 
-                       gather = LLVMBuildInsertElement(gallivm->builder,
+                       gather = LLVMBuildInsertElement(ctx->ac.builder,
                                gather, v, LLVMConstInt(ctx->i32, idx, false), "");
                }
 
                emit_data->output[chan] = LLVMBuildExtractElement(
-                       gallivm->builder, gather, array_idx, "");
+                       ctx->ac.builder, gather, array_idx, "");
        }
 }
 
@@ -3855,11 +3939,10 @@ static void vote_all_emit(
        struct lp_build_emit_data *emit_data)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = &ctx->gallivm;
 
         LLVMValueRef tmp = ac_build_vote_all(&ctx->ac, emit_data->args[0]);
        emit_data->output[emit_data->chan] =
-               LLVMBuildSExt(gallivm->builder, tmp, ctx->i32, "");
+               LLVMBuildSExt(ctx->ac.builder, tmp, ctx->i32, "");
 }
 
 static void vote_any_emit(
@@ -3868,11 +3951,10 @@ static void vote_any_emit(
        struct lp_build_emit_data *emit_data)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = &ctx->gallivm;
 
         LLVMValueRef tmp = ac_build_vote_any(&ctx->ac, emit_data->args[0]);
        emit_data->output[emit_data->chan] =
-               LLVMBuildSExt(gallivm->builder, tmp, ctx->i32, "");
+               LLVMBuildSExt(ctx->ac.builder, tmp, ctx->i32, "");
 }
 
 static void vote_eq_emit(
@@ -3881,11 +3963,10 @@ static void vote_eq_emit(
        struct lp_build_emit_data *emit_data)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = &ctx->gallivm;
 
         LLVMValueRef tmp = ac_build_vote_eq(&ctx->ac, emit_data->args[0]);
        emit_data->output[emit_data->chan] =
-               LLVMBuildSExt(gallivm->builder, tmp, ctx->i32, "");
+               LLVMBuildSExt(ctx->ac.builder, tmp, ctx->i32, "");
 }
 
 static void ballot_emit(
@@ -3894,7 +3975,7 @@ static void ballot_emit(
        struct lp_build_emit_data *emit_data)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       LLVMBuilderRef builder = ctx->gallivm.builder;
+       LLVMBuilderRef builder = ctx->ac.builder;
        LLVMValueRef tmp;
 
        tmp = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_X);
@@ -3956,29 +4037,24 @@ static unsigned si_llvm_get_stream(struct lp_build_tgsi_context *bld_base,
 }
 
 /* Emit one vertex from the geometry shader */
-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)
+static void si_llvm_emit_vertex(struct ac_shader_abi *abi,
+                               unsigned stream,
+                               LLVMValueRef *addrs)
 {
-       struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct lp_build_context *uint = &bld_base->uint_bld;
+       struct si_shader_context *ctx = si_shader_context_from_abi(abi);
+       struct tgsi_shader_info *info = &ctx->shader->selector->info;
+       struct lp_build_context *uint = &ctx->bld_base.uint_bld;
        struct si_shader *shader = ctx->shader;
-       struct tgsi_shader_info *info = &shader->selector->info;
-       struct gallivm_state *gallivm = &ctx->gallivm;
        struct lp_build_if_state if_state;
        LLVMValueRef soffset = LLVMGetParam(ctx->main_fn,
                                            ctx->param_gs2vs_offset);
        LLVMValueRef gs_next_vertex;
-       LLVMValueRef can_emit, kill;
+       LLVMValueRef can_emit;
        unsigned chan, offset;
        int i;
-       unsigned stream;
-
-       stream = si_llvm_get_stream(bld_base, emit_data);
 
        /* Write vertex attribute values to GSVS ring */
-       gs_next_vertex = LLVMBuildLoad(gallivm->builder,
+       gs_next_vertex = LLVMBuildLoad(ctx->ac.builder,
                                       ctx->gs_next_vertex[stream],
                                       "");
 
@@ -3990,31 +4066,25 @@ static void si_llvm_emit_vertex(
         * further memory loads and may allow LLVM to skip to the end
         * altogether.
         */
-       can_emit = LLVMBuildICmp(gallivm->builder, LLVMIntULT, gs_next_vertex,
+       can_emit = LLVMBuildICmp(ctx->ac.builder, LLVMIntULT, gs_next_vertex,
                                 LLVMConstInt(ctx->i32,
                                              shader->selector->gs_max_out_vertices, 0), "");
 
        bool use_kill = !info->writes_memory;
        if (use_kill) {
-               kill = lp_build_select(&bld_base->base, can_emit,
-                                      LLVMConstReal(ctx->f32, 1.0f),
-                                      LLVMConstReal(ctx->f32, -1.0f));
-
-               ac_build_kill(&ctx->ac, kill);
+               ac_build_kill_if_false(&ctx->ac, can_emit);
        } else {
-               lp_build_if(&if_state, gallivm, can_emit);
+               lp_build_if(&if_state, &ctx->gallivm, can_emit);
        }
 
        offset = 0;
        for (i = 0; i < info->num_outputs; i++) {
-               LLVMValueRef *out_ptr = ctx->outputs[i];
-
                for (chan = 0; chan < 4; chan++) {
                        if (!(info->output_usagemask[i] & (1 << chan)) ||
                            ((info->output_streams[i] >> (2 * chan)) & 3) != stream)
                                continue;
 
-                       LLVMValueRef out_val = LLVMBuildLoad(gallivm->builder, out_ptr[chan], "");
+                       LLVMValueRef out_val = LLVMBuildLoad(ctx->ac.builder, addrs[4 * i + chan], "");
                        LLVMValueRef voffset =
                                LLVMConstInt(ctx->i32, offset *
                                             shader->selector->gs_max_out_vertices, 0);
@@ -4036,7 +4106,7 @@ static void si_llvm_emit_vertex(
        gs_next_vertex = lp_build_add(uint, gs_next_vertex,
                                      ctx->i32_1);
 
-       LLVMBuildStore(gallivm->builder, gs_next_vertex, ctx->gs_next_vertex[stream]);
+       LLVMBuildStore(ctx->ac.builder, gs_next_vertex, ctx->gs_next_vertex[stream]);
 
        /* Signal vertex emission */
        ac_build_sendmsg(&ctx->ac, AC_SENDMSG_GS_OP_EMIT | AC_SENDMSG_GS | (stream << 8),
@@ -4045,6 +4115,18 @@ static void si_llvm_emit_vertex(
                lp_build_endif(&if_state);
 }
 
+/* Emit one vertex from the geometry shader */
+static void si_tgsi_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);
+       unsigned stream = si_llvm_get_stream(bld_base, emit_data);
+
+       si_llvm_emit_vertex(&ctx->abi, stream, ctx->outputs[0]);
+}
+
 /* Cut one primitive from the geometry shader */
 static void si_llvm_emit_primitive(
        const struct lp_build_tgsi_action *action,
@@ -4065,7 +4147,6 @@ static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
                                 struct lp_build_emit_data *emit_data)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       struct gallivm_state *gallivm = &ctx->gallivm;
 
        /* SI only (thanks to a hw bug workaround):
         * The real barrier instruction isn’t needed, because an entire patch
@@ -4077,7 +4158,7 @@ static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
                return;
        }
 
-       lp_build_intrinsic(gallivm->builder,
+       lp_build_intrinsic(ctx->ac.builder,
                           "llvm.amdgcn.s.barrier",
                           ctx->voidt, NULL, 0, LP_FUNC_ATTR_CONVERGENT);
 }
@@ -4130,7 +4211,7 @@ static void si_create_function(struct si_shader_context *ctx,
                                           "no-signed-zeros-fp-math",
                                           "true");
 
-       if (ctx->screen->b.debug_flags & DBG_UNSAFE_MATH) {
+       if (ctx->screen->b.debug_flags & DBG(UNSAFE_MATH)) {
                /* These were copied from some LLVM test. */
                LLVMAddTargetDependentFunctionAttr(ctx->main_fn,
                                                   "less-precise-fpmad",
@@ -4171,16 +4252,6 @@ static void declare_streamout_params(struct si_shader_context *ctx,
        }
 }
 
-static void declare_lds_as_pointer(struct si_shader_context *ctx)
-{
-       struct gallivm_state *gallivm = &ctx->gallivm;
-
-       unsigned lds_size = ctx->screen->b.chip_class >= CIK ? 65536 : 32768;
-       ctx->lds = LLVMBuildIntToPtr(gallivm->builder, ctx->i32_0,
-               LLVMPointerType(LLVMArrayType(ctx->i32, lds_size / 4), LOCAL_ADDR_SPACE),
-               "lds");
-}
-
 static unsigned si_get_max_workgroup_size(const struct si_shader *shader)
 {
        switch (shader->selector->type) {
@@ -4218,10 +4289,18 @@ static void declare_per_stage_desc_pointers(struct si_shader_context *ctx,
                                            struct si_function_info *fninfo,
                                            bool assign_params)
 {
+       LLVMTypeRef const_shader_buf_type;
+
+       if (ctx->shader->selector->info.const_buffers_declared == 1 &&
+           ctx->shader->selector->info.shader_buffers_declared == 0)
+               const_shader_buf_type = ctx->f32;
+       else
+               const_shader_buf_type = ctx->v4i32;
+
        unsigned const_and_shader_buffers =
                add_arg(fninfo, ARG_SGPR,
-                       si_const_array(ctx->v4i32,
-                                      SI_NUM_SHADER_BUFFERS + SI_NUM_CONST_BUFFERS));
+                       si_const_array(const_shader_buf_type, 0));
+
        unsigned samplers_and_images =
                add_arg(fninfo, ARG_SGPR,
                        si_const_array(ctx->v8i32,
@@ -4233,14 +4312,13 @@ static void declare_per_stage_desc_pointers(struct si_shader_context *ctx,
        }
 }
 
-static void declare_default_desc_pointers(struct si_shader_context *ctx,
-                                         struct si_function_info *fninfo)
+static void declare_global_desc_pointers(struct si_shader_context *ctx,
+                                        struct si_function_info *fninfo)
 {
        ctx->param_rw_buffers = add_arg(fninfo, ARG_SGPR,
                si_const_array(ctx->v4i32, SI_NUM_RW_BUFFERS));
        ctx->param_bindless_samplers_and_images = add_arg(fninfo, ARG_SGPR,
                si_const_array(ctx->v8i32, 0));
-       declare_per_stage_desc_pointers(ctx, fninfo, true);
 }
 
 static void declare_vs_specific_input_sgprs(struct si_shader_context *ctx,
@@ -4303,6 +4381,8 @@ static void create_function(struct si_shader_context *ctx)
        unsigned num_returns = 0;
        unsigned num_prolog_vgprs = 0;
        unsigned type = ctx->type;
+       unsigned vs_blit_property =
+               shader->selector->info.properties[TGSI_PROPERTY_VS_BLIT_SGPRS];
 
        si_init_function_info(&fninfo);
 
@@ -4318,7 +4398,34 @@ static void create_function(struct si_shader_context *ctx)
 
        switch (type) {
        case PIPE_SHADER_VERTEX:
-               declare_default_desc_pointers(ctx, &fninfo);
+               declare_global_desc_pointers(ctx, &fninfo);
+
+               if (vs_blit_property) {
+                       ctx->param_vs_blit_inputs = fninfo.num_params;
+                       add_arg(&fninfo, ARG_SGPR, ctx->i32); /* i16 x1, y1 */
+                       add_arg(&fninfo, ARG_SGPR, ctx->i32); /* i16 x2, y2 */
+                       add_arg(&fninfo, ARG_SGPR, ctx->f32); /* depth */
+
+                       if (vs_blit_property == SI_VS_BLIT_SGPRS_POS_COLOR) {
+                               add_arg(&fninfo, ARG_SGPR, ctx->f32); /* color0 */
+                               add_arg(&fninfo, ARG_SGPR, ctx->f32); /* color1 */
+                               add_arg(&fninfo, ARG_SGPR, ctx->f32); /* color2 */
+                               add_arg(&fninfo, ARG_SGPR, ctx->f32); /* color3 */
+                       } else if (vs_blit_property == SI_VS_BLIT_SGPRS_POS_TEXCOORD) {
+                               add_arg(&fninfo, ARG_SGPR, ctx->f32); /* texcoord.x1 */
+                               add_arg(&fninfo, ARG_SGPR, ctx->f32); /* texcoord.y1 */
+                               add_arg(&fninfo, ARG_SGPR, ctx->f32); /* texcoord.x2 */
+                               add_arg(&fninfo, ARG_SGPR, ctx->f32); /* texcoord.y2 */
+                               add_arg(&fninfo, ARG_SGPR, ctx->f32); /* texcoord.z */
+                               add_arg(&fninfo, ARG_SGPR, ctx->f32); /* texcoord.w */
+                       }
+
+                       /* VGPRs */
+                       declare_vs_input_vgprs(ctx, &fninfo, &num_prolog_vgprs);
+                       break;
+               }
+
+               declare_per_stage_desc_pointers(ctx, &fninfo, true);
                declare_vs_specific_input_sgprs(ctx, &fninfo);
 
                if (shader->key.as_es) {
@@ -4343,7 +4450,8 @@ static void create_function(struct si_shader_context *ctx)
                break;
 
        case PIPE_SHADER_TESS_CTRL: /* SI-CI-VI */
-               declare_default_desc_pointers(ctx, &fninfo);
+               declare_global_desc_pointers(ctx, &fninfo);
+               declare_per_stage_desc_pointers(ctx, &fninfo, true);
                ctx->param_tcs_offchip_layout = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_tcs_out_lds_offsets = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_tcs_out_lds_layout = add_arg(&fninfo, ARG_SGPR, ctx->i32);
@@ -4368,8 +4476,8 @@ static void create_function(struct si_shader_context *ctx)
 
        case SI_SHADER_MERGED_VERTEX_TESSCTRL:
                /* Merged stages have 8 system SGPRs at the beginning. */
-               ctx->param_rw_buffers = /* SPI_SHADER_USER_DATA_ADDR_LO_HS */
-                       add_arg(&fninfo, ARG_SGPR, si_const_array(ctx->v4i32, SI_NUM_RW_BUFFERS));
+               add_arg(&fninfo, ARG_SGPR, ctx->i32); /* SPI_SHADER_USER_DATA_ADDR_LO_HS */
+               add_arg(&fninfo, ARG_SGPR, ctx->i32); /* SPI_SHADER_USER_DATA_ADDR_HI_HS */
                ctx->param_tcs_offchip_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_merged_wave_info = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_tcs_factor_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
@@ -4377,12 +4485,7 @@ static void create_function(struct si_shader_context *ctx)
                add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused */
                add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused */
 
-               add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused */
-               add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused */
-
-               ctx->param_bindless_samplers_and_images =
-                       add_arg(&fninfo, ARG_SGPR, si_const_array(ctx->v8i32, 0));
-
+               declare_global_desc_pointers(ctx, &fninfo);
                declare_per_stage_desc_pointers(ctx, &fninfo,
                                                ctx->type == PIPE_SHADER_VERTEX);
                declare_vs_specific_input_sgprs(ctx, &fninfo);
@@ -4426,8 +4529,8 @@ static void create_function(struct si_shader_context *ctx)
 
        case SI_SHADER_MERGED_VERTEX_OR_TESSEVAL_GEOMETRY:
                /* Merged stages have 8 system SGPRs at the beginning. */
-               ctx->param_rw_buffers = /* SPI_SHADER_USER_DATA_ADDR_LO_GS */
-                       add_arg(&fninfo, ARG_SGPR, si_const_array(ctx->v4i32, SI_NUM_RW_BUFFERS));
+               add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused (SPI_SHADER_USER_DATA_ADDR_LO_GS) */
+               add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused (SPI_SHADER_USER_DATA_ADDR_HI_GS) */
                ctx->param_gs2vs_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_merged_wave_info = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_tcs_offchip_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
@@ -4435,12 +4538,7 @@ static void create_function(struct si_shader_context *ctx)
                add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused (SPI_SHADER_PGM_LO/HI_GS << 8) */
                add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused (SPI_SHADER_PGM_LO/HI_GS >> 24) */
 
-               add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused */
-               add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused */
-
-               ctx->param_bindless_samplers_and_images =
-                       add_arg(&fninfo, ARG_SGPR, si_const_array(ctx->v8i32, 0));
-
+               declare_global_desc_pointers(ctx, &fninfo);
                declare_per_stage_desc_pointers(ctx, &fninfo,
                                                (ctx->type == PIPE_SHADER_VERTEX ||
                                                 ctx->type == PIPE_SHADER_TESS_EVAL));
@@ -4463,8 +4561,8 @@ static void create_function(struct si_shader_context *ctx)
                /* VGPRs (first GS, then VS/TES) */
                ctx->param_gs_vtx01_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
                ctx->param_gs_vtx23_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
-               ctx->param_gs_prim_id = add_arg(&fninfo, ARG_VGPR, ctx->i32);
-               ctx->param_gs_instance_id = add_arg(&fninfo, ARG_VGPR, ctx->i32);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->abi.gs_prim_id);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->abi.gs_invocation_id);
                ctx->param_gs_vtx45_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
 
                if (ctx->type == PIPE_SHADER_VERTEX) {
@@ -4485,7 +4583,8 @@ static void create_function(struct si_shader_context *ctx)
                break;
 
        case PIPE_SHADER_TESS_EVAL:
-               declare_default_desc_pointers(ctx, &fninfo);
+               declare_global_desc_pointers(ctx, &fninfo);
+               declare_per_stage_desc_pointers(ctx, &fninfo, true);
                ctx->param_tcs_offchip_layout = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_tcs_offchip_addr_base64k = add_arg(&fninfo, ARG_SGPR, ctx->i32);
 
@@ -4505,23 +4604,25 @@ static void create_function(struct si_shader_context *ctx)
                break;
 
        case PIPE_SHADER_GEOMETRY:
-               declare_default_desc_pointers(ctx, &fninfo);
+               declare_global_desc_pointers(ctx, &fninfo);
+               declare_per_stage_desc_pointers(ctx, &fninfo, true);
                ctx->param_gs2vs_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_gs_wave_id = add_arg(&fninfo, ARG_SGPR, ctx->i32);
 
                /* VGPRs */
-               ctx->param_gs_vtx0_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
-               ctx->param_gs_vtx1_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
-               ctx->param_gs_prim_id = add_arg(&fninfo, ARG_VGPR, ctx->i32);
-               ctx->param_gs_vtx2_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
-               ctx->param_gs_vtx3_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
-               ctx->param_gs_vtx4_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
-               ctx->param_gs_vtx5_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
-               ctx->param_gs_instance_id = add_arg(&fninfo, ARG_VGPR, ctx->i32);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->gs_vtx_offset[0]);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->gs_vtx_offset[1]);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->abi.gs_prim_id);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->gs_vtx_offset[2]);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->gs_vtx_offset[3]);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->gs_vtx_offset[4]);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->gs_vtx_offset[5]);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->abi.gs_invocation_id);
                break;
 
        case PIPE_SHADER_FRAGMENT:
-               declare_default_desc_pointers(ctx, &fninfo);
+               declare_global_desc_pointers(ctx, &fninfo);
+               declare_per_stage_desc_pointers(ctx, &fninfo, true);
                add_arg_checked(&fninfo, ARG_SGPR, ctx->f32, SI_PARAM_ALPHA_REF);
                add_arg_checked(&fninfo, ARG_SGPR, ctx->i32, SI_PARAM_PRIM_MASK);
 
@@ -4584,7 +4685,8 @@ static void create_function(struct si_shader_context *ctx)
                break;
 
        case PIPE_SHADER_COMPUTE:
-               declare_default_desc_pointers(ctx, &fninfo);
+               declare_global_desc_pointers(ctx, &fninfo);
+               declare_per_stage_desc_pointers(ctx, &fninfo, true);
                if (shader->selector->info.uses_grid_size)
                        ctx->param_grid_size = add_arg(&fninfo, ARG_SGPR, v3i32);
                if (shader->selector->info.uses_block_size)
@@ -4637,10 +4739,8 @@ static void create_function(struct si_shader_context *ctx)
        if (shader->key.as_ls ||
            ctx->type == PIPE_SHADER_TESS_CTRL ||
            /* GFX9 has the ESGS ring buffer in LDS. */
-           (ctx->screen->b.chip_class >= GFX9 &&
-            (shader->key.as_es ||
-             ctx->type == PIPE_SHADER_GEOMETRY)))
-               declare_lds_as_pointer(ctx);
+           type == SI_SHADER_MERGED_VERTEX_OR_TESSEVAL_GEOMETRY)
+               ac_declare_lds_as_pointer(&ctx->ac);
 }
 
 /**
@@ -4649,8 +4749,7 @@ static void create_function(struct si_shader_context *ctx)
  */
 static void preload_ring_buffers(struct si_shader_context *ctx)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
-       LLVMBuilderRef builder = gallivm->builder;
+       LLVMBuilderRef builder = ctx->ac.builder;
 
        LLVMValueRef buf_ptr = LLVMGetParam(ctx->main_fn,
                                            ctx->param_rw_buffers);
@@ -4663,20 +4762,20 @@ static void preload_ring_buffers(struct si_shader_context *ctx)
                LLVMValueRef offset = LLVMConstInt(ctx->i32, ring, 0);
 
                ctx->esgs_ring =
-                       ac_build_indexed_load_const(&ctx->ac, buf_ptr, offset);
+                       ac_build_load_to_sgpr(&ctx->ac, buf_ptr, offset);
        }
 
        if (ctx->shader->is_gs_copy_shader) {
                LLVMValueRef offset = LLVMConstInt(ctx->i32, SI_RING_GSVS, 0);
 
                ctx->gsvs_ring[0] =
-                       ac_build_indexed_load_const(&ctx->ac, buf_ptr, offset);
+                       ac_build_load_to_sgpr(&ctx->ac, buf_ptr, offset);
        } else if (ctx->type == PIPE_SHADER_GEOMETRY) {
                const struct si_shader_selector *sel = ctx->shader->selector;
                LLVMValueRef offset = LLVMConstInt(ctx->i32, SI_RING_GSVS, 0);
                LLVMValueRef base_ring;
 
-               base_ring = ac_build_indexed_load_const(&ctx->ac, buf_ptr, offset);
+               base_ring = ac_build_load_to_sgpr(&ctx->ac, buf_ptr, offset);
 
                /* The conceptual layout of the GSVS ring is
                 *   v0c0 .. vLv0 v0c1 .. vLc1 ..
@@ -4747,8 +4846,7 @@ static void si_llvm_emit_polygon_stipple(struct si_shader_context *ctx,
                                         LLVMValueRef param_rw_buffers,
                                         unsigned param_pos_fixed_pt)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
-       LLVMBuilderRef builder = gallivm->builder;
+       LLVMBuilderRef builder = ctx->ac.builder;
        LLVMValueRef slot, desc, offset, row, bit, address[2];
 
        /* Use the fixed-point gl_FragCoord input.
@@ -4760,7 +4858,7 @@ static void si_llvm_emit_polygon_stipple(struct si_shader_context *ctx,
 
        /* Load the buffer descriptor. */
        slot = LLVMConstInt(ctx->i32, SI_PS_CONST_POLY_STIPPLE, 0);
-       desc = ac_build_indexed_load_const(&ctx->ac, param_rw_buffers, slot);
+       desc = ac_build_load_to_sgpr(&ctx->ac, param_rw_buffers, slot);
 
        /* The stipple pattern is 32x32, each row has 32 bits. */
        offset = LLVMBuildMul(builder, address[1],
@@ -4769,11 +4867,7 @@ static void si_llvm_emit_polygon_stipple(struct si_shader_context *ctx,
        row = ac_to_integer(&ctx->ac, row);
        bit = LLVMBuildLShr(builder, row, address[0], "");
        bit = LLVMBuildTrunc(builder, bit, ctx->i1, "");
-
-       /* The intrinsic kills the thread if arg < 0. */
-       bit = LLVMBuildSelect(builder, bit, LLVMConstReal(ctx->f32, 0),
-                             LLVMConstReal(ctx->f32, -1), "");
-       ac_build_kill(&ctx->ac, bit);
+       ac_build_kill_if_false(&ctx->ac, bit);
 }
 
 void si_shader_binary_read_config(struct ac_shader_binary *binary,
@@ -5077,7 +5171,7 @@ static void si_shader_dump_stats(struct si_screen *sscreen,
                max_simd_waves = MIN2(max_simd_waves, 16384 / lds_per_wave);
 
        if (!check_debug_option ||
-           si_can_dump_shader(&sscreen->b, processor)) {
+           si_can_dump_shader(sscreen, processor)) {
                if (processor == PIPE_SHADER_FRAGMENT) {
                        fprintf(file, "*** SHADER CONFIG ***\n"
                                "SPI_PS_INPUT_ADDR = 0x%04x\n"
@@ -5149,7 +5243,7 @@ void si_shader_dump(struct si_screen *sscreen, const struct si_shader *shader,
                    FILE *file, bool check_debug_option)
 {
        if (!check_debug_option ||
-           si_can_dump_shader(&sscreen->b, processor))
+           si_can_dump_shader(sscreen, processor))
                si_dump_shader_key(processor, shader, file);
 
        if (!check_debug_option && shader->binary.llvm_ir_string) {
@@ -5166,8 +5260,8 @@ void si_shader_dump(struct si_screen *sscreen, const struct si_shader *shader,
        }
 
        if (!check_debug_option ||
-           (si_can_dump_shader(&sscreen->b, processor) &&
-            !(sscreen->b.debug_flags & DBG_NO_ASM))) {
+           (si_can_dump_shader(sscreen, processor) &&
+            !(sscreen->b.debug_flags & DBG(NO_ASM)))) {
                fprintf(file, "\n%s:\n", si_get_shader_name(shader, processor));
 
                if (shader->prolog)
@@ -5204,10 +5298,10 @@ static int si_compile_llvm(struct si_screen *sscreen,
        int r = 0;
        unsigned count = p_atomic_inc_return(&sscreen->b.num_compilations);
 
-       if (si_can_dump_shader(&sscreen->b, processor)) {
+       if (si_can_dump_shader(sscreen, processor)) {
                fprintf(stderr, "radeonsi: Compiling shader %d\n", count);
 
-               if (!(sscreen->b.debug_flags & (DBG_NO_IR | DBG_PREOPT_IR))) {
+               if (!(sscreen->b.debug_flags & (DBG(NO_IR) | DBG(PREOPT_IR)))) {
                        fprintf(stderr, "%s LLVM IR:\n\n", name);
                        ac_dump_module(mod);
                        fprintf(stderr, "\n");
@@ -5265,9 +5359,9 @@ static int si_compile_llvm(struct si_screen *sscreen,
 static void si_llvm_build_ret(struct si_shader_context *ctx, LLVMValueRef ret)
 {
        if (LLVMGetTypeKind(LLVMTypeOf(ret)) == LLVMVoidTypeKind)
-               LLVMBuildRetVoid(ctx->gallivm.builder);
+               LLVMBuildRetVoid(ctx->ac.builder);
        else
-               LLVMBuildRet(ctx->gallivm.builder, ret);
+               LLVMBuildRet(ctx->ac.builder, ret);
 }
 
 /* Generate code for the hardware VS shader stage to go with a geometry shader */
@@ -5279,7 +5373,6 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
 {
        struct si_shader_context ctx;
        struct si_shader *shader;
-       struct gallivm_state *gallivm = &ctx.gallivm;
        LLVMBuilderRef builder;
        struct lp_build_tgsi_context *bld_base = &ctx.bld_base;
        struct lp_build_context *uint = &bld_base->uint_bld;
@@ -5298,6 +5391,9 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
                return NULL;
        }
 
+       /* We can leave the fence as permanently signaled because the GS copy
+        * shader only becomes visible globally after it has been compiled. */
+       util_queue_fence_init(&shader->ready);
 
        shader->selector = gs_selector;
        shader->is_gs_copy_shader = true;
@@ -5306,7 +5402,7 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
        ctx.shader = shader;
        ctx.type = PIPE_SHADER_VERTEX;
 
-       builder = gallivm->builder;
+       builder = ctx.ac.builder;
 
        create_function(&ctx);
        preload_ring_buffers(&ctx);
@@ -5336,7 +5432,7 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
        LLVMBasicBlockRef end_bb;
        LLVMValueRef switch_inst;
 
-       end_bb = LLVMAppendBasicBlockInContext(gallivm->context, ctx.main_fn, "end");
+       end_bb = LLVMAppendBasicBlockInContext(ctx.ac.context, ctx.main_fn, "end");
        switch_inst = LLVMBuildSwitch(builder, stream_id, end_bb, 4);
 
        for (int stream = 0; stream < 4; stream++) {
@@ -5349,7 +5445,7 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
                if (stream > 0 && !gs_selector->so.num_outputs)
                        continue;
 
-               bb = LLVMInsertBasicBlockInContext(gallivm->context, end_bb, "out");
+               bb = LLVMInsertBasicBlockInContext(ctx.ac.context, end_bb, "out");
                LLVMAddCase(switch_inst, LLVMConstInt(ctx.i32, stream, 0), bb);
                LLVMPositionBuilderAtEnd(builder, bb);
 
@@ -5384,14 +5480,14 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
                }
 
                if (stream == 0)
-                       si_llvm_export_vs(bld_base, outputs, gsinfo->num_outputs);
+                       si_llvm_export_vs(&ctx, outputs, gsinfo->num_outputs);
 
                LLVMBuildBr(builder, end_bb);
        }
 
        LLVMPositionBuilderAtEnd(builder, end_bb);
 
-       LLVMBuildRetVoid(gallivm->builder);
+       LLVMBuildRetVoid(ctx.ac.builder);
 
        ctx.type = PIPE_SHADER_GEOMETRY; /* override for shader dumping */
        si_llvm_optimize_module(&ctx);
@@ -5402,7 +5498,7 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
                            debug, PIPE_SHADER_GEOMETRY,
                            "GS Copy Shader");
        if (!r) {
-               if (si_can_dump_shader(&sscreen->b, PIPE_SHADER_GEOMETRY))
+               if (si_can_dump_shader(sscreen, PIPE_SHADER_GEOMETRY))
                        fprintf(stderr, "GS Copy Shader:\n");
                si_shader_dump(sscreen, ctx.shader, debug,
                               PIPE_SHADER_GEOMETRY, stderr, true);
@@ -5551,7 +5647,7 @@ static void si_init_shader_ctx(struct si_shader_context *ctx,
        bld_base->op_actions[TGSI_OPCODE_READ_INVOC].fetch_args = read_invoc_fetch_args;
        bld_base->op_actions[TGSI_OPCODE_READ_INVOC].emit = read_lane_emit;
 
-       bld_base->op_actions[TGSI_OPCODE_EMIT].emit = si_llvm_emit_vertex;
+       bld_base->op_actions[TGSI_OPCODE_EMIT].emit = si_tgsi_emit_vertex;
        bld_base->op_actions[TGSI_OPCODE_ENDPRIM].emit = si_llvm_emit_primitive;
        bld_base->op_actions[TGSI_OPCODE_BARRIER].emit = si_llvm_emit_barrier;
 }
@@ -5603,7 +5699,7 @@ static void si_count_scratch_private_memory(struct si_shader_context *ctx)
 static void si_init_exec_full_mask(struct si_shader_context *ctx)
 {
        LLVMValueRef full_mask = LLVMConstInt(ctx->i64, ~0ull, 0);
-       lp_build_intrinsic(ctx->gallivm.builder,
+       lp_build_intrinsic(ctx->ac.builder,
                           "llvm.amdgcn.init.exec", ctx->voidt,
                           &full_mask, 1, LP_FUNC_ATTR_CONVERGENT);
 }
@@ -5615,7 +5711,7 @@ static void si_init_exec_from_input(struct si_shader_context *ctx,
                LLVMGetParam(ctx->main_fn, param),
                LLVMConstInt(ctx->i32, bitoffset, 0),
        };
-       lp_build_intrinsic(ctx->gallivm.builder,
+       lp_build_intrinsic(ctx->ac.builder,
                           "llvm.amdgcn.init.exec.from.input",
                           ctx->voidt, args, 2, LP_FUNC_ATTR_CONVERGENT);
 }
@@ -5665,6 +5761,7 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx,
                break;
        case PIPE_SHADER_GEOMETRY:
                bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_gs;
+               ctx->abi.emit_vertex = si_llvm_emit_vertex;
                bld_base->emit_epilogue = si_llvm_emit_gs_epilogue;
                break;
        case PIPE_SHADER_FRAGMENT:
@@ -5741,10 +5838,11 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx,
                }
        }
 
-       if (ctx->type == PIPE_SHADER_FRAGMENT && sel->info.uses_kill &&
-           ctx->screen->b.debug_flags & DBG_FS_CORRECT_DERIVS_AFTER_KILL) {
-               /* This is initialized to 0.0 = not kill. */
-               ctx->postponed_kill = lp_build_alloca(&ctx->gallivm, ctx->f32, "");
+       if (sel->force_correct_derivs_after_kill) {
+               ctx->postponed_kill = lp_build_alloca_undef(&ctx->gallivm, ctx->i1, "");
+               /* true = don't kill. */
+               LLVMBuildStore(ctx->ac.builder, LLVMConstInt(ctx->i1, 1, 0),
+                              ctx->postponed_kill);
        }
 
        if (sel->tokens) {
@@ -5784,11 +5882,13 @@ static void si_get_vs_prolog_key(const struct tgsi_shader_info *info,
        key->vs_prolog.num_input_sgprs = num_input_sgprs;
        key->vs_prolog.last_input = MAX2(1, info->num_inputs) - 1;
        key->vs_prolog.as_ls = shader_out->key.as_ls;
+       key->vs_prolog.as_es = shader_out->key.as_es;
 
        if (shader_out->selector->type == PIPE_SHADER_TESS_CTRL) {
                key->vs_prolog.as_ls = 1;
                key->vs_prolog.num_merged_next_stage_vgprs = 2;
        } else if (shader_out->selector->type == PIPE_SHADER_GEOMETRY) {
+               key->vs_prolog.as_es = 1;
                key->vs_prolog.num_merged_next_stage_vgprs = 5;
        }
 
@@ -5961,9 +6061,8 @@ static void si_build_gs_prolog_function(struct si_shader_context *ctx,
                                        union si_shader_part_key *key)
 {
        unsigned num_sgprs, num_vgprs;
-       struct gallivm_state *gallivm = &ctx->gallivm;
        struct si_function_info fninfo;
-       LLVMBuilderRef builder = gallivm->builder;
+       LLVMBuilderRef builder = ctx->ac.builder;
        LLVMTypeRef returns[48];
        LLVMValueRef func, ret;
 
@@ -6086,8 +6185,7 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
                                      unsigned main_part,
                                      unsigned next_shader_first_part)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
-       LLVMBuilderRef builder = ctx->gallivm.builder;
+       LLVMBuilderRef builder = ctx->ac.builder;
        /* PS epilog has one arg per color component; gfx9 merged shader
         * prologs need to forward 32 user SGPRs.
         */
@@ -6243,7 +6341,7 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
                        if (param_size == 1)
                                arg = out[out_idx];
                        else
-                               arg = lp_build_gather_values(gallivm, &out[out_idx], param_size);
+                               arg = lp_build_gather_values(&ctx->gallivm, &out[out_idx], param_size);
 
                        if (LLVMTypeOf(arg) != param_type) {
                                if (LLVMGetTypeKind(param_type) == LLVMPointerTypeKind) {
@@ -6318,8 +6416,8 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
 
        /* Dump TGSI code before doing TGSI->LLVM conversion in case the
         * conversion fails. */
-       if (si_can_dump_shader(&sscreen->b, sel->info.processor) &&
-           !(sscreen->b.debug_flags & DBG_NO_TGSI)) {
+       if (si_can_dump_shader(sscreen, sel->info.processor) &&
+           !(sscreen->b.debug_flags & DBG(NO_TGSI))) {
                if (sel->tokens)
                        tgsi_dump(sel->tokens, 0);
                else
@@ -6445,7 +6543,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
                                union si_shader_part_key vs_prolog_key;
                                si_get_vs_prolog_key(&es->info,
                                                     shader->info.num_input_sgprs,
-                                                    &shader->key.part.tcs.ls_prolog,
+                                                    &shader->key.part.gs.vs_prolog,
                                                     shader, &vs_prolog_key);
                                vs_prolog_key.vs_prolog.is_monolithic = true;
                                si_build_vs_prolog_function(&ctx, &vs_prolog_key);
@@ -6527,7 +6625,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
        si_optimize_vs_outputs(&ctx);
 
        if ((debug && debug->debug_message) ||
-           si_can_dump_shader(&sscreen->b, ctx.type))
+           si_can_dump_shader(sscreen, ctx.type))
                si_count_scratch_private_memory(&ctx);
 
        /* Compile to bytecode. */
@@ -6664,7 +6762,6 @@ si_get_shader_part(struct si_screen *sscreen,
 
        struct si_shader shader = {};
        struct si_shader_context ctx;
-       struct gallivm_state *gallivm = &ctx.gallivm;
 
        si_init_shader_ctx(&ctx, sscreen, tm);
        ctx.shader = &shader;
@@ -6672,6 +6769,8 @@ si_get_shader_part(struct si_screen *sscreen,
 
        switch (type) {
        case PIPE_SHADER_VERTEX:
+               shader.key.as_ls = key->vs_prolog.as_ls;
+               shader.key.as_es = key->vs_prolog.as_es;
                break;
        case PIPE_SHADER_TESS_CTRL:
                assert(!prolog);
@@ -6696,7 +6795,7 @@ si_get_shader_part(struct si_screen *sscreen,
        si_llvm_optimize_module(&ctx);
 
        if (si_compile_llvm(sscreen, &result->binary, &result->config, tm,
-                           gallivm->module, debug, ctx.type, name)) {
+                           ctx.ac.module, debug, ctx.type, name)) {
                FREE(result);
                result = NULL;
                goto out;
@@ -6713,15 +6812,19 @@ out:
 
 static LLVMValueRef si_prolog_get_rw_buffers(struct si_shader_context *ctx)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
        LLVMValueRef ptr[2], list;
+       bool is_merged_shader =
+               ctx->screen->b.chip_class >= GFX9 &&
+               (ctx->type == PIPE_SHADER_TESS_CTRL ||
+                ctx->type == PIPE_SHADER_GEOMETRY ||
+                ctx->shader->key.as_ls || ctx->shader->key.as_es);
 
        /* Get the pointer to rw buffers. */
-       ptr[0] = LLVMGetParam(ctx->main_fn, SI_SGPR_RW_BUFFERS);
-       ptr[1] = LLVMGetParam(ctx->main_fn, SI_SGPR_RW_BUFFERS_HI);
-       list = lp_build_gather_values(gallivm, ptr, 2);
-       list = LLVMBuildBitCast(gallivm->builder, list, ctx->i64, "");
-       list = LLVMBuildIntToPtr(gallivm->builder, list,
+       ptr[0] = LLVMGetParam(ctx->main_fn, (is_merged_shader ? 8 : 0) + SI_SGPR_RW_BUFFERS);
+       ptr[1] = LLVMGetParam(ctx->main_fn, (is_merged_shader ? 8 : 0) + SI_SGPR_RW_BUFFERS_HI);
+       list = lp_build_gather_values(&ctx->gallivm, ptr, 2);
+       list = LLVMBuildBitCast(ctx->ac.builder, list, ctx->i64, "");
+       list = LLVMBuildIntToPtr(ctx->ac.builder, list,
                                 si_const_array(ctx->v4i32, SI_NUM_RW_BUFFERS), "");
        return list;
 }
@@ -6745,7 +6848,6 @@ static LLVMValueRef si_prolog_get_rw_buffers(struct si_shader_context *ctx)
 static void si_build_vs_prolog_function(struct si_shader_context *ctx,
                                        union si_shader_part_key *key)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
        struct si_function_info fninfo;
        LLVMTypeRef *returns;
        LLVMValueRef ret, func;
@@ -6789,20 +6891,19 @@ static void si_build_vs_prolog_function(struct si_shader_context *ctx,
                        si_init_exec_from_input(ctx, 3, 0);
 
                if (key->vs_prolog.as_ls &&
-                   (ctx->screen->b.family == CHIP_VEGA10 ||
-                    ctx->screen->b.family == CHIP_RAVEN)) {
+                   ctx->screen->has_ls_vgpr_init_bug) {
                        /* If there are no HS threads, SPI loads the LS VGPRs
                         * starting at VGPR 0. Shift them back to where they
                         * belong.
                         */
                        LLVMValueRef has_hs_threads =
-                               LLVMBuildICmp(gallivm->builder, LLVMIntNE,
+                               LLVMBuildICmp(ctx->ac.builder, LLVMIntNE,
                                    unpack_param(ctx, 3, 8, 8),
                                    ctx->i32_0, "");
 
                        for (i = 4; i > 0; --i) {
                                input_vgprs[i + 1] =
-                                       LLVMBuildSelect(gallivm->builder, has_hs_threads,
+                                       LLVMBuildSelect(ctx->ac.builder, has_hs_threads,
                                                        input_vgprs[i + 1],
                                                        input_vgprs[i - 1], "");
                        }
@@ -6818,12 +6919,12 @@ static void si_build_vs_prolog_function(struct si_shader_context *ctx,
        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, "");
+               ret = LLVMBuildInsertValue(ctx->ac.builder, ret, p, i, "");
        }
        for (i = 0; i < num_input_vgprs; i++) {
                LLVMValueRef p = input_vgprs[i];
                p = ac_to_float(&ctx->ac, p);
-               ret = LLVMBuildInsertValue(gallivm->builder, ret, p,
+               ret = LLVMBuildInsertValue(ctx->ac.builder, ret, p,
                                           key->vs_prolog.num_input_sgprs + i, "");
        }
 
@@ -6835,7 +6936,7 @@ static void si_build_vs_prolog_function(struct si_shader_context *ctx,
                LLVMValueRef buf_index =
                        LLVMConstInt(ctx->i32, SI_VS_CONST_INSTANCE_DIVISORS, 0);
                instance_divisor_constbuf =
-                       ac_build_indexed_load_const(&ctx->ac, list, buf_index);
+                       ac_build_load_to_sgpr(&ctx->ac, list, buf_index);
        }
 
        for (i = 0; i <= key->vs_prolog.last_input; i++) {
@@ -6861,14 +6962,14 @@ static void si_build_vs_prolog_function(struct si_shader_context *ctx,
                                                             divisor);
                } else {
                        /* VertexID + BaseVertex */
-                       index = LLVMBuildAdd(gallivm->builder,
+                       index = LLVMBuildAdd(ctx->ac.builder,
                                             ctx->abi.vertex_id,
                                             LLVMGetParam(func, user_sgpr_base +
                                                                SI_SGPR_BASE_VERTEX), "");
                }
 
                index = ac_to_float(&ctx->ac, index);
-               ret = LLVMBuildInsertValue(gallivm->builder, ret, index,
+               ret = LLVMBuildInsertValue(ctx->ac.builder, ret, index,
                                           fninfo.num_params + i, "");
        }
 
@@ -6919,7 +7020,6 @@ static bool si_shader_select_vs_parts(struct si_screen *sscreen,
 static void si_build_tcs_epilog_function(struct si_shader_context *ctx,
                                         union si_shader_part_key *key)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
        struct lp_build_tgsi_context *bld_base = &ctx->bld_base;
        struct si_function_info fninfo;
        LLVMValueRef func;
@@ -6976,7 +7076,7 @@ static void si_build_tcs_epilog_function(struct si_shader_context *ctx,
        /* Create the function. */
        si_create_function(ctx, "tcs_epilog", NULL, 0, &fninfo,
                           ctx->screen->b.chip_class >= CIK ? 128 : 64);
-       declare_lds_as_pointer(ctx);
+       ac_declare_lds_as_pointer(&ctx->ac);
        func = ctx->main_fn;
 
        LLVMValueRef invoc0_tess_factors[6];
@@ -6989,7 +7089,7 @@ static void si_build_tcs_epilog_function(struct si_shader_context *ctx,
                              LLVMGetParam(func, tess_factors_idx + 2),
                              invoc0_tess_factors, invoc0_tess_factors + 4);
 
-       LLVMBuildRetVoid(gallivm->builder);
+       LLVMBuildRetVoid(ctx->ac.builder);
 }
 
 /**
@@ -7072,7 +7172,6 @@ static bool si_shader_select_gs_parts(struct si_screen *sscreen,
 static void si_build_ps_prolog_function(struct si_shader_context *ctx,
                                        union si_shader_part_key *key)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
        struct si_function_info fninfo;
        LLVMValueRef ret, func;
        int num_returns, i, num_color_channels;
@@ -7105,7 +7204,7 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
        ret = ctx->return_value;
        for (i = 0; i < fninfo.num_params; i++) {
                LLVMValueRef p = LLVMGetParam(func, i);
-               ret = LLVMBuildInsertValue(gallivm->builder, ret, p, i, "");
+               ret = LLVMBuildInsertValue(ctx->ac.builder, ret, p, i, "");
        }
 
        /* Polygon stippling. */
@@ -7130,9 +7229,9 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
                 * PRIM_MASK is after user SGPRs.
                 */
                bc_optimize = LLVMGetParam(func, SI_PS_NUM_USER_SGPR);
-               bc_optimize = LLVMBuildLShr(gallivm->builder, bc_optimize,
+               bc_optimize = LLVMBuildLShr(ctx->ac.builder, bc_optimize,
                                            LLVMConstInt(ctx->i32, 31, 0), "");
-               bc_optimize = LLVMBuildTrunc(gallivm->builder, bc_optimize,
+               bc_optimize = LLVMBuildTrunc(ctx->ac.builder, bc_optimize,
                                             ctx->i1, "");
 
                if (key->ps_prolog.states.bc_optimize_for_persp) {
@@ -7144,9 +7243,9 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
                                centroid[i] = LLVMGetParam(func, base + 4 + i);
                        /* Select PERSP_CENTROID. */
                        for (i = 0; i < 2; i++) {
-                               tmp = LLVMBuildSelect(gallivm->builder, bc_optimize,
+                               tmp = LLVMBuildSelect(ctx->ac.builder, bc_optimize,
                                                      center[i], centroid[i], "");
-                               ret = LLVMBuildInsertValue(gallivm->builder, ret,
+                               ret = LLVMBuildInsertValue(ctx->ac.builder, ret,
                                                           tmp, base + 4 + i, "");
                        }
                }
@@ -7159,9 +7258,9 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
                                centroid[i] = LLVMGetParam(func, base + 10 + i);
                        /* Select LINEAR_CENTROID. */
                        for (i = 0; i < 2; i++) {
-                               tmp = LLVMBuildSelect(gallivm->builder, bc_optimize,
+                               tmp = LLVMBuildSelect(ctx->ac.builder, bc_optimize,
                                                      center[i], centroid[i], "");
-                               ret = LLVMBuildInsertValue(gallivm->builder, ret,
+                               ret = LLVMBuildInsertValue(ctx->ac.builder, ret,
                                                           tmp, base + 10 + i, "");
                        }
                }
@@ -7177,11 +7276,11 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
                        persp_sample[i] = LLVMGetParam(func, base + i);
                /* Overwrite PERSP_CENTER. */
                for (i = 0; i < 2; i++)
-                       ret = LLVMBuildInsertValue(gallivm->builder, ret,
+                       ret = LLVMBuildInsertValue(ctx->ac.builder, ret,
                                                   persp_sample[i], base + 2 + i, "");
                /* Overwrite PERSP_CENTROID. */
                for (i = 0; i < 2; i++)
-                       ret = LLVMBuildInsertValue(gallivm->builder, ret,
+                       ret = LLVMBuildInsertValue(ctx->ac.builder, ret,
                                                   persp_sample[i], base + 4 + i, "");
        }
        if (key->ps_prolog.states.force_linear_sample_interp) {
@@ -7193,11 +7292,11 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
                        linear_sample[i] = LLVMGetParam(func, base + 6 + i);
                /* Overwrite LINEAR_CENTER. */
                for (i = 0; i < 2; i++)
-                       ret = LLVMBuildInsertValue(gallivm->builder, ret,
+                       ret = LLVMBuildInsertValue(ctx->ac.builder, ret,
                                                   linear_sample[i], base + 8 + i, "");
                /* Overwrite LINEAR_CENTROID. */
                for (i = 0; i < 2; i++)
-                       ret = LLVMBuildInsertValue(gallivm->builder, ret,
+                       ret = LLVMBuildInsertValue(ctx->ac.builder, ret,
                                                   linear_sample[i], base + 10 + i, "");
        }
 
@@ -7211,11 +7310,11 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
                        persp_center[i] = LLVMGetParam(func, base + 2 + i);
                /* Overwrite PERSP_SAMPLE. */
                for (i = 0; i < 2; i++)
-                       ret = LLVMBuildInsertValue(gallivm->builder, ret,
+                       ret = LLVMBuildInsertValue(ctx->ac.builder, ret,
                                                   persp_center[i], base + i, "");
                /* Overwrite PERSP_CENTROID. */
                for (i = 0; i < 2; i++)
-                       ret = LLVMBuildInsertValue(gallivm->builder, ret,
+                       ret = LLVMBuildInsertValue(ctx->ac.builder, ret,
                                                   persp_center[i], base + 4 + i, "");
        }
        if (key->ps_prolog.states.force_linear_center_interp) {
@@ -7227,11 +7326,11 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
                        linear_center[i] = LLVMGetParam(func, base + 8 + i);
                /* Overwrite LINEAR_SAMPLE. */
                for (i = 0; i < 2; i++)
-                       ret = LLVMBuildInsertValue(gallivm->builder, ret,
+                       ret = LLVMBuildInsertValue(ctx->ac.builder, ret,
                                                   linear_center[i], base + 6 + i, "");
                /* Overwrite LINEAR_CENTROID. */
                for (i = 0; i < 2; i++)
-                       ret = LLVMBuildInsertValue(gallivm->builder, ret,
+                       ret = LLVMBuildInsertValue(ctx->ac.builder, ret,
                                                   linear_center[i], base + 10 + i, "");
        }
 
@@ -7253,11 +7352,11 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
                                               key->ps_prolog.color_interp_vgpr_index[i];
 
                        /* Get the (i,j) updated by bc_optimize handling. */
-                       interp[0] = LLVMBuildExtractValue(gallivm->builder, ret,
+                       interp[0] = LLVMBuildExtractValue(ctx->ac.builder, ret,
                                                          interp_vgpr, "");
-                       interp[1] = LLVMBuildExtractValue(gallivm->builder, ret,
+                       interp[1] = LLVMBuildExtractValue(ctx->ac.builder, ret,
                                                          interp_vgpr + 1, "");
-                       interp_ij = lp_build_gather_values(gallivm, interp, 2);
+                       interp_ij = lp_build_gather_values(&ctx->gallivm, interp, 2);
                }
 
                /* Use the absolute location of the input. */
@@ -7277,7 +7376,7 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
 
                while (writemask) {
                        unsigned chan = u_bit_scan(&writemask);
-                       ret = LLVMBuildInsertValue(gallivm->builder, ret, color[chan],
+                       ret = LLVMBuildInsertValue(ctx->ac.builder, ret, color[chan],
                                                   fninfo.num_params + color_out_idx++, "");
                }
        }
@@ -7318,15 +7417,15 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
 
                samplemask = ac_to_integer(&ctx->ac, samplemask);
                samplemask = LLVMBuildAnd(
-                       gallivm->builder,
+                       ctx->ac.builder,
                        samplemask,
-                       LLVMBuildShl(gallivm->builder,
+                       LLVMBuildShl(ctx->ac.builder,
                                     LLVMConstInt(ctx->i32, ps_iter_mask, false),
                                     sampleid, ""),
                        "");
                samplemask = ac_to_float(&ctx->ac, samplemask);
 
-               ret = LLVMBuildInsertValue(gallivm->builder, ret, samplemask,
+               ret = LLVMBuildInsertValue(ctx->ac.builder, ret, samplemask,
                                           ancillary_vgpr + 1, "");
        }
 
@@ -7346,7 +7445,6 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
 static void si_build_ps_epilog_function(struct si_shader_context *ctx,
                                        union si_shader_part_key *key)
 {
-       struct gallivm_state *gallivm = &ctx->gallivm;
        struct lp_build_tgsi_context *bld_base = &ctx->bld_base;
        struct si_function_info fninfo;
        LLVMValueRef depth = NULL, stencil = NULL, samplemask = NULL;
@@ -7436,7 +7534,7 @@ static void si_build_ps_epilog_function(struct si_shader_context *ctx,
                si_emit_ps_exports(ctx, &exp);
 
        /* Compile. */
-       LLVMBuildRetVoid(gallivm->builder);
+       LLVMBuildRetVoid(ctx->ac.builder);
 }
 
 /**
@@ -7715,7 +7813,7 @@ void si_shader_destroy(struct si_shader *shader)
        r600_resource_reference(&shader->bo, NULL);
 
        if (!shader->is_binary_shared)
-               si_radeon_shader_binary_clean(&shader->binary);
+               ac_shader_binary_clean(&shader->binary);
 
        free(shader->shader_log);
 }