radeonsi: rename si_compiler -> ac_llvm_compiler
[mesa.git] / src / gallium / drivers / radeonsi / si_shader.c
index ca43530d92469a619769020610f4c51de02c08af..5dc12d87243631c4f8e667c85aa817c60924919a 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright 2012 Advanced Micro Devices, Inc.
+ * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#include "gallivm/lp_bld_const.h"
-#include "gallivm/lp_bld_gather.h"
-#include "gallivm/lp_bld_intr.h"
-#include "gallivm/lp_bld_logic.h"
-#include "gallivm/lp_bld_arit.h"
-#include "gallivm/lp_bld_flow.h"
-#include "gallivm/lp_bld_misc.h"
 #include "util/u_memory.h"
 #include "util/u_string.h"
 #include "tgsi/tgsi_build.h"
 #include "tgsi/tgsi_util.h"
 #include "tgsi/tgsi_dump.h"
 
-#include "ac_binary.h"
-#include "ac_llvm_util.h"
 #include "ac_exp_param.h"
 #include "ac_shader_util.h"
+#include "ac_llvm_util.h"
 #include "si_shader_internal.h"
 #include "si_pipe.h"
 #include "sid.h"
@@ -76,7 +69,7 @@ enum si_arg_regfile {
 
 static void si_init_shader_ctx(struct si_shader_context *ctx,
                               struct si_screen *sscreen,
-                              LLVMTargetMachineRef tm);
+                              struct ac_llvm_compiler *compiler);
 
 static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
                                 struct lp_build_tgsi_context *bld_base,
@@ -190,7 +183,8 @@ unsigned si_shader_io_get_unique_index_patch(unsigned semantic_name, unsigned in
  * less than 64, so that a 64-bit bitmask of used inputs or outputs can be
  * calculated.
  */
-unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index)
+unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index,
+                                      unsigned is_varying)
 {
        switch (semantic_name) {
        case TGSI_SEMANTIC_POSITION:
@@ -219,15 +213,24 @@ unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index)
                return SI_MAX_IO_GENERIC + 6;
        case TGSI_SEMANTIC_PRIMID:
                return SI_MAX_IO_GENERIC + 7;
-       case TGSI_SEMANTIC_COLOR: /* these alias */
-       case TGSI_SEMANTIC_BCOLOR:
+       case TGSI_SEMANTIC_COLOR:
                assert(index < 2);
                return SI_MAX_IO_GENERIC + 8 + index;
+       case TGSI_SEMANTIC_BCOLOR:
+               assert(index < 2);
+               /* If it's a varying, COLOR and BCOLOR alias. */
+               if (is_varying)
+                       return SI_MAX_IO_GENERIC + 8 + index;
+               else
+                       return SI_MAX_IO_GENERIC + 10 + index;
        case TGSI_SEMANTIC_TEXCOORD:
                assert(index < 8);
-               assert(SI_MAX_IO_GENERIC + 10 + index < 64);
-               return SI_MAX_IO_GENERIC + 10 + index;
+               STATIC_ASSERT(SI_MAX_IO_GENERIC + 12 + 8 <= 63);
+               return SI_MAX_IO_GENERIC + 12 + index;
+       case TGSI_SEMANTIC_CLIPVERTEX:
+               return 63;
        default:
+               fprintf(stderr, "invalid semantic name = %u\n", semantic_name);
                assert(!"invalid semantic name");
                return 0;
        }
@@ -256,9 +259,9 @@ static LLVMValueRef unpack_llvm_param(struct si_shader_context *ctx,
        return value;
 }
 
-static LLVMValueRef unpack_param(struct si_shader_context *ctx,
-                                unsigned param, unsigned rshift,
-                                unsigned bitwidth)
+LLVMValueRef si_unpack_param(struct si_shader_context *ctx,
+                            unsigned param, unsigned rshift,
+                            unsigned bitwidth)
 {
        LLVMValueRef value = LLVMGetParam(ctx->main_fn, param);
 
@@ -305,7 +308,7 @@ static LLVMValueRef get_rel_patch_id(struct si_shader_context *ctx)
 static LLVMValueRef
 get_tcs_in_patch_stride(struct si_shader_context *ctx)
 {
-       return unpack_param(ctx, ctx->param_vs_state_bits, 8, 13);
+       return si_unpack_param(ctx, ctx->param_vs_state_bits, 8, 13);
 }
 
 static unsigned get_tcs_out_vertex_dw_stride_constant(struct si_shader_context *ctx)
@@ -328,7 +331,7 @@ static LLVMValueRef get_tcs_out_vertex_dw_stride(struct si_shader_context *ctx)
 static LLVMValueRef get_tcs_out_patch_stride(struct si_shader_context *ctx)
 {
        if (ctx->shader->key.mono.u.ff_tcs_inputs_to_copy)
-               return unpack_param(ctx, ctx->param_tcs_out_lds_layout, 0, 13);
+               return si_unpack_param(ctx, ctx->param_tcs_out_lds_layout, 0, 13);
 
        const struct tgsi_shader_info *info = &ctx->shader->selector->info;
        unsigned tcs_out_vertices = info->properties[TGSI_PROPERTY_TCS_VERTICES_OUT];
@@ -342,21 +345,21 @@ static LLVMValueRef get_tcs_out_patch_stride(struct si_shader_context *ctx)
 static LLVMValueRef
 get_tcs_out_patch0_offset(struct si_shader_context *ctx)
 {
-       return lp_build_mul_imm(&ctx->bld_base.uint_bld,
-                               unpack_param(ctx,
-                                            ctx->param_tcs_out_lds_offsets,
-                                            0, 16),
-                               4);
+       return LLVMBuildMul(ctx->ac.builder,
+                           si_unpack_param(ctx,
+                                           ctx->param_tcs_out_lds_offsets,
+                                           0, 16),
+                           LLVMConstInt(ctx->i32, 4, 0), "");
 }
 
 static LLVMValueRef
 get_tcs_out_patch0_patch_data_offset(struct si_shader_context *ctx)
 {
-       return lp_build_mul_imm(&ctx->bld_base.uint_bld,
-                               unpack_param(ctx,
-                                            ctx->param_tcs_out_lds_offsets,
-                                            16, 16),
-                               4);
+       return LLVMBuildMul(ctx->ac.builder,
+                           si_unpack_param(ctx,
+                                           ctx->param_tcs_out_lds_offsets,
+                                           16, 16),
+                           LLVMConstInt(ctx->i32, 4, 0), "");
 }
 
 static LLVMValueRef
@@ -405,7 +408,7 @@ static LLVMValueRef get_num_tcs_out_vertices(struct si_shader_context *ctx)
        if (ctx->type == PIPE_SHADER_TESS_CTRL && tcs_out_vertices)
                return LLVMConstInt(ctx->i32, tcs_out_vertices, 0);
 
-       return unpack_param(ctx, ctx->param_tcs_offchip_layout, 6, 6);
+       return si_unpack_param(ctx, ctx->param_tcs_offchip_layout, 6, 6);
 }
 
 static LLVMValueRef get_tcs_in_vertex_dw_stride(struct si_shader_context *ctx)
@@ -423,7 +426,7 @@ static LLVMValueRef get_tcs_in_vertex_dw_stride(struct si_shader_context *ctx)
                        stride = util_last_bit64(ctx->shader->key.part.tcs.ls->outputs_written);
                        return LLVMConstInt(ctx->i32, stride * 4, 0);
                }
-               return unpack_param(ctx, ctx->param_vs_state_bits, 24, 8);
+               return si_unpack_param(ctx, ctx->param_vs_state_bits, 24, 8);
 
        default:
                assert(0);
@@ -859,7 +862,7 @@ static LLVMValueRef get_dw_address_from_generic_indices(struct si_shader_context
                si_shader_io_get_unique_index_patch(name[input_index],
                                                    index[input_index]) :
                si_shader_io_get_unique_index(name[input_index],
-                                             index[input_index]);
+                                             index[input_index], false);
 
        /* Add the base address of the element. */
        return LLVMBuildAdd(ctx->ac.builder, base_addr,
@@ -966,7 +969,7 @@ static LLVMValueRef get_tcs_tes_buffer_address(struct si_shader_context *ctx,
        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);
+       num_patches = si_unpack_param(ctx, ctx->param_tcs_offchip_layout, 0, 6);
        total_vertices = LLVMBuildMul(ctx->ac.builder, vertices_per_patch,
                                      num_patches, "");
 
@@ -992,7 +995,7 @@ static LLVMValueRef get_tcs_tes_buffer_address(struct si_shader_context *ctx,
 
        if (!vertex_index) {
                LLVMValueRef patch_data_offset =
-                          unpack_param(ctx, ctx->param_tcs_offchip_layout, 12, 20);
+                          si_unpack_param(ctx, ctx->param_tcs_offchip_layout, 12, 20);
 
                base_addr = LLVMBuildAdd(ctx->ac.builder, base_addr,
                                         patch_data_offset, "");
@@ -1014,7 +1017,7 @@ static LLVMValueRef get_tcs_tes_buffer_address_from_generic_indices(
 
        param_index_base = is_patch ?
                si_shader_io_get_unique_index_patch(name[param_base], index[param_base]) :
-               si_shader_io_get_unique_index(name[param_base], index[param_base]);
+               si_shader_io_get_unique_index(name[param_base], index[param_base], false);
 
        if (param_index) {
                param_index = LLVMBuildAdd(ctx->ac.builder, param_index,
@@ -1137,7 +1140,7 @@ 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(&ctx->gallivm, values,
+               return ac_build_gather_values(&ctx->ac, values,
                                              TGSI_NUM_CHANNELS);
        }
 
@@ -1150,8 +1153,8 @@ static LLVMValueRef lds_load(struct lp_build_tgsi_context *bld_base,
                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));
+       dw_addr = LLVMBuildAdd(ctx->ac.builder, dw_addr,
+                              LLVMConstInt(ctx->i32, swizzle, 0), "");
 
        value = ac_lds_load(&ctx->ac, dw_addr);
 
@@ -1169,34 +1172,52 @@ static void lds_store(struct si_shader_context *ctx,
                      unsigned dw_offset_imm, LLVMValueRef dw_addr,
                      LLVMValueRef value)
 {
-       dw_addr = lp_build_add(&ctx->bld_base.uint_bld, dw_addr,
-                           LLVMConstInt(ctx->i32, dw_offset_imm, 0));
+       dw_addr = LLVMBuildAdd(ctx->ac.builder, dw_addr,
+                              LLVMConstInt(ctx->i32, dw_offset_imm, 0), "");
 
        ac_lds_store(&ctx->ac, dw_addr, value);
 }
 
-static LLVMValueRef desc_from_addr_base64k(struct si_shader_context *ctx,
-                                                 unsigned param)
+enum si_tess_ring {
+       TCS_FACTOR_RING,
+       TESS_OFFCHIP_RING_TCS,
+       TESS_OFFCHIP_RING_TES,
+};
+
+static LLVMValueRef get_tess_ring_descriptor(struct si_shader_context *ctx,
+                                            enum si_tess_ring ring)
 {
        LLVMBuilderRef builder = ctx->ac.builder;
-
+       unsigned param = ring == TESS_OFFCHIP_RING_TES ? ctx->param_tes_offchip_addr :
+                                                        ctx->param_tcs_out_lds_layout;
        LLVMValueRef addr = LLVMGetParam(ctx->main_fn, param);
-       addr = LLVMBuildZExt(builder, addr, ctx->i64, "");
-       addr = LLVMBuildShl(builder, addr, LLVMConstInt(ctx->i64, 16, 0), "");
 
-       uint64_t desc2 = 0xffffffff;
-       uint64_t desc3 = 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);
-       LLVMValueRef hi = LLVMConstInt(ctx->i64, desc2 | (desc3 << 32), 0);
+       /* TCS only receives high 13 bits of the address. */
+       if (ring == TESS_OFFCHIP_RING_TCS || ring == TCS_FACTOR_RING) {
+               addr = LLVMBuildAnd(builder, addr,
+                                   LLVMConstInt(ctx->i32, 0xfff80000, 0), "");
+       }
+
+       if (ring == TCS_FACTOR_RING) {
+               unsigned tf_offset = ctx->screen->tess_offchip_ring_size;
+               addr = LLVMBuildAdd(builder, addr,
+                                   LLVMConstInt(ctx->i32, tf_offset, 0), "");
+       }
+
+       LLVMValueRef desc[4];
+       desc[0] = addr;
+       desc[1] = LLVMConstInt(ctx->i32,
+                              S_008F04_BASE_ADDRESS_HI(ctx->screen->info.address32_hi), 0);
+       desc[2] = LLVMConstInt(ctx->i32, 0xffffffff, 0);
+       desc[3] = 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 = LLVMGetUndef(LLVMVectorType(ctx->i64, 2));
-       desc = LLVMBuildInsertElement(builder, desc, addr, ctx->i32_0, "");
-       desc = LLVMBuildInsertElement(builder, desc, hi, ctx->i32_1, "");
-       return LLVMBuildBitCast(builder, desc, ctx->v4i32, "");
+       return ac_build_gather_values(&ctx->ac, desc, 4);
 }
 
 static LLVMValueRef fetch_input_tcs(
@@ -1215,6 +1236,7 @@ static LLVMValueRef fetch_input_tcs(
 }
 
 static LLVMValueRef si_nir_load_tcs_varyings(struct ac_shader_abi *abi,
+                                            LLVMTypeRef type,
                                             LLVMValueRef vertex_index,
                                             LLVMValueRef param_index,
                                             unsigned const_index,
@@ -1254,16 +1276,30 @@ static LLVMValueRef si_nir_load_tcs_varyings(struct ac_shader_abi *abi,
                param_index = LLVMConstInt(ctx->i32, const_index, 0);
        }
 
+       ubyte *names;
+       ubyte *indices;
+       if (load_input) {
+               names = info->input_semantic_name;
+               indices = info->input_semantic_index;
+       } else {
+               names = info->output_semantic_name;
+               indices = info->output_semantic_index;
+       }
+
        dw_addr = get_dw_address_from_generic_indices(ctx, stride, dw_addr,
                                                      vertex_index, param_index,
                                                      driver_location,
-                                                     info->input_semantic_name,
-                                                     info->input_semantic_index,
+                                                     names, indices,
                                                      is_patch);
 
        LLVMValueRef value[4];
-       for (unsigned i = 0; i < num_components + component; i++) {
-               value[i] = lds_load(bld_base, ctx->i32, i, dw_addr);
+       for (unsigned i = 0; i < num_components; i++) {
+               unsigned offset = i;
+               if (llvm_type_is_64bit(ctx, type))
+                       offset *= 2;
+
+               offset += component;
+               value[i + component] = lds_load(bld_base, type, offset, dw_addr);
        }
 
        return ac_build_varying_gather_values(&ctx->ac, value, num_components, component);
@@ -1295,18 +1331,17 @@ static LLVMValueRef fetch_input_tes(
        enum tgsi_opcode_type type, unsigned swizzle)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       LLVMValueRef buffer, base, addr;
-
-       buffer = desc_from_addr_base64k(ctx, ctx->param_tcs_offchip_addr_base64k);
+       LLVMValueRef base, addr;
 
        base = LLVMGetParam(ctx->main_fn, ctx->param_tcs_offchip_offset);
        addr = get_tcs_tes_buffer_address_from_reg(ctx, NULL, reg);
 
        return buffer_load(bld_base, tgsi2llvmtype(bld_base, type), swizzle,
-                          buffer, base, addr, true);
+                          ctx->tess_offchip_ring, base, addr, true);
 }
 
 LLVMValueRef si_nir_load_input_tes(struct ac_shader_abi *abi,
+                                  LLVMTypeRef type,
                                   LLVMValueRef vertex_index,
                                   LLVMValueRef param_index,
                                   unsigned const_index,
@@ -1320,12 +1355,10 @@ LLVMValueRef si_nir_load_input_tes(struct ac_shader_abi *abi,
 {
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
        struct tgsi_shader_info *info = &ctx->shader->selector->info;
-       LLVMValueRef buffer, base, addr;
+       LLVMValueRef base, addr;
 
        driver_location = driver_location / 4;
 
-       buffer = desc_from_addr_base64k(ctx, ctx->param_tcs_offchip_addr_base64k);
-
        base = LLVMGetParam(ctx->main_fn, ctx->param_tcs_offchip_offset);
 
        if (param_index) {
@@ -1348,8 +1381,14 @@ LLVMValueRef si_nir_load_input_tes(struct ac_shader_abi *abi,
         * between the NIR and TGSI backends.
         */
        LLVMValueRef value[4];
-       for (unsigned i = component; i < num_components + component; i++) {
-               value[i] = buffer_load(&ctx->bld_base, ctx->i32, i, buffer, base, addr, true);
+       for (unsigned i = 0; i < num_components; i++) {
+               unsigned offset = i;
+               if (llvm_type_is_64bit(ctx, type))
+                       offset *= 2;
+
+               offset += component;
+               value[i + component] = buffer_load(&ctx->bld_base, type, offset,
+                                                  ctx->tess_offchip_ring, base, addr, true);
        }
 
        return ac_build_varying_gather_values(&ctx->ac, value, num_components, component);
@@ -1405,7 +1444,7 @@ static void store_output_tcs(struct lp_build_tgsi_context *bld_base,
                }
        }
 
-       buffer = desc_from_addr_base64k(ctx, ctx->param_tcs_offchip_addr_base64k);
+       buffer = get_tess_ring_descriptor(ctx, TESS_OFFCHIP_RING_TCS);
 
        base = LLVMGetParam(ctx->main_fn, ctx->param_tcs_offchip_offset);
        buf_addr = get_tcs_tes_buffer_address_from_reg(ctx, reg, NULL);
@@ -1445,7 +1484,7 @@ static void store_output_tcs(struct lp_build_tgsi_context *bld_base,
        }
 
        if (reg->Register.WriteMask == 0xF && !is_tess_factor) {
-               LLVMValueRef value = lp_build_gather_values(&ctx->gallivm,
+               LLVMValueRef value = ac_build_gather_values(&ctx->ac,
                                                            values, 4);
                ac_build_buffer_store_dword(&ctx->ac, buffer, value, 4, buf_addr,
                                            base, 0, 1, 0, true, false);
@@ -1453,19 +1492,18 @@ static void store_output_tcs(struct lp_build_tgsi_context *bld_base,
 }
 
 static void si_nir_store_output_tcs(struct ac_shader_abi *abi,
+                                   const struct nir_variable *var,
                                    LLVMValueRef vertex_index,
                                    LLVMValueRef param_index,
                                    unsigned const_index,
-                                   unsigned location,
-                                   unsigned driver_location,
                                    LLVMValueRef src,
-                                   unsigned component,
-                                   bool is_patch,
-                                   bool is_compact,
                                    unsigned writemask)
 {
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
        struct tgsi_shader_info *info = &ctx->shader->selector->info;
+       const unsigned component = var->data.location_frac;
+       const bool is_patch = var->data.patch;
+       unsigned driver_location = var->data.driver_location;
        LLVMValueRef dw_addr, stride;
        LLVMValueRef buffer, base, addr;
        LLVMValueRef values[4];
@@ -1520,7 +1558,7 @@ static void si_nir_store_output_tcs(struct ac_shader_abi *abi,
                }
        }
 
-       buffer = desc_from_addr_base64k(ctx, ctx->param_tcs_offchip_addr_base64k);
+       buffer = get_tess_ring_descriptor(ctx, TESS_OFFCHIP_RING_TCS);
 
        base = LLVMGetParam(ctx->main_fn, ctx->param_tcs_offchip_offset);
 
@@ -1537,7 +1575,7 @@ static void si_nir_store_output_tcs(struct ac_shader_abi *abi,
 
                /* Skip LDS stores if there is no LDS read of this output. */
                if (!skip_lds_store)
-                       ac_lds_store(&ctx->ac, dw_addr, value);
+                       lds_store(ctx, chan, dw_addr, value);
 
                value = ac_to_integer(&ctx->ac, value);
                values[chan] = value;
@@ -1562,7 +1600,7 @@ static void si_nir_store_output_tcs(struct ac_shader_abi *abi,
        }
 
        if (writemask == 0xF && !is_tess_factor) {
-               LLVMValueRef value = lp_build_gather_values(&ctx->gallivm,
+               LLVMValueRef value = ac_build_gather_values(&ctx->ac,
                                                            values, 4);
                ac_build_buffer_store_dword(&ctx->ac, buffer, value, 4, addr,
                                            base, 0, 1, 0, true, false);
@@ -1578,7 +1616,6 @@ LLVMValueRef si_llvm_load_input_gs(struct ac_shader_abi *abi,
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
        struct lp_build_tgsi_context *bld_base = &ctx->bld_base;
        struct si_shader *shader = ctx->shader;
-       struct lp_build_context *uint = &ctx->bld_base.uint_bld;
        LLVMValueRef vtx_offset, soffset;
        struct tgsi_shader_info *info = &shader->selector->info;
        unsigned semantic_name = info->input_semantic_name[input_index];
@@ -1586,7 +1623,7 @@ LLVMValueRef si_llvm_load_input_gs(struct ac_shader_abi *abi,
        unsigned param;
        LLVMValueRef value;
 
-       param = si_shader_io_get_unique_index(semantic_name, semantic_index);
+       param = si_shader_io_get_unique_index(semantic_name, semantic_index, false);
 
        /* GFX9 has the ESGS ring in LDS. */
        if (ctx->screen->info.chip_class >= GFX9) {
@@ -1594,15 +1631,15 @@ LLVMValueRef si_llvm_load_input_gs(struct ac_shader_abi *abi,
 
                switch (index / 2) {
                case 0:
-                       vtx_offset = unpack_param(ctx, ctx->param_gs_vtx01_offset,
+                       vtx_offset = si_unpack_param(ctx, ctx->param_gs_vtx01_offset,
                                                  index % 2 ? 16 : 0, 16);
                        break;
                case 1:
-                       vtx_offset = unpack_param(ctx, ctx->param_gs_vtx23_offset,
+                       vtx_offset = si_unpack_param(ctx, ctx->param_gs_vtx23_offset,
                                                  index % 2 ? 16 : 0, 16);
                        break;
                case 2:
-                       vtx_offset = unpack_param(ctx, ctx->param_gs_vtx45_offset,
+                       vtx_offset = si_unpack_param(ctx, ctx->param_gs_vtx45_offset,
                                                  index % 2 ? 16 : 0, 16);
                        break;
                default:
@@ -1623,14 +1660,15 @@ LLVMValueRef si_llvm_load_input_gs(struct ac_shader_abi *abi,
                        values[chan] = si_llvm_load_input_gs(abi, input_index, vtx_offset_param,
                                                             type, chan);
                }
-               return lp_build_gather_values(&ctx->gallivm, values,
+               return ac_build_gather_values(&ctx->ac, values,
                                              TGSI_NUM_CHANNELS);
        }
 
        /* Get the vertex offset parameter on GFX6. */
        LLVMValueRef gs_vtx_offset = ctx->gs_vtx_offset[vtx_offset_param];
 
-       vtx_offset = lp_build_mul_imm(uint, gs_vtx_offset, 4);
+       vtx_offset = LLVMBuildMul(ctx->ac.builder, gs_vtx_offset,
+                                 LLVMConstInt(ctx->i32, 4, 0), "");
 
        soffset = LLVMConstInt(ctx->i32, (param * 4 + swizzle) * 256, 0);
 
@@ -1648,6 +1686,31 @@ LLVMValueRef si_llvm_load_input_gs(struct ac_shader_abi *abi,
        return LLVMBuildBitCast(ctx->ac.builder, value, type, "");
 }
 
+static LLVMValueRef si_nir_load_input_gs(struct ac_shader_abi *abi,
+                                        unsigned location,
+                                        unsigned driver_location,
+                                        unsigned component,
+                                        unsigned num_components,
+                                        unsigned vertex_index,
+                                        unsigned const_index,
+                                        LLVMTypeRef type)
+{
+       struct si_shader_context *ctx = si_shader_context_from_abi(abi);
+
+       LLVMValueRef value[4];
+       for (unsigned i = 0; i < num_components; i++) {
+               unsigned offset = i;
+               if (llvm_type_is_64bit(ctx, type))
+                       offset *= 2;
+
+               offset += component;
+               value[i + component] = si_llvm_load_input_gs(&ctx->abi, driver_location  / 4,
+                                                            vertex_index, type, offset);
+       }
+
+       return ac_build_varying_gather_values(&ctx->ac, value, num_components, component);
+}
+
 static LLVMValueRef fetch_input_gs(
        struct lp_build_tgsi_context *bld_base,
        const struct tgsi_full_src_register *reg,
@@ -1820,7 +1883,6 @@ void si_llvm_load_input_fs(
        unsigned input_index,
        LLVMValueRef out[4])
 {
-       struct lp_build_context *base = &ctx->bld_base.base;
        struct si_shader *shader = ctx->shader;
        struct tgsi_shader_info *info = &shader->selector->info;
        LLVMValueRef main_fn = ctx->main_fn;
@@ -1837,11 +1899,12 @@ void si_llvm_load_input_fs(
                unsigned mask = colors_read >> (semantic_index * 4);
                unsigned offset = SI_PARAM_POS_FIXED_PT + 1 +
                                  (semantic_index ? util_bitcount(colors_read & 0xf) : 0);
+               LLVMValueRef undef = LLVMGetUndef(ctx->f32);
 
-               out[0] = mask & 0x1 ? LLVMGetParam(main_fn, offset++) : base->undef;
-               out[1] = mask & 0x2 ? LLVMGetParam(main_fn, offset++) : base->undef;
-               out[2] = mask & 0x4 ? LLVMGetParam(main_fn, offset++) : base->undef;
-               out[3] = mask & 0x8 ? LLVMGetParam(main_fn, offset++) : base->undef;
+               out[0] = mask & 0x1 ? LLVMGetParam(main_fn, offset++) : undef;
+               out[1] = mask & 0x2 ? LLVMGetParam(main_fn, offset++) : undef;
+               out[2] = mask & 0x4 ? LLVMGetParam(main_fn, offset++) : undef;
+               out[3] = mask & 0x8 ? LLVMGetParam(main_fn, offset++) : undef;
                return;
        }
 
@@ -1869,9 +1932,28 @@ static void declare_input_fs(
        si_llvm_load_input_fs(ctx, input_index, out);
 }
 
-static LLVMValueRef get_sample_id(struct si_shader_context *ctx)
+LLVMValueRef si_get_sample_id(struct si_shader_context *ctx)
+{
+       return si_unpack_param(ctx, SI_PARAM_ANCILLARY, 8, 4);
+}
+
+static LLVMValueRef get_base_vertex(struct ac_shader_abi *abi)
 {
-       return unpack_param(ctx, SI_PARAM_ANCILLARY, 8, 4);
+       struct si_shader_context *ctx = si_shader_context_from_abi(abi);
+
+       /* For non-indexed draws, the base vertex set by the driver
+        * (for direct draws) or the CP (for indirect draws) is the
+        * first vertex ID, but GLSL expects 0 to be returned.
+        */
+       LLVMValueRef vs_state = LLVMGetParam(ctx->main_fn,
+                                            ctx->param_vs_state_bits);
+       LLVMValueRef indexed;
+
+       indexed = LLVMBuildLShr(ctx->ac.builder, vs_state, ctx->i32_1, "");
+       indexed = LLVMBuildTrunc(ctx->ac.builder, indexed, ctx->i1, "");
+
+       return LLVMBuildSelect(ctx->ac.builder, indexed, ctx->abi.base_vertex,
+                              ctx->i32_0, "");
 }
 
 static LLVMValueRef get_block_size(struct ac_shader_abi *abi)
@@ -1893,7 +1975,7 @@ static LLVMValueRef get_block_size(struct ac_shader_abi *abi)
                for (i = 0; i < 3; ++i)
                        values[i] = LLVMConstInt(ctx->i32, sizes[i], 0);
 
-               result = lp_build_gather_values(&ctx->gallivm, values, 3);
+               result = ac_build_gather_values(&ctx->ac, values, 3);
        } else {
                result = LLVMGetParam(ctx->main_fn, ctx->param_block_size);
        }
@@ -1915,13 +1997,12 @@ static LLVMValueRef buffer_load_const(struct si_shader_context *ctx,
 static LLVMValueRef load_sample_position(struct ac_shader_abi *abi, LLVMValueRef sample_id)
 {
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
-       struct lp_build_context *uint_bld = &ctx->bld_base.uint_bld;
        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_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 offset0 = LLVMBuildMul(ctx->ac.builder, sample_id, LLVMConstInt(ctx->i32, 8, 0), "");
        LLVMValueRef offset1 = LLVMBuildAdd(ctx->ac.builder, offset0, LLVMConstInt(ctx->i32, 4, 0), "");
 
        LLVMValueRef pos[4] = {
@@ -1931,21 +2012,18 @@ static LLVMValueRef load_sample_position(struct ac_shader_abi *abi, LLVMValueRef
                LLVMConstReal(ctx->f32, 0)
        };
 
-       return lp_build_gather_values(&ctx->gallivm, pos, 4);
+       return ac_build_gather_values(&ctx->ac, pos, 4);
 }
 
 static LLVMValueRef load_sample_mask_in(struct ac_shader_abi *abi)
 {
-       return abi->sample_coverage;
+       struct si_shader_context *ctx = si_shader_context_from_abi(abi);
+       return ac_to_integer(&ctx->ac, abi->sample_coverage);
 }
 
-static LLVMValueRef si_load_tess_coord(struct ac_shader_abi *abi,
-                                      LLVMTypeRef type,
-                                      unsigned num_components)
+static LLVMValueRef si_load_tess_coord(struct ac_shader_abi *abi)
 {
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
-       struct lp_build_context *bld = &ctx->bld_base.base;
-
        LLVMValueRef coord[4] = {
                LLVMGetParam(ctx->main_fn, ctx->param_tes_u),
                LLVMGetParam(ctx->main_fn, ctx->param_tes_v),
@@ -1955,28 +2033,27 @@ static LLVMValueRef si_load_tess_coord(struct ac_shader_abi *abi,
 
        /* 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, ctx->ac.f32_1,
-                                       lp_build_add(bld, coord[0], coord[1]));
-
-       return lp_build_gather_values(&ctx->gallivm, coord, 4);
+           PIPE_PRIM_TRIANGLES) {
+               coord[2] = LLVMBuildFSub(ctx->ac.builder, ctx->ac.f32_1,
+                                        LLVMBuildFAdd(ctx->ac.builder,
+                                                      coord[0], coord[1], ""), "");
+       }
+       return ac_build_gather_values(&ctx->ac, coord, 4);
 }
 
 static LLVMValueRef load_tess_level(struct si_shader_context *ctx,
                                    unsigned semantic_name)
 {
-       LLVMValueRef buffer, base, addr;
+       LLVMValueRef base, addr;
 
        int param = si_shader_io_get_unique_index_patch(semantic_name, 0);
 
-       buffer = desc_from_addr_base64k(ctx, ctx->param_tcs_offchip_addr_base64k);
-
        base = LLVMGetParam(ctx->main_fn, ctx->param_tcs_offchip_offset);
        addr = get_tcs_tes_buffer_address(ctx, get_rel_patch_id(ctx), NULL,
                                          LLVMConstInt(ctx->i32, param, 0));
 
        return buffer_load(&ctx->bld_base, ctx->f32,
-                          ~0, buffer, base, addr, true);
+                          ~0, ctx->tess_offchip_ring, base, addr, true);
 
 }
 
@@ -2005,7 +2082,7 @@ static LLVMValueRef si_load_patch_vertices_in(struct ac_shader_abi *abi)
 {
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
        if (ctx->type == PIPE_SHADER_TESS_CTRL)
-               return unpack_param(ctx, ctx->param_tcs_out_lds_layout, 26, 6);
+               return si_unpack_param(ctx, ctx->param_tcs_out_lds_layout, 13, 6);
        else if (ctx->type == PIPE_SHADER_TESS_EVAL)
                return get_num_tcs_out_vertices(ctx);
        else
@@ -2038,21 +2115,8 @@ void si_load_system_value(struct si_shader_context *ctx,
                break;
 
        case TGSI_SEMANTIC_BASEVERTEX:
-       {
-               /* For non-indexed draws, the base vertex set by the driver
-                * (for direct draws) or the CP (for indirect draws) is the
-                * first vertex ID, but GLSL expects 0 to be returned.
-                */
-               LLVMValueRef vs_state = LLVMGetParam(ctx->main_fn, ctx->param_vs_state_bits);
-               LLVMValueRef indexed;
-
-               indexed = LLVMBuildLShr(ctx->ac.builder, vs_state, ctx->i32_1, "");
-               indexed = LLVMBuildTrunc(ctx->ac.builder, indexed, ctx->i1, "");
-
-               value = LLVMBuildSelect(ctx->ac.builder, indexed,
-                                       ctx->abi.base_vertex, ctx->i32_0, "");
+               value = get_base_vertex(&ctx->abi);
                break;
-       }
 
        case TGSI_SEMANTIC_BASEINSTANCE:
                value = ctx->abi.start_instance;
@@ -2077,11 +2141,10 @@ void si_load_system_value(struct si_shader_context *ctx,
                        LLVMGetParam(ctx->main_fn, SI_PARAM_POS_X_FLOAT),
                        LLVMGetParam(ctx->main_fn, SI_PARAM_POS_Y_FLOAT),
                        LLVMGetParam(ctx->main_fn, SI_PARAM_POS_Z_FLOAT),
-                       lp_build_emit_llvm_unary(&ctx->bld_base, TGSI_OPCODE_RCP,
-                                                LLVMGetParam(ctx->main_fn,
-                                                             SI_PARAM_POS_W_FLOAT)),
+                       ac_build_fdiv(&ctx->ac, ctx->ac.f32_1,
+                                     LLVMGetParam(ctx->main_fn, SI_PARAM_POS_W_FLOAT)),
                };
-               value = lp_build_gather_values(&ctx->gallivm, pos, 4);
+               value = ac_build_gather_values(&ctx->ac, pos, 4);
                break;
        }
 
@@ -2090,7 +2153,7 @@ void si_load_system_value(struct si_shader_context *ctx,
                break;
 
        case TGSI_SEMANTIC_SAMPLEID:
-               value = get_sample_id(ctx);
+               value = si_get_sample_id(ctx);
                break;
 
        case TGSI_SEMANTIC_SAMPLEPOS: {
@@ -2100,11 +2163,9 @@ void si_load_system_value(struct si_shader_context *ctx,
                        LLVMConstReal(ctx->f32, 0),
                        LLVMConstReal(ctx->f32, 0)
                };
-               pos[0] = lp_build_emit_llvm_unary(&ctx->bld_base,
-                                                 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(&ctx->gallivm, pos, 4);
+               pos[0] = ac_build_fract(&ctx->ac, pos[0], 32);
+               pos[1] = ac_build_fract(&ctx->ac, pos[1], 32);
+               value = ac_build_gather_values(&ctx->ac, pos, 4);
                break;
        }
 
@@ -2116,7 +2177,7 @@ void si_load_system_value(struct si_shader_context *ctx,
                break;
 
        case TGSI_SEMANTIC_TESSCOORD:
-               value = si_load_tess_coord(&ctx->abi, NULL, 4);
+               value = si_load_tess_coord(&ctx->abi);
                break;
 
        case TGSI_SEMANTIC_VERTICESIN:
@@ -2142,7 +2203,7 @@ void si_load_system_value(struct si_shader_context *ctx,
                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(&ctx->gallivm, val, 4);
+               value = ac_build_gather_values(&ctx->ac, val, 4);
                break;
        }
 
@@ -2168,7 +2229,7 @@ void si_load_system_value(struct si_shader_context *ctx,
                                values[i] = ctx->abi.workgroup_ids[i];
                        }
                }
-               value = lp_build_gather_values(&ctx->gallivm, values, 3);
+               value = ac_build_gather_values(&ctx->ac, values, 3);
                break;
        }
 
@@ -2177,10 +2238,10 @@ void si_load_system_value(struct si_shader_context *ctx,
                break;
 
        case TGSI_SEMANTIC_HELPER_INVOCATION:
-               value = lp_build_intrinsic(ctx->ac.builder,
+               value = ac_build_intrinsic(&ctx->ac,
                                           "llvm.amdgcn.ps.live",
                                           ctx->i1, NULL, 0,
-                                          LP_FUNC_ATTR_READNONE);
+                                          AC_FUNC_ATTR_READNONE);
                value = LLVMBuildNot(ctx->ac.builder, value, "");
                value = LLVMBuildSExt(ctx->ac.builder, value, ctx->i32, "");
                break;
@@ -2233,20 +2294,18 @@ void si_load_system_value(struct si_shader_context *ctx,
        ctx->system_values[index] = value;
 }
 
-void si_declare_compute_memory(struct si_shader_context *ctx,
-                              const struct tgsi_full_declaration *decl)
+void si_declare_compute_memory(struct si_shader_context *ctx)
 {
        struct si_shader_selector *sel = ctx->shader->selector;
+       unsigned lds_size = sel->info.properties[TGSI_PROPERTY_CS_LOCAL_SIZE];
 
        LLVMTypeRef i8p = LLVMPointerType(ctx->i8, AC_LOCAL_ADDR_SPACE);
        LLVMValueRef var;
 
-       assert(decl->Declaration.MemType == TGSI_MEMORY_TYPE_SHARED);
-       assert(decl->Range.First == decl->Range.Last);
        assert(!ctx->ac.lds);
 
        var = LLVMAddGlobalInAddressSpace(ctx->ac.module,
-                                         LLVMArrayType(ctx->i8, sel->local_size),
+                                         LLVMArrayType(ctx->i8, lds_size),
                                          "compute_lds",
                                          AC_LOCAL_ADDR_SPACE);
        LLVMSetAlignment(var, 4);
@@ -2254,6 +2313,58 @@ void si_declare_compute_memory(struct si_shader_context *ctx,
        ctx->ac.lds = LLVMBuildBitCast(ctx->ac.builder, var, i8p, "");
 }
 
+void si_tgsi_declare_compute_memory(struct si_shader_context *ctx,
+                                   const struct tgsi_full_declaration *decl)
+{
+       assert(decl->Declaration.MemType == TGSI_MEMORY_TYPE_SHARED);
+       assert(decl->Range.First == decl->Range.Last);
+
+       si_declare_compute_memory(ctx);
+}
+
+static LLVMValueRef load_const_buffer_desc_fast_path(struct si_shader_context *ctx)
+{
+       LLVMValueRef ptr =
+               LLVMGetParam(ctx->main_fn, ctx->param_const_and_shader_buffers);
+       struct si_shader_selector *sel = ctx->shader->selector;
+
+       /* 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->ac.intptr, "");
+
+       LLVMValueRef desc0, desc1;
+       if (HAVE_32BIT_POINTERS) {
+               desc0 = ptr;
+               desc1 = LLVMConstInt(ctx->i32,
+                                    S_008F04_BASE_ADDRESS_HI(ctx->screen->info.address32_hi), 0);
+       } else {
+               ptr = LLVMBuildBitCast(ctx->ac.builder, ptr, ctx->v2i32, "");
+               desc0 = LLVMBuildExtractElement(ctx->ac.builder, ptr, ctx->i32_0, "");
+               desc1 = LLVMBuildExtractElement(ctx->ac.builder, ptr, ctx->i32_1, "");
+               /* Mask out all bits except BASE_ADDRESS_HI. */
+               desc1 = LLVMBuildAnd(ctx->ac.builder, desc1,
+                                    LLVMConstInt(ctx->i32, ~C_008F04_BASE_ADDRESS_HI, 0), "");
+       }
+
+       LLVMValueRef desc_elems[] = {
+               desc0,
+               desc1,
+               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)
+       };
+
+       return ac_build_gather_values(&ctx->ac, desc_elems, 4);
+}
+
 static LLVMValueRef load_const_buffer_desc(struct si_shader_context *ctx, int i)
 {
        LLVMValueRef list_ptr = LLVMGetParam(ctx->main_fn,
@@ -2266,8 +2377,15 @@ static LLVMValueRef load_const_buffer_desc(struct si_shader_context *ctx, int i)
 static LLVMValueRef load_ubo(struct ac_shader_abi *abi, LLVMValueRef index)
 {
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
+       struct si_shader_selector *sel = ctx->shader->selector;
+
        LLVMValueRef ptr = LLVMGetParam(ctx->main_fn, ctx->param_const_and_shader_buffers);
 
+       if (sel->info.const_buffers_declared == 1 &&
+           sel->info.shader_buffers_declared == 0) {
+               return load_const_buffer_desc_fast_path(ctx);
+       }
+
        index = si_llvm_bound_index(ctx, index, ctx->num_const_buffers);
        index = LLVMBuildAdd(ctx->ac.builder, index,
                             LLVMConstInt(ctx->i32, SI_NUM_SHADER_BUFFERS, 0), "");
@@ -2309,7 +2427,7 @@ static LLVMValueRef fetch_constant(
                for (chan = 0; chan < TGSI_NUM_CHANNELS; ++chan)
                        values[chan] = fetch_constant(bld_base, reg, type, chan);
 
-               return lp_build_gather_values(&ctx->gallivm, values, 4);
+               return ac_build_gather_values(&ctx->ac, values, 4);
        }
 
        /* Split 64-bit loads. */
@@ -2332,8 +2450,6 @@ static LLVMValueRef fetch_constant(
        /* 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
@@ -2348,35 +2464,17 @@ static LLVMValueRef fetch_constant(
                 * 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->info.chip_class == SI &&
-                    HAVE_LLVM < 0x0600 &&
-                    !reg->Register.Indirect) {
+               if (ctx->screen->info.chip_class == SI && HAVE_LLVM < 0x0600 &&
+                   !reg->Register.Indirect) {
+                       LLVMValueRef ptr =
+                               LLVMGetParam(ctx->main_fn, ctx->param_const_and_shader_buffers);
+
                        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 desc = load_const_buffer_desc_fast_path(ctx);
                LLVMValueRef result = buffer_load_const(ctx, desc, addr);
                return bitcast(bld_base, type, result);
        }
@@ -2562,9 +2660,9 @@ 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(ctx->ac.builder, "llvm.ctpop.i32",
+       coverage = ac_build_intrinsic(&ctx->ac, "llvm.ctpop.i32",
                                   ctx->i32,
-                                  &coverage, 1, LP_FUNC_ATTR_READNONE);
+                                  &coverage, 1, AC_FUNC_ATTR_READNONE);
 
        coverage = LLVMBuildUIToFP(ctx->ac.builder, coverage,
                                   ctx->f32, "");
@@ -2605,9 +2703,9 @@ static void si_llvm_emit_clipvertex(struct si_shader_context *ctx,
                                base_elt = buffer_load_const(ctx, const_resource,
                                                             addr);
                                args->out[chan] =
-                                       lp_build_add(&ctx->bld_base.base, args->out[chan],
-                                                    lp_build_mul(&ctx->bld_base.base, base_elt,
-                                                                 out_elts[const_chan]));
+                                       LLVMBuildFAdd(ctx->ac.builder, args->out[chan],
+                                                     LLVMBuildFMul(ctx->ac.builder, base_elt,
+                                                                   out_elts[const_chan], ""), "");
                        }
                }
 
@@ -2703,7 +2801,7 @@ static void si_llvm_emit_streamout(struct si_shader_context *ctx,
 
        /* Get bits [22:16], i.e. (so_param >> 16) & 127; */
        LLVMValueRef so_vtx_count =
-               unpack_param(ctx, ctx->param_streamout_config, 16, 7);
+               si_unpack_param(ctx, ctx->param_streamout_config, 16, 7);
 
        LLVMValueRef tid = ac_get_thread_id(&ctx->ac);
 
@@ -2816,7 +2914,8 @@ static void si_build_param_exports(struct si_shader_context *ctx,
                if ((semantic_name != TGSI_SEMANTIC_GENERIC ||
                     semantic_index < SI_MAX_IO_GENERIC) &&
                    shader->key.opt.kill_outputs &
-                   (1ull << si_shader_io_get_unique_index(semantic_name, semantic_index)))
+                   (1ull << si_shader_io_get_unique_index(semantic_name,
+                                                          semantic_index, true)))
                        continue;
 
                si_export_param(ctx, param_count, outputs[i].values);
@@ -2987,7 +3086,7 @@ static void si_copy_tcs_inputs(struct lp_build_tgsi_context *bld_base)
        uint64_t inputs;
 
        invocation_id = unpack_llvm_param(ctx, ctx->abi.tcs_rel_ids, 8, 5);
-       buffer = desc_from_addr_base64k(ctx, ctx->param_tcs_offchip_addr_base64k);
+       buffer = get_tess_ring_descriptor(ctx, TESS_OFFCHIP_RING_TCS);
        buffer_offset = LLVMGetParam(ctx->main_fn, ctx->param_tcs_offchip_offset);
 
        lds_vertex_stride = get_tcs_in_vertex_dw_stride(ctx);
@@ -3114,14 +3213,14 @@ 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(&ctx->gallivm, out, MIN2(stride, 4));
+       vec0 = ac_build_gather_values(&ctx->ac, out, MIN2(stride, 4));
        vec1 = NULL;
 
        if (stride > 4)
-               vec1 = lp_build_gather_values(&ctx->gallivm, out+4, stride - 4);
+               vec1 = ac_build_gather_values(&ctx->ac, out+4, stride - 4);
 
        /* Get the buffer. */
-       buffer = desc_from_addr_base64k(ctx, ctx->param_tcs_factor_addr_base64k);
+       buffer = get_tess_ring_descriptor(ctx, TCS_FACTOR_RING);
 
        /* Get the offset. */
        tf_base = LLVMGetParam(ctx->main_fn,
@@ -3161,7 +3260,7 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
                LLVMValueRef tf_inner_offset;
                unsigned param_outer, param_inner;
 
-               buf = desc_from_addr_base64k(ctx, ctx->param_tcs_offchip_addr_base64k);
+               buf = get_tess_ring_descriptor(ctx, TESS_OFFCHIP_RING_TCS);
                base = LLVMGetParam(ctx->main_fn, ctx->param_tcs_offchip_offset);
 
                param_outer = si_shader_io_get_unique_index_patch(
@@ -3169,7 +3268,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(&ctx->gallivm, outer,
+               outer_vec = ac_build_gather_values(&ctx->ac, outer,
                                                   util_next_power_of_two(outer_comps));
 
                ac_build_buffer_store_dword(&ctx->ac, buf, outer_vec,
@@ -3182,7 +3281,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(&ctx->gallivm, inner, inner_comps);
+                                   ac_build_gather_values(&ctx->ac, inner, inner_comps);
                        ac_build_buffer_store_dword(&ctx->ac, buf, inner_vec,
                                                    inner_comps, tf_inner_offset,
                                                    base, 0, 1, 0, true, false);
@@ -3214,12 +3313,18 @@ si_insert_input_ret_float(struct si_shader_context *ctx, LLVMValueRef ret,
 }
 
 static LLVMValueRef
-si_insert_input_ptr_as_2xi32(struct si_shader_context *ctx, LLVMValueRef ret,
-                            unsigned param, unsigned return_index)
+si_insert_input_ptr(struct si_shader_context *ctx, LLVMValueRef ret,
+                   unsigned param, unsigned return_index)
 {
        LLVMBuilderRef builder = ctx->ac.builder;
        LLVMValueRef ptr, lo, hi;
 
+       if (HAVE_32BIT_POINTERS) {
+               ptr = LLVMGetParam(ctx->main_fn, param);
+               ptr = LLVMBuildPtrToInt(builder, ptr, ctx->i32, "");
+               return LLVMBuildInsertValue(builder, ret, ptr, return_index, "");
+       }
+
        ptr = LLVMGetParam(ctx->main_fn, param);
        ptr = LLVMBuildPtrToInt(builder, ptr, ctx->i64, "");
        ptr = LLVMBuildBitCast(builder, ptr, ctx->v2i32, "");
@@ -3274,21 +3379,17 @@ static void si_llvm_emit_tcs_epilogue(struct ac_shader_abi *abi,
        if (ctx->screen->info.chip_class >= GFX9) {
                ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_offchip_layout,
                                          8 + GFX9_SGPR_TCS_OFFCHIP_LAYOUT);
-               ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_offchip_addr_base64k,
-                                         8 + GFX9_SGPR_TCS_OFFCHIP_ADDR_BASE64K);
-               ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_factor_addr_base64k,
-                                         8 + GFX9_SGPR_TCS_FACTOR_ADDR_BASE64K);
+               ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_out_lds_layout,
+                                         8 + GFX9_SGPR_TCS_OUT_LAYOUT);
                /* Tess offchip and tess factor offsets are at the beginning. */
                ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_offchip_offset, 2);
                ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_factor_offset, 4);
-               vgpr = 8 + GFX9_SGPR_TCS_FACTOR_ADDR_BASE64K + 1;
+               vgpr = 8 + GFX9_SGPR_TCS_OUT_LAYOUT + 1;
        } else {
                ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_offchip_layout,
                                          GFX6_SGPR_TCS_OFFCHIP_LAYOUT);
-               ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_offchip_addr_base64k,
-                                         GFX6_SGPR_TCS_OFFCHIP_ADDR_BASE64K);
-               ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_factor_addr_base64k,
-                                         GFX6_SGPR_TCS_FACTOR_ADDR_BASE64K);
+               ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_out_lds_layout,
+                                         GFX6_SGPR_TCS_OUT_LAYOUT);
                /* Tess offchip and tess factor offsets are after user SGPRs. */
                ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_offchip_offset,
                                          GFX6_TCS_NUM_USER_SGPR);
@@ -3330,35 +3431,34 @@ static void si_set_ls_return_value_for_tcs(struct si_shader_context *ctx)
 {
        LLVMValueRef ret = ctx->return_value;
 
+       ret = si_insert_input_ptr(ctx, ret, 0, 0);
+       if (HAVE_32BIT_POINTERS)
+               ret = si_insert_input_ptr(ctx, ret, 1, 1);
        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);
+       ret = si_insert_input_ptr(ctx, ret, ctx->param_rw_buffers,
+                                 8 + SI_SGPR_RW_BUFFERS);
+       ret = si_insert_input_ptr(ctx, ret,
+                                 ctx->param_bindless_samplers_and_images,
+                                 8 + SI_SGPR_BINDLESS_SAMPLERS_AND_IMAGES);
 
        ret = si_insert_input_ret(ctx, ret, ctx->param_vs_state_bits,
                                  8 + SI_SGPR_VS_STATE_BITS);
+
+#if !HAVE_32BIT_POINTERS
+       ret = si_insert_input_ptr(ctx, ret, ctx->param_vs_state_bits + 4,
+                                 8 + GFX9_SGPR_2ND_SAMPLERS_AND_IMAGES);
+#endif
+
        ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_offchip_layout,
                                  8 + GFX9_SGPR_TCS_OFFCHIP_LAYOUT);
        ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_out_lds_offsets,
                                  8 + GFX9_SGPR_TCS_OUT_OFFSETS);
        ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_out_lds_layout,
                                  8 + GFX9_SGPR_TCS_OUT_LAYOUT);
-       ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_offchip_addr_base64k,
-                                 8 + GFX9_SGPR_TCS_OFFCHIP_ADDR_BASE64K);
-       ret = si_insert_input_ret(ctx, ret, ctx->param_tcs_factor_addr_base64k,
-                                 8 + GFX9_SGPR_TCS_FACTOR_ADDR_BASE64K);
-
-       unsigned desc_param = ctx->param_tcs_factor_addr_base64k + 2;
-       ret = si_insert_input_ptr_as_2xi32(ctx, ret, desc_param,
-                                          8 + GFX9_SGPR_TCS_CONST_AND_SHADER_BUFFERS);
-       ret = si_insert_input_ptr_as_2xi32(ctx, ret, desc_param + 1,
-                                          8 + GFX9_SGPR_TCS_SAMPLERS_AND_IMAGES);
 
        unsigned vgpr = 8 + GFX9_TCS_NUM_USER_SGPR;
        ret = LLVMBuildInsertValue(ctx->ac.builder, ret,
@@ -3375,23 +3475,30 @@ static void si_set_es_return_value_for_gs(struct si_shader_context *ctx)
 {
        LLVMValueRef ret = ctx->return_value;
 
+       ret = si_insert_input_ptr(ctx, ret, 0, 0);
+       if (HAVE_32BIT_POINTERS)
+               ret = si_insert_input_ptr(ctx, ret, 1, 1);
        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);
+       ret = si_insert_input_ptr(ctx, ret, ctx->param_rw_buffers,
+                                 8 + SI_SGPR_RW_BUFFERS);
+       ret = si_insert_input_ptr(ctx, ret,
+                                 ctx->param_bindless_samplers_and_images,
+                                 8 + SI_SGPR_BINDLESS_SAMPLERS_AND_IMAGES);
 
-       unsigned desc_param = ctx->param_vs_state_bits + 1;
-       ret = si_insert_input_ptr_as_2xi32(ctx, ret, desc_param,
-                                          8 + GFX9_SGPR_GS_CONST_AND_SHADER_BUFFERS);
-       ret = si_insert_input_ptr_as_2xi32(ctx, ret, desc_param + 1,
-                                          8 + GFX9_SGPR_GS_SAMPLERS_AND_IMAGES);
+#if !HAVE_32BIT_POINTERS
+       ret = si_insert_input_ptr(ctx, ret, ctx->param_vs_state_bits + 4,
+                                 8 + GFX9_SGPR_2ND_SAMPLERS_AND_IMAGES);
+#endif
+
+       unsigned vgpr;
+       if (ctx->type == PIPE_SHADER_VERTEX)
+               vgpr = 8 + GFX9_VSGS_NUM_USER_SGPR;
+       else
+               vgpr = 8 + GFX9_TESGS_NUM_USER_SGPR;
 
-       unsigned vgpr = 8 + GFX9_GS_NUM_USER_SGPR;
        for (unsigned i = 0; i < 5; i++) {
                unsigned param = ctx->param_gs_vtx01_offset + i;
                ret = si_insert_input_ret_float(ctx, ret, param, vgpr++);
@@ -3438,7 +3545,7 @@ static void si_llvm_emit_ls_epilogue(struct ac_shader_abi *abi,
                    name == TGSI_SEMANTIC_VIEWPORT_INDEX)
                        continue;
 
-               int param = si_shader_io_get_unique_index(name, index);
+               int param = si_shader_io_get_unique_index(name, index, false);
                LLVMValueRef dw_addr = LLVMBuildAdd(ctx->ac.builder, base_dw_addr,
                                        LLVMConstInt(ctx->i32, param * 4, 0), "");
 
@@ -3471,7 +3578,7 @@ static void si_llvm_emit_es_epilogue(struct ac_shader_abi *abi,
        if (ctx->screen->info.chip_class >= GFX9 && info->num_outputs) {
                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);
+               LLVMValueRef wave_idx = si_unpack_param(ctx, ctx->param_merged_wave_info, 24, 4);
                vertex_idx = LLVMBuildOr(ctx->ac.builder, vertex_idx,
                                         LLVMBuildMul(ctx->ac.builder, wave_idx,
                                                      LLVMConstInt(ctx->i32, 64, false), ""), "");
@@ -3487,9 +3594,12 @@ static void si_llvm_emit_es_epilogue(struct ac_shader_abi *abi,
                        continue;
 
                param = si_shader_io_get_unique_index(info->output_semantic_name[i],
-                                                     info->output_semantic_index[i]);
+                                                     info->output_semantic_index[i], false);
 
                for (chan = 0; chan < 4; chan++) {
+                       if (!(info->output_usagemask[i] & (1 << chan)))
+                               continue;
+
                        LLVMValueRef out_val = LLVMBuildLoad(ctx->ac.builder, addrs[4 * i + chan], "");
                        out_val = ac_to_integer(&ctx->ac, out_val);
 
@@ -3514,7 +3624,7 @@ static void si_llvm_emit_es_epilogue(struct ac_shader_abi *abi,
 static LLVMValueRef si_get_gs_wave_id(struct si_shader_context *ctx)
 {
        if (ctx->screen->info.chip_class >= GFX9)
-               return unpack_param(ctx, ctx->param_merged_wave_info, 16, 8);
+               return si_unpack_param(ctx, ctx->param_merged_wave_info, 16, 8);
        else
                return LLVMGetParam(ctx->main_fn, ctx->param_gs_wave_id);
 }
@@ -3566,38 +3676,36 @@ static void si_llvm_emit_vs_epilogue(struct ac_shader_abi *abi,
         * an IF statement is added that clamps all colors if the constant
         * is true.
         */
-       if (ctx->type == PIPE_SHADER_VERTEX) {
-               struct lp_build_if_state if_ctx;
-               LLVMValueRef cond = NULL;
-               LLVMValueRef addr, val;
-
-               for (i = 0; i < info->num_outputs; i++) {
-                       if (info->output_semantic_name[i] != TGSI_SEMANTIC_COLOR &&
-                           info->output_semantic_name[i] != TGSI_SEMANTIC_BCOLOR)
-                               continue;
+       struct lp_build_if_state if_ctx;
+       LLVMValueRef cond = NULL;
+       LLVMValueRef addr, val;
 
-                       /* We've found a color. */
-                       if (!cond) {
-                               /* The state is in the first bit of the user SGPR. */
-                               cond = LLVMGetParam(ctx->main_fn,
-                                                   ctx->param_vs_state_bits);
-                               cond = LLVMBuildTrunc(ctx->ac.builder, cond,
-                                                     ctx->i1, "");
-                               lp_build_if(&if_ctx, &ctx->gallivm, cond);
-                       }
+       for (i = 0; i < info->num_outputs; i++) {
+               if (info->output_semantic_name[i] != TGSI_SEMANTIC_COLOR &&
+                   info->output_semantic_name[i] != TGSI_SEMANTIC_BCOLOR)
+                       continue;
 
-                       for (j = 0; j < 4; j++) {
-                               addr = addrs[4 * i + j];
-                               val = LLVMBuildLoad(ctx->ac.builder, addr, "");
-                               val = ac_build_clamp(&ctx->ac, val);
-                               LLVMBuildStore(ctx->ac.builder, val, addr);
-                       }
+               /* We've found a color. */
+               if (!cond) {
+                       /* The state is in the first bit of the user SGPR. */
+                       cond = LLVMGetParam(ctx->main_fn,
+                                           ctx->param_vs_state_bits);
+                       cond = LLVMBuildTrunc(ctx->ac.builder, cond,
+                                             ctx->i1, "");
+                       lp_build_if(&if_ctx, &ctx->gallivm, cond);
                }
 
-               if (cond)
-                       lp_build_endif(&if_ctx);
+               for (j = 0; j < 4; j++) {
+                       addr = addrs[4 * i + j];
+                       val = LLVMBuildLoad(ctx->ac.builder, addr, "");
+                       val = ac_build_clamp(&ctx->ac, val);
+                       LLVMBuildStore(ctx->ac.builder, val, addr);
+               }
        }
 
+       if (cond)
+               lp_build_endif(&if_ctx);
+
        for (i = 0; i < info->num_outputs; i++) {
                outputs[i].semantic_name = info->output_semantic_name[i];
                outputs[i].semantic_index = info->output_semantic_index[i];
@@ -3909,11 +4017,13 @@ static LLVMValueRef si_llvm_emit_ddxy_interp(
        for (i = 0; i < 2; i++) {
                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);
+               result[i] = ac_build_ddxy(&ctx->ac, AC_TID_MASK_TOP_LEFT, 1,
+                                         ac_to_integer(&ctx->ac, a)); /* DDX */
+               result[2+i] = ac_build_ddxy(&ctx->ac, AC_TID_MASK_TOP_LEFT, 2,
+                                           ac_to_integer(&ctx->ac, a)); /* DDY */
        }
 
-       return lp_build_gather_values(&ctx->gallivm, result, 4);
+       return ac_build_gather_values(&ctx->ac, result, 4);
 }
 
 static void interp_fetch_args(
@@ -3966,7 +4076,7 @@ static void interp_fetch_args(
                                ctx->ac.f32_0,
                        };
 
-                       sample_position = lp_build_gather_values(&ctx->gallivm, center, 4);
+                       sample_position = ac_build_gather_values(&ctx->ac, center, 4);
                } else {
                        sample_position = load_sample_position(&ctx->abi, sample_id);
                }
@@ -4074,7 +4184,7 @@ static void build_interp_intrinsic(const struct lp_build_tgsi_action *action,
 
                        ij_out[i] = LLVMBuildFAdd(ctx->ac.builder, temp2, temp1, "");
                }
-               interp_param = lp_build_gather_values(&ctx->gallivm, ij_out, 2);
+               interp_param = ac_build_gather_values(&ctx->ac, ij_out, 2);
        }
 
        if (interp_param)
@@ -4215,7 +4325,6 @@ static void si_llvm_emit_vertex(struct ac_shader_abi *abi,
 {
        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 lp_build_if_state if_state;
        LLVMValueRef soffset = LLVMGetParam(ctx->main_fn,
@@ -4262,8 +4371,9 @@ static void si_llvm_emit_vertex(struct ac_shader_abi *abi,
                                             shader->selector->gs_max_out_vertices, 0);
                        offset++;
 
-                       voffset = lp_build_add(uint, voffset, gs_next_vertex);
-                       voffset = lp_build_mul_imm(uint, voffset, 4);
+                       voffset = LLVMBuildAdd(ctx->ac.builder, voffset, gs_next_vertex, "");
+                       voffset = LLVMBuildMul(ctx->ac.builder, voffset,
+                                              LLVMConstInt(ctx->i32, 4, 0), "");
 
                        out_val = ac_to_integer(&ctx->ac, out_val);
 
@@ -4275,9 +4385,7 @@ static void si_llvm_emit_vertex(struct ac_shader_abi *abi,
                }
        }
 
-       gs_next_vertex = lp_build_add(uint, gs_next_vertex,
-                                     ctx->i32_1);
-
+       gs_next_vertex = LLVMBuildAdd(ctx->ac.builder, gs_next_vertex, ctx->i32_1, "");
        LLVMBuildStore(ctx->ac.builder, gs_next_vertex, ctx->gs_next_vertex[stream]);
 
        /* Signal vertex emission */
@@ -4337,9 +4445,9 @@ static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
                return;
        }
 
-       lp_build_intrinsic(ctx->ac.builder,
+       ac_build_intrinsic(&ctx->ac,
                           "llvm.amdgcn.s.barrier",
-                          ctx->voidt, NULL, 0, LP_FUNC_ATTR_CONVERGENT);
+                          ctx->voidt, NULL, 0, AC_FUNC_ATTR_CONVERGENT);
 }
 
 static const struct lp_build_tgsi_action interp_action = {
@@ -4369,10 +4477,12 @@ static void si_create_function(struct si_shader_context *ctx,
                 * allows the optimization passes to move loads and reduces
                 * SGPR spilling significantly.
                 */
-               lp_add_function_attr(ctx->main_fn, i + 1, LP_FUNC_ATTR_INREG);
+               ac_add_function_attr(ctx->ac.context, ctx->main_fn, i + 1,
+                                    AC_FUNC_ATTR_INREG);
 
                if (LLVMGetTypeKind(LLVMTypeOf(P)) == LLVMPointerTypeKind) {
-                       lp_add_function_attr(ctx->main_fn, i + 1, LP_FUNC_ATTR_NOALIAS);
+                       ac_add_function_attr(ctx->ac.context, ctx->main_fn, i + 1,
+                                            AC_FUNC_ATTR_NOALIAS);
                        ac_add_attr_dereferenceable(P, UINT64_MAX);
                }
        }
@@ -4382,9 +4492,16 @@ static void si_create_function(struct si_shader_context *ctx,
                        *fninfo->assign[i] = LLVMGetParam(ctx->main_fn, i);
        }
 
+       if (ctx->screen->info.address32_hi) {
+               ac_llvm_add_target_dep_function_attr(ctx->main_fn,
+                                                    "amdgpu-32bit-address-high-bits",
+                                                    ctx->screen->info.address32_hi);
+       }
+
        if (max_workgroup_size) {
-               si_llvm_add_attribute(ctx->main_fn, "amdgpu-max-work-group-size",
-                                     max_workgroup_size);
+               ac_llvm_add_target_dep_function_attr(ctx->main_fn,
+                                                    "amdgpu-max-work-group-size",
+                                                    max_workgroup_size);
        }
        LLVMAddTargetDependentFunctionAttr(ctx->main_fn,
                                           "no-signed-zeros-fp-math",
@@ -4464,9 +4581,9 @@ static unsigned si_get_max_workgroup_size(const struct si_shader *shader)
        return max_work_group_size;
 }
 
-static void declare_per_stage_desc_pointers(struct si_shader_context *ctx,
-                                           struct si_function_info *fninfo,
-                                           bool assign_params)
+static void declare_const_and_shader_buffers(struct si_shader_context *ctx,
+                                            struct si_function_info *fninfo,
+                                            bool assign_params)
 {
        LLVMTypeRef const_shader_buf_type;
 
@@ -4478,36 +4595,48 @@ static void declare_per_stage_desc_pointers(struct si_shader_context *ctx,
 
        unsigned const_and_shader_buffers =
                add_arg(fninfo, ARG_SGPR,
-                       ac_array_in_const_addr_space(const_shader_buf_type));
+                       ac_array_in_const32_addr_space(const_shader_buf_type));
+
+       if (assign_params)
+               ctx->param_const_and_shader_buffers = const_and_shader_buffers;
+}
 
+static void declare_samplers_and_images(struct si_shader_context *ctx,
+                                       struct si_function_info *fninfo,
+                                       bool assign_params)
+{
        unsigned samplers_and_images =
                add_arg(fninfo, ARG_SGPR,
-                       ac_array_in_const_addr_space(ctx->v8i32));
+                       ac_array_in_const32_addr_space(ctx->v8i32));
 
-       if (assign_params) {
-               ctx->param_const_and_shader_buffers = const_and_shader_buffers;
+       if (assign_params)
                ctx->param_samplers_and_images = samplers_and_images;
-       }
+}
+
+static void declare_per_stage_desc_pointers(struct si_shader_context *ctx,
+                                           struct si_function_info *fninfo,
+                                           bool assign_params)
+{
+       declare_const_and_shader_buffers(ctx, fninfo, assign_params);
+       declare_samplers_and_images(ctx, fninfo, assign_params);
 }
 
 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,
-               ac_array_in_const_addr_space(ctx->v4i32));
+               ac_array_in_const32_addr_space(ctx->v4i32));
        ctx->param_bindless_samplers_and_images = add_arg(fninfo, ARG_SGPR,
-               ac_array_in_const_addr_space(ctx->v8i32));
+               ac_array_in_const32_addr_space(ctx->v8i32));
 }
 
 static void declare_vs_specific_input_sgprs(struct si_shader_context *ctx,
                                            struct si_function_info *fninfo)
 {
-       ctx->param_vertex_buffers = add_arg(fninfo, ARG_SGPR,
-               ac_array_in_const_addr_space(ctx->v4i32));
+       ctx->param_vs_state_bits = add_arg(fninfo, ARG_SGPR, ctx->i32);
        add_arg_assign(fninfo, ARG_SGPR, ctx->i32, &ctx->abi.base_vertex);
        add_arg_assign(fninfo, ARG_SGPR, ctx->i32, &ctx->abi.start_instance);
        add_arg_assign(fninfo, ARG_SGPR, ctx->i32, &ctx->abi.draw_id);
-       ctx->param_vs_state_bits = add_arg(fninfo, ARG_SGPR, ctx->i32);
 }
 
 static void declare_vs_input_vgprs(struct si_shader_context *ctx,
@@ -4605,6 +4734,8 @@ static void create_function(struct si_shader_context *ctx)
 
                declare_per_stage_desc_pointers(ctx, &fninfo, true);
                declare_vs_specific_input_sgprs(ctx, &fninfo);
+               ctx->param_vertex_buffers = add_arg(&fninfo, ARG_SGPR,
+                       ac_array_in_const32_addr_space(ctx->v4i32));
 
                if (shader->key.as_es) {
                        ctx->param_es2gs_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
@@ -4612,7 +4743,7 @@ static void create_function(struct si_shader_context *ctx)
                        /* no extra parameters */
                } else {
                        if (shader->is_gs_copy_shader) {
-                               fninfo.num_params = ctx->param_rw_buffers + 1;
+                               fninfo.num_params = ctx->param_vs_state_bits + 1;
                                fninfo.num_sgpr_params = fninfo.num_params;
                        }
 
@@ -4632,8 +4763,6 @@ static void create_function(struct si_shader_context *ctx)
                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);
                ctx->param_vs_state_bits = add_arg(&fninfo, ARG_SGPR, ctx->i32);
-               ctx->param_tcs_offchip_addr_base64k = add_arg(&fninfo, ARG_SGPR, ctx->i32);
-               ctx->param_tcs_factor_addr_base64k = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_tcs_offchip_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_tcs_factor_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
 
@@ -4652,8 +4781,14 @@ static void create_function(struct si_shader_context *ctx)
 
        case SI_SHADER_MERGED_VERTEX_TESSCTRL:
                /* Merged stages have 8 system SGPRs at the beginning. */
-               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 */
+               /* SPI_SHADER_USER_DATA_ADDR_LO/HI_HS */
+               if (HAVE_32BIT_POINTERS) {
+                       declare_per_stage_desc_pointers(ctx, &fninfo,
+                                                       ctx->type == PIPE_SHADER_TESS_CTRL);
+               } else {
+                       declare_const_and_shader_buffers(ctx, &fninfo,
+                                                        ctx->type == PIPE_SHADER_TESS_CTRL);
+               }
                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);
@@ -4666,15 +4801,17 @@ static void create_function(struct si_shader_context *ctx)
                                                ctx->type == PIPE_SHADER_VERTEX);
                declare_vs_specific_input_sgprs(ctx, &fninfo);
 
+               if (!HAVE_32BIT_POINTERS) {
+                       declare_samplers_and_images(ctx, &fninfo,
+                                                   ctx->type == PIPE_SHADER_TESS_CTRL);
+               }
                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);
-               ctx->param_tcs_offchip_addr_base64k = add_arg(&fninfo, ARG_SGPR, ctx->i32);
-               ctx->param_tcs_factor_addr_base64k = add_arg(&fninfo, ARG_SGPR, ctx->i32);
-               add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused */
-
-               declare_per_stage_desc_pointers(ctx, &fninfo,
-                                               ctx->type == PIPE_SHADER_TESS_CTRL);
+               if (!HAVE_32BIT_POINTERS) /* Align to 2 dwords. */
+                       add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused */
+               ctx->param_vertex_buffers = add_arg(&fninfo, ARG_SGPR,
+                       ac_array_in_const32_addr_space(ctx->v4i32));
 
                /* VGPRs (first TCS, then VS) */
                add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->abi.tcs_patch_id);
@@ -4696,7 +4833,7 @@ static void create_function(struct si_shader_context *ctx)
                         * param_tcs_offchip_layout, and param_rw_buffers
                         * should be passed to the epilog.
                         */
-                       for (i = 0; i <= 8 + GFX9_SGPR_TCS_FACTOR_ADDR_BASE64K; i++)
+                       for (i = 0; i <= 8 + GFX9_SGPR_TCS_OUT_LAYOUT; i++)
                                returns[num_returns++] = ctx->i32; /* SGPRs */
                        for (i = 0; i < 11; i++)
                                returns[num_returns++] = ctx->f32; /* VGPRs */
@@ -4705,8 +4842,14 @@ 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. */
-               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) */
+               /* SPI_SHADER_USER_DATA_ADDR_LO/HI_GS */
+               if (HAVE_32BIT_POINTERS) {
+                       declare_per_stage_desc_pointers(ctx, &fninfo,
+                                                       ctx->type == PIPE_SHADER_GEOMETRY);
+               } else {
+                       declare_const_and_shader_buffers(ctx, &fninfo,
+                                                        ctx->type == PIPE_SHADER_GEOMETRY);
+               }
                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);
@@ -4721,18 +4864,22 @@ static void create_function(struct si_shader_context *ctx)
                if (ctx->type == PIPE_SHADER_VERTEX) {
                        declare_vs_specific_input_sgprs(ctx, &fninfo);
                } else {
-                       /* TESS_EVAL (and also GEOMETRY):
-                        * Declare as many input SGPRs as the VS has. */
+                       ctx->param_vs_state_bits = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                        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);
-                       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_vs_state_bits = add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused */
+                       ctx->param_tes_offchip_addr = add_arg(&fninfo, ARG_SGPR, ctx->i32);
+                       /* Declare as many input SGPRs as the VS has. */
+                       if (!HAVE_32BIT_POINTERS)
+                               add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused */
                }
 
-               declare_per_stage_desc_pointers(ctx, &fninfo,
-                                               ctx->type == PIPE_SHADER_GEOMETRY);
+               if (!HAVE_32BIT_POINTERS) {
+                       declare_samplers_and_images(ctx, &fninfo,
+                                                   ctx->type == PIPE_SHADER_GEOMETRY);
+               }
+               if (ctx->type == PIPE_SHADER_VERTEX) {
+                       ctx->param_vertex_buffers = add_arg(&fninfo, ARG_SGPR,
+                               ac_array_in_const32_addr_space(ctx->v4i32));
+               }
 
                /* VGPRs (first GS, then VS/TES) */
                ctx->param_gs_vtx01_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
@@ -4750,8 +4897,15 @@ static void create_function(struct si_shader_context *ctx)
 
                if (ctx->type == PIPE_SHADER_VERTEX ||
                    ctx->type == PIPE_SHADER_TESS_EVAL) {
+                       unsigned num_user_sgprs;
+
+                       if (ctx->type == PIPE_SHADER_VERTEX)
+                               num_user_sgprs = GFX9_VSGS_NUM_USER_SGPR;
+                       else
+                               num_user_sgprs = GFX9_TESGS_NUM_USER_SGPR;
+
                        /* ES return values are inputs to GS. */
-                       for (i = 0; i < 8 + GFX9_GS_NUM_USER_SGPR; i++)
+                       for (i = 0; i < 8 + num_user_sgprs; i++)
                                returns[num_returns++] = ctx->i32; /* SGPRs */
                        for (i = 0; i < 5; i++)
                                returns[num_returns++] = ctx->f32; /* VGPRs */
@@ -4761,8 +4915,9 @@ static void create_function(struct si_shader_context *ctx)
        case PIPE_SHADER_TESS_EVAL:
                declare_global_desc_pointers(ctx, &fninfo);
                declare_per_stage_desc_pointers(ctx, &fninfo, true);
+               ctx->param_vs_state_bits = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                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);
+               ctx->param_tes_offchip_addr = add_arg(&fninfo, ARG_SGPR, ctx->i32);
 
                if (shader->key.as_es) {
                        ctx->param_tcs_offchip_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
@@ -4886,19 +5041,18 @@ static void create_function(struct si_shader_context *ctx)
                           si_get_max_workgroup_size(shader));
 
        /* Reserve register locations for VGPR inputs the PS prolog may need. */
-       if (ctx->type == PIPE_SHADER_FRAGMENT &&
-           ctx->separate_prolog) {
-               si_llvm_add_attribute(ctx->main_fn,
-                                     "InitialPSInputAddr",
-                                     S_0286D0_PERSP_SAMPLE_ENA(1) |
-                                     S_0286D0_PERSP_CENTER_ENA(1) |
-                                     S_0286D0_PERSP_CENTROID_ENA(1) |
-                                     S_0286D0_LINEAR_SAMPLE_ENA(1) |
-                                     S_0286D0_LINEAR_CENTER_ENA(1) |
-                                     S_0286D0_LINEAR_CENTROID_ENA(1) |
-                                     S_0286D0_FRONT_FACE_ENA(1) |
-                                     S_0286D0_ANCILLARY_ENA(1) |
-                                     S_0286D0_POS_FIXED_PT_ENA(1));
+       if (ctx->type == PIPE_SHADER_FRAGMENT && !ctx->shader->is_monolithic) {
+               ac_llvm_add_target_dep_function_attr(ctx->main_fn,
+                                                    "InitialPSInputAddr",
+                                                    S_0286D0_PERSP_SAMPLE_ENA(1) |
+                                                    S_0286D0_PERSP_CENTER_ENA(1) |
+                                                    S_0286D0_PERSP_CENTROID_ENA(1) |
+                                                    S_0286D0_LINEAR_SAMPLE_ENA(1) |
+                                                    S_0286D0_LINEAR_CENTER_ENA(1) |
+                                                    S_0286D0_LINEAR_CENTROID_ENA(1) |
+                                                    S_0286D0_FRONT_FACE_ENA(1) |
+                                                    S_0286D0_ANCILLARY_ENA(1) |
+                                                    S_0286D0_POS_FIXED_PT_ENA(1));
        }
 
        shader->info.num_input_sgprs = 0;
@@ -5016,6 +5170,8 @@ static void preload_ring_buffers(struct si_shader_context *ctx)
 
                        ctx->gsvs_ring[stream] = ring;
                }
+       } else if (ctx->type == PIPE_SHADER_TESS_EVAL) {
+               ctx->tess_offchip_ring = get_tess_ring_descriptor(ctx, TESS_OFFCHIP_RING_TES);
        }
 }
 
@@ -5030,8 +5186,8 @@ static void si_llvm_emit_polygon_stipple(struct si_shader_context *ctx,
         * Since the stipple pattern is 32x32 and it repeats, just get 5 bits
         * per coordinate to get the repeating effect.
         */
-       address[0] = unpack_param(ctx, param_pos_fixed_pt, 0, 5);
-       address[1] = unpack_param(ctx, param_pos_fixed_pt, 16, 5);
+       address[0] = si_unpack_param(ctx, param_pos_fixed_pt, 0, 5);
+       address[1] = si_unpack_param(ctx, param_pos_fixed_pt, 16, 5);
 
        /* Load the buffer descriptor. */
        slot = LLVMConstInt(ctx->i32, SI_PS_CONST_POLY_STIPPLE, 0);
@@ -5155,6 +5311,10 @@ void si_shader_apply_scratch_relocs(struct si_shader *shader,
        }
 }
 
+/* For the UMR disassembler. */
+#define DEBUGGER_END_OF_CODE_MARKER    0xbf9f0000 /* invalid instruction */
+#define DEBUGGER_NUM_MARKERS           5
+
 static unsigned si_get_shader_binary_size(const struct si_shader *shader)
 {
        unsigned size = shader->binary.code_size;
@@ -5167,7 +5327,7 @@ static unsigned si_get_shader_binary_size(const struct si_shader *shader)
                size += shader->prolog2->binary.code_size;
        if (shader->epilog)
                size += shader->epilog->binary.code_size;
-       return size;
+       return size + DEBUGGER_NUM_MARKERS * 4;
 }
 
 int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader)
@@ -5193,10 +5353,9 @@ int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader)
        assert(!epilog || !epilog->rodata_size);
 
        r600_resource_reference(&shader->bo, NULL);
-       shader->bo = (struct r600_resource*)
-                    si_aligned_buffer_create(&sscreen->b,
+       shader->bo = si_aligned_buffer_create(&sscreen->b,
                                              sscreen->cpdma_prefetch_writes_memory ?
-                                               0 : R600_RESOURCE_FLAG_READ_ONLY,
+                                               0 : SI_RESOURCE_FLAG_READ_ONLY,
                                               PIPE_USAGE_IMMUTABLE,
                                               align(bo_size, SI_CPDMA_ALIGNMENT),
                                               256);
@@ -5226,10 +5385,18 @@ int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader)
        memcpy(ptr, mainb->code, mainb->code_size);
        ptr += mainb->code_size;
 
-       if (epilog)
+       if (epilog) {
                memcpy(ptr, epilog->code, epilog->code_size);
-       else if (mainb->rodata_size > 0)
+               ptr += epilog->code_size;
+       } else if (mainb->rodata_size > 0) {
                memcpy(ptr, mainb->rodata, mainb->rodata_size);
+               ptr += mainb->rodata_size;
+       }
+
+       /* Add end-of-code markers for the UMR disassembler. */
+       uint32_t *ptr32 = (uint32_t*)ptr;
+       for (unsigned i = 0; i < DEBUGGER_NUM_MARKERS; i++)
+               ptr32[i] = DEBUGGER_END_OF_CODE_MARKER;
 
        sscreen->ws->buffer_unmap(shader->bo->buf);
        return 0;
@@ -5292,16 +5459,7 @@ static void si_calculate_max_simd_waves(struct si_shader *shader)
        unsigned lds_per_wave = 0;
        unsigned max_simd_waves;
 
-       switch (sscreen->info.family) {
-       /* These always have 8 waves: */
-       case CHIP_POLARIS10:
-       case CHIP_POLARIS11:
-       case CHIP_POLARIS12:
-               max_simd_waves = 8;
-               break;
-       default:
-               max_simd_waves = 10;
-       }
+       max_simd_waves = ac_get_max_simd_waves(sscreen->info.family);
 
        /* Compute LDS usage for PS. */
        switch (shader->selector->type) {
@@ -5483,7 +5641,7 @@ void si_shader_dump(struct si_screen *sscreen, const struct si_shader *shader,
 static int si_compile_llvm(struct si_screen *sscreen,
                           struct ac_shader_binary *binary,
                           struct si_shader_config *conf,
-                          LLVMTargetMachineRef tm,
+                          struct ac_llvm_compiler *compiler,
                           LLVMModuleRef mod,
                           struct pipe_debug_callback *debug,
                           unsigned processor,
@@ -5509,7 +5667,7 @@ static int si_compile_llvm(struct si_screen *sscreen,
        }
 
        if (!si_replace_shader(count, binary)) {
-               r = si_llvm_compile(mod, binary, tm, debug);
+               r = si_llvm_compile(mod, binary, compiler, debug);
                if (r)
                        return r;
        }
@@ -5561,29 +5719,21 @@ static void si_llvm_build_ret(struct si_shader_context *ctx, LLVMValueRef ret)
 /* Generate code for the hardware VS shader stage to go with a geometry shader */
 struct si_shader *
 si_generate_gs_copy_shader(struct si_screen *sscreen,
-                          LLVMTargetMachineRef tm,
+                          struct ac_llvm_compiler *compiler,
                           struct si_shader_selector *gs_selector,
                           struct pipe_debug_callback *debug)
 {
        struct si_shader_context ctx;
        struct si_shader *shader;
        LLVMBuilderRef builder;
-       struct lp_build_tgsi_context *bld_base = &ctx.bld_base;
-       struct lp_build_context *uint = &bld_base->uint_bld;
-       struct si_shader_output_values *outputs;
+       struct si_shader_output_values outputs[SI_MAX_VS_OUTPUTS];
        struct tgsi_shader_info *gsinfo = &gs_selector->info;
        int i, r;
 
-       outputs = MALLOC(gsinfo->num_outputs * sizeof(outputs[0]));
-
-       if (!outputs)
-               return NULL;
 
        shader = CALLOC_STRUCT(si_shader);
-       if (!shader) {
-               FREE(outputs);
+       if (!shader)
                return NULL;
-       }
 
        /* We can leave the fence as permanently signaled because the GS copy
         * shader only becomes visible globally after it has been compiled. */
@@ -5592,7 +5742,7 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
        shader->selector = gs_selector;
        shader->is_gs_copy_shader = true;
 
-       si_init_shader_ctx(&ctx, sscreen, tm);
+       si_init_shader_ctx(&ctx, sscreen, compiler);
        ctx.shader = shader;
        ctx.type = PIPE_SHADER_VERTEX;
 
@@ -5602,13 +5752,14 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
        preload_ring_buffers(&ctx);
 
        LLVMValueRef voffset =
-               lp_build_mul_imm(uint, ctx.abi.vertex_id, 4);
+               LLVMBuildMul(ctx.ac.builder, ctx.abi.vertex_id,
+                            LLVMConstInt(ctx.i32, 4, 0), "");
 
        /* Fetch the vertex stream ID.*/
        LLVMValueRef stream_id;
 
        if (gs_selector->so.num_outputs)
-               stream_id = unpack_param(&ctx, ctx.param_streamout_config, 24, 2);
+               stream_id = si_unpack_param(&ctx, ctx.param_streamout_config, 24, 2);
        else
                stream_id = ctx.i32_0;
 
@@ -5649,7 +5800,7 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
                        for (unsigned chan = 0; chan < 4; chan++) {
                                if (!(gsinfo->output_usagemask[i] & (1 << chan)) ||
                                    outputs[i].vertex_stream[chan] != stream) {
-                                       outputs[i].values[chan] = ctx.bld_base.base.undef;
+                                       outputs[i].values[chan] = LLVMGetUndef(ctx.f32);
                                        continue;
                                }
 
@@ -5673,8 +5824,51 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
                                               stream);
                }
 
-               if (stream == 0)
+               if (stream == 0) {
+                       /* Vertex color clamping.
+                        *
+                        * This uses a state constant loaded in a user data SGPR and
+                        * an IF statement is added that clamps all colors if the constant
+                        * is true.
+                        */
+                       struct lp_build_if_state if_ctx;
+                       LLVMValueRef v[2], cond = NULL;
+                       LLVMBasicBlockRef blocks[2];
+
+                       for (unsigned i = 0; i < gsinfo->num_outputs; i++) {
+                               if (gsinfo->output_semantic_name[i] != TGSI_SEMANTIC_COLOR &&
+                                   gsinfo->output_semantic_name[i] != TGSI_SEMANTIC_BCOLOR)
+                                       continue;
+
+                               /* We've found a color. */
+                               if (!cond) {
+                                       /* The state is in the first bit of the user SGPR. */
+                                       cond = LLVMGetParam(ctx.main_fn,
+                                                           ctx.param_vs_state_bits);
+                                       cond = LLVMBuildTrunc(ctx.ac.builder, cond,
+                                                             ctx.i1, "");
+                                       lp_build_if(&if_ctx, &ctx.gallivm, cond);
+                                       /* Remember blocks for Phi. */
+                                       blocks[0] = if_ctx.true_block;
+                                       blocks[1] = if_ctx.entry_block;
+                               }
+
+                               for (unsigned j = 0; j < 4; j++) {
+                                       /* Insert clamp into the true block. */
+                                       v[0] = ac_build_clamp(&ctx.ac, outputs[i].values[j]);
+                                       v[1] = outputs[i].values[j];
+
+                                       /* Insert Phi into the endif block. */
+                                       LLVMPositionBuilderAtEnd(ctx.ac.builder, if_ctx.merge_block);
+                                       outputs[i].values[j] = ac_build_phi(&ctx.ac, ctx.f32, 2, v, blocks);
+                                       LLVMPositionBuilderAtEnd(ctx.ac.builder, if_ctx.true_block);
+                               }
+                       }
+                       if (cond)
+                               lp_build_endif(&if_ctx);
+
                        si_llvm_export_vs(&ctx, outputs, gsinfo->num_outputs);
+               }
 
                LLVMBuildBr(builder, end_bb);
        }
@@ -5687,8 +5881,8 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
        si_llvm_optimize_module(&ctx);
 
        r = si_compile_llvm(sscreen, &ctx.shader->binary,
-                           &ctx.shader->config, ctx.tm,
-                           ctx.gallivm.module,
+                           &ctx.shader->config, ctx.compiler,
+                           ctx.ac.module,
                            debug, PIPE_SHADER_GEOMETRY,
                            "GS Copy Shader");
        if (!r) {
@@ -5701,8 +5895,6 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
 
        si_llvm_dispose(&ctx);
 
-       FREE(outputs);
-
        if (r != 0) {
                FREE(shader);
                shader = NULL;
@@ -5809,11 +6001,11 @@ static void si_dump_shader_key(unsigned processor, const struct si_shader *shade
 
 static void si_init_shader_ctx(struct si_shader_context *ctx,
                               struct si_screen *sscreen,
-                              LLVMTargetMachineRef tm)
+                              struct ac_llvm_compiler *compiler)
 {
        struct lp_build_tgsi_context *bld_base;
 
-       si_llvm_context_init(ctx, sscreen, tm);
+       si_llvm_context_init(ctx, sscreen, compiler);
 
        bld_base = &ctx->bld_base;
        bld_base->emit_fetch_funcs[TGSI_FILE_CONSTANT] = fetch_constant;
@@ -5864,32 +6056,6 @@ static void si_optimize_vs_outputs(struct si_shader_context *ctx)
                               &shader->info.nr_param_exports);
 }
 
-static void si_count_scratch_private_memory(struct si_shader_context *ctx)
-{
-       ctx->shader->config.private_mem_vgprs = 0;
-
-       /* Process all LLVM instructions. */
-       LLVMBasicBlockRef bb = LLVMGetFirstBasicBlock(ctx->main_fn);
-       while (bb) {
-               LLVMValueRef next = LLVMGetFirstInstruction(bb);
-
-               while (next) {
-                       LLVMValueRef inst = next;
-                       next = LLVMGetNextInstruction(next);
-
-                       if (LLVMGetInstructionOpcode(inst) != LLVMAlloca)
-                               continue;
-
-                       LLVMTypeRef type = LLVMGetElementType(LLVMTypeOf(inst));
-                       /* No idea why LLVM aligns allocas to 4 elements. */
-                       unsigned alignment = LLVMGetAlignment(inst);
-                       unsigned dw_size = align(ac_get_type_size(type) / 4, alignment);
-                       ctx->shader->config.private_mem_vgprs += dw_size;
-               }
-               bb = LLVMGetNextBasicBlock(bb);
-       }
-}
-
 static void si_init_exec_from_input(struct si_shader_context *ctx,
                                    unsigned param, unsigned bitoffset)
 {
@@ -5897,9 +6063,9 @@ 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->ac.builder,
+       ac_build_intrinsic(&ctx->ac,
                           "llvm.amdgcn.init.exec.from.input",
-                          ctx->voidt, args, 2, LP_FUNC_ATTR_CONVERGENT);
+                          ctx->voidt, args, 2, AC_FUNC_ATTR_CONVERGENT);
 }
 
 static bool si_vs_needs_prolog(const struct si_shader_selector *sel,
@@ -5910,8 +6076,7 @@ static bool si_vs_needs_prolog(const struct si_shader_selector *sel,
        return sel->vs_needs_prolog || key->ls_vgpr_fix;
 }
 
-static bool si_compile_tgsi_main(struct si_shader_context *ctx,
-                                bool is_monolithic)
+static bool si_compile_tgsi_main(struct si_shader_context *ctx)
 {
        struct si_shader *shader = ctx->shader;
        struct si_shader_selector *sel = shader->selector;
@@ -5928,6 +6093,7 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx,
                else
                        ctx->abi.emit_outputs = si_llvm_emit_vs_epilogue;
                bld_base->emit_epilogue = si_tgsi_emit_epilogue;
+               ctx->abi.load_base_vertex = get_base_vertex;
                break;
        case PIPE_SHADER_TESS_CTRL:
                bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_tcs;
@@ -5966,6 +6132,7 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx,
                ctx->abi.lookup_interp_param = si_nir_lookup_interp_param;
                ctx->abi.load_sample_position = load_sample_position;
                ctx->abi.load_sample_mask_in = load_sample_mask_in;
+               ctx->abi.emit_kill = si_llvm_emit_kill;
                break;
        case PIPE_SHADER_COMPUTE:
                ctx->abi.load_local_group_size = get_block_size;
@@ -5994,7 +6161,7 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx,
         * if-block together with its prolog in si_build_wrapper_function.
         */
        if (ctx->screen->info.chip_class >= GFX9) {
-               if (!is_monolithic &&
+               if (!shader->is_monolithic &&
                    sel->info.num_instructions > 1 && /* not empty shader */
                    (shader->key.as_es || shader->key.as_ls) &&
                    (ctx->type == PIPE_SHADER_TESS_EVAL ||
@@ -6004,19 +6171,27 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx,
                                                ctx->param_merged_wave_info, 0);
                } else if (ctx->type == PIPE_SHADER_TESS_CTRL ||
                           ctx->type == PIPE_SHADER_GEOMETRY) {
-                       if (!is_monolithic)
+                       if (!shader->is_monolithic)
                                ac_init_exec_full_mask(&ctx->ac);
 
-                       /* The barrier must execute for all shaders in a
-                        * threadgroup.
-                        */
-                       si_llvm_emit_barrier(NULL, bld_base, NULL);
-
-                       LLVMValueRef num_threads = unpack_param(ctx, ctx->param_merged_wave_info, 8, 8);
+                       LLVMValueRef num_threads = si_unpack_param(ctx, ctx->param_merged_wave_info, 8, 8);
                        LLVMValueRef ena =
                                LLVMBuildICmp(ctx->ac.builder, LLVMIntULT,
                                            ac_get_thread_id(&ctx->ac), num_threads, "");
                        lp_build_if(&ctx->merged_wrap_if_state, &ctx->gallivm, ena);
+
+                       /* The barrier must execute for all shaders in a
+                        * threadgroup.
+                        *
+                        * Execute the barrier inside the conditional block,
+                        * so that empty waves can jump directly to s_endpgm,
+                        * which will also signal the barrier.
+                        *
+                        * If the shader is TCS and the TCS epilog is present
+                        * and contains a barrier, it will wait there and then
+                        * reach s_endpgm.
+                        */
+                       si_llvm_emit_barrier(NULL, bld_base, NULL);
                }
        }
 
@@ -6024,7 +6199,7 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx,
            sel->tcs_info.tessfactors_are_def_in_all_invocs) {
                for (unsigned i = 0; i < 6; i++) {
                        ctx->invoc0_tess_factors[i] =
-                               lp_build_alloca_undef(&ctx->gallivm, ctx->i32, "");
+                               ac_build_alloca_undef(&ctx->ac, ctx->i32, "");
                }
        }
 
@@ -6032,13 +6207,12 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx,
                int i;
                for (i = 0; i < 4; i++) {
                        ctx->gs_next_vertex[i] =
-                               lp_build_alloca(&ctx->gallivm,
-                                               ctx->i32, "");
+                               ac_build_alloca(&ctx->ac, ctx->i32, "");
                }
        }
 
        if (sel->force_correct_derivs_after_kill) {
-               ctx->postponed_kill = lp_build_alloca_undef(&ctx->gallivm, ctx->i1, "");
+               ctx->postponed_kill = ac_build_alloca_undef(&ctx->ac, ctx->i1, "");
                /* true = don't kill. */
                LLVMBuildStore(ctx->ac.builder, LLVMConstInt(ctx->i1, 1, 0),
                               ctx->postponed_kill);
@@ -6268,7 +6442,10 @@ static void si_build_gs_prolog_function(struct si_shader_context *ctx,
        si_init_function_info(&fninfo);
 
        if (ctx->screen->info.chip_class >= GFX9) {
-               num_sgprs = 8 + GFX9_GS_NUM_USER_SGPR;
+               if (key->gs_prolog.states.gfx9_prev_is_vs)
+                       num_sgprs = 8 + GFX9_VSGS_NUM_USER_SGPR;
+               else
+                       num_sgprs = 8 + GFX9_TESGS_NUM_USER_SGPR;
                num_vgprs = 5; /* ES inputs are not needed by GS */
        } else {
                num_sgprs = GFX6_GS_NUM_USER_SGPR + 2;
@@ -6331,8 +6508,8 @@ static void si_build_gs_prolog_function(struct si_shader_context *ctx,
 
                if (ctx->screen->info.chip_class >= GFX9) {
                        for (unsigned i = 0; i < 3; i++) {
-                               vtx_in[i*2] = unpack_param(ctx, gfx9_vtx_params[i], 0, 16);
-                               vtx_in[i*2+1] = unpack_param(ctx, gfx9_vtx_params[i], 16, 16);
+                               vtx_in[i*2] = si_unpack_param(ctx, gfx9_vtx_params[i], 0, 16);
+                               vtx_in[i*2+1] = si_unpack_param(ctx, gfx9_vtx_params[i], 16, 16);
                        }
                } else {
                        for (unsigned i = 0; i < 6; i++)
@@ -6402,7 +6579,8 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
        si_init_function_info(&fninfo);
 
        for (unsigned i = 0; i < num_parts; ++i) {
-               lp_add_function_attr(parts[i], -1, LP_FUNC_ATTR_ALWAYSINLINE);
+               ac_add_function_attr(ctx->ac.context, parts[i], -1,
+                                    AC_FUNC_ATTR_ALWAYSINLINE);
                LLVMSetLinkage(parts[i], LLVMPrivateLinkage);
        }
 
@@ -6462,6 +6640,11 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
                unsigned size = ac_get_type_size(param_type) / 4;
 
                if (size == 1) {
+                       if (LLVMGetTypeKind(param_type) == LLVMPointerTypeKind) {
+                               param = LLVMBuildPtrToInt(builder, param, ctx->i32, "");
+                               param_type = ctx->i32;
+                       }
+
                        if (param_type != out_type)
                                param = LLVMBuildBitCast(builder, param, out_type, "");
                        out[num_out++] = param;
@@ -6524,21 +6707,32 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
                        param_size = ac_get_type_size(param_type) / 4;
                        is_sgpr = ac_is_sgpr_param(param);
 
-                       if (is_sgpr)
-                               lp_add_function_attr(parts[part], param_idx + 1, LP_FUNC_ATTR_INREG);
+                       if (is_sgpr) {
+                               ac_add_function_attr(ctx->ac.context, parts[part],
+                                                    param_idx + 1, AC_FUNC_ATTR_INREG);
+                       } else if (out_idx < num_out_sgpr) {
+                               /* Skip returned SGPRs the current part doesn't
+                                * declare on the input. */
+                               out_idx = num_out_sgpr;
+                       }
 
                        assert(out_idx + param_size <= (is_sgpr ? num_out_sgpr : num_out));
-                       assert(is_sgpr || out_idx >= num_out_sgpr);
 
                        if (param_size == 1)
                                arg = out[out_idx];
                        else
-                               arg = lp_build_gather_values(&ctx->gallivm, &out[out_idx], param_size);
+                               arg = ac_build_gather_values(&ctx->ac, &out[out_idx], param_size);
 
                        if (LLVMTypeOf(arg) != param_type) {
                                if (LLVMGetTypeKind(param_type) == LLVMPointerTypeKind) {
-                                       arg = LLVMBuildBitCast(builder, arg, ctx->i64, "");
-                                       arg = LLVMBuildIntToPtr(builder, arg, param_type, "");
+                                       if (LLVMGetPointerAddressSpace(param_type) ==
+                                           AC_CONST_32BIT_ADDR_SPACE) {
+                                               arg = LLVMBuildBitCast(builder, arg, ctx->i32, "");
+                                               arg = LLVMBuildIntToPtr(builder, arg, param_type, "");
+                                       } else {
+                                               arg = LLVMBuildBitCast(builder, arg, ctx->i64, "");
+                                               arg = LLVMBuildIntToPtr(builder, arg, param_type, "");
+                                       }
                                } else {
                                        arg = LLVMBuildBitCast(builder, arg, param_type, "");
                                }
@@ -6597,9 +6791,8 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
 }
 
 int si_compile_tgsi_shader(struct si_screen *sscreen,
-                          LLVMTargetMachineRef tm,
+                          struct ac_llvm_compiler *compiler,
                           struct si_shader *shader,
-                          bool is_monolithic,
                           struct pipe_debug_callback *debug)
 {
        struct si_shader_selector *sel = shader->selector;
@@ -6617,21 +6810,20 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
                si_dump_streamout(&sel->so);
        }
 
-       si_init_shader_ctx(&ctx, sscreen, tm);
+       si_init_shader_ctx(&ctx, sscreen, compiler);
        si_llvm_context_set_tgsi(&ctx, shader);
-       ctx.separate_prolog = !is_monolithic;
 
        memset(shader->info.vs_output_param_offset, AC_EXP_PARAM_UNDEFINED,
               sizeof(shader->info.vs_output_param_offset));
 
        shader->info.uses_instanceid = sel->info.uses_instanceid;
 
-       if (!si_compile_tgsi_main(&ctx, is_monolithic)) {
+       if (!si_compile_tgsi_main(&ctx)) {
                si_llvm_dispose(&ctx);
                return -1;
        }
 
-       if (is_monolithic && ctx.type == PIPE_SHADER_VERTEX) {
+       if (shader->is_monolithic && ctx.type == PIPE_SHADER_VERTEX) {
                LLVMValueRef parts[2];
                bool need_prolog = sel->vs_needs_prolog;
 
@@ -6649,7 +6841,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
 
                si_build_wrapper_function(&ctx, parts + !need_prolog,
                                          1 + need_prolog, need_prolog, 0);
-       } else if (is_monolithic && ctx.type == PIPE_SHADER_TESS_CTRL) {
+       } else if (shader->is_monolithic && ctx.type == PIPE_SHADER_TESS_CTRL) {
                if (sscreen->info.chip_class >= GFX9) {
                        struct si_shader_selector *ls = shader->key.part.tcs.ls;
                        LLVMValueRef parts[4];
@@ -6666,40 +6858,41 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
                        si_build_tcs_epilog_function(&ctx, &tcs_epilog_key);
                        parts[3] = ctx.main_fn;
 
-                       /* VS prolog */
-                       if (vs_needs_prolog) {
-                               union si_shader_part_key vs_prolog_key;
-                               si_get_vs_prolog_key(&ls->info,
-                                                    shader->info.num_input_sgprs,
-                                                    &shader->key.part.tcs.ls_prolog,
-                                                    shader, &vs_prolog_key);
-                               vs_prolog_key.vs_prolog.is_monolithic = true;
-                               si_build_vs_prolog_function(&ctx, &vs_prolog_key);
-                               parts[0] = ctx.main_fn;
-                       }
-
                        /* VS as LS main part */
                        struct si_shader shader_ls = {};
                        shader_ls.selector = ls;
                        shader_ls.key.as_ls = 1;
                        shader_ls.key.mono = shader->key.mono;
                        shader_ls.key.opt = shader->key.opt;
+                       shader_ls.is_monolithic = true;
                        si_llvm_context_set_tgsi(&ctx, &shader_ls);
 
-                       if (!si_compile_tgsi_main(&ctx, true)) {
+                       if (!si_compile_tgsi_main(&ctx)) {
                                si_llvm_dispose(&ctx);
                                return -1;
                        }
                        shader->info.uses_instanceid |= ls->info.uses_instanceid;
                        parts[1] = ctx.main_fn;
 
+                       /* LS prolog */
+                       if (vs_needs_prolog) {
+                               union si_shader_part_key vs_prolog_key;
+                               si_get_vs_prolog_key(&ls->info,
+                                                    shader_ls.info.num_input_sgprs,
+                                                    &shader->key.part.tcs.ls_prolog,
+                                                    shader, &vs_prolog_key);
+                               vs_prolog_key.vs_prolog.is_monolithic = true;
+                               si_build_vs_prolog_function(&ctx, &vs_prolog_key);
+                               parts[0] = ctx.main_fn;
+                       }
+
                        /* Reset the shader context. */
                        ctx.shader = shader;
                        ctx.type = PIPE_SHADER_TESS_CTRL;
 
                        si_build_wrapper_function(&ctx,
                                                  parts + !vs_needs_prolog,
-                                                 4 - !vs_needs_prolog, 0,
+                                                 4 - !vs_needs_prolog, vs_needs_prolog,
                                                  vs_needs_prolog ? 2 : 1);
                } else {
                        LLVMValueRef parts[2];
@@ -6714,7 +6907,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
 
                        si_build_wrapper_function(&ctx, parts, 2, 0, 0);
                }
-       } else if (is_monolithic && ctx.type == PIPE_SHADER_GEOMETRY) {
+       } else if (shader->is_monolithic && ctx.type == PIPE_SHADER_GEOMETRY) {
                if (ctx.screen->info.chip_class >= GFX9) {
                        struct si_shader_selector *es = shader->key.part.gs.es;
                        LLVMValueRef es_prolog = NULL;
@@ -6730,33 +6923,34 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
                        si_build_gs_prolog_function(&ctx, &gs_prolog_key);
                        gs_prolog = ctx.main_fn;
 
-                       /* ES prolog */
-                       if (es->vs_needs_prolog) {
-                               union si_shader_part_key vs_prolog_key;
-                               si_get_vs_prolog_key(&es->info,
-                                                    shader->info.num_input_sgprs,
-                                                    &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);
-                               es_prolog = ctx.main_fn;
-                       }
-
                        /* ES main part */
                        struct si_shader shader_es = {};
                        shader_es.selector = es;
                        shader_es.key.as_es = 1;
                        shader_es.key.mono = shader->key.mono;
                        shader_es.key.opt = shader->key.opt;
+                       shader_es.is_monolithic = true;
                        si_llvm_context_set_tgsi(&ctx, &shader_es);
 
-                       if (!si_compile_tgsi_main(&ctx, true)) {
+                       if (!si_compile_tgsi_main(&ctx)) {
                                si_llvm_dispose(&ctx);
                                return -1;
                        }
                        shader->info.uses_instanceid |= es->info.uses_instanceid;
                        es_main = ctx.main_fn;
 
+                       /* ES prolog */
+                       if (es->vs_needs_prolog) {
+                               union si_shader_part_key vs_prolog_key;
+                               si_get_vs_prolog_key(&es->info,
+                                                    shader_es.info.num_input_sgprs,
+                                                    &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);
+                               es_prolog = ctx.main_fn;
+                       }
+
                        /* Reset the shader context. */
                        ctx.shader = shader;
                        ctx.type = PIPE_SHADER_GEOMETRY;
@@ -6787,7 +6981,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
 
                        si_build_wrapper_function(&ctx, parts, 2, 1, 0);
                }
-       } else if (is_monolithic && ctx.type == PIPE_SHADER_FRAGMENT) {
+       } else if (shader->is_monolithic && ctx.type == PIPE_SHADER_FRAGMENT) {
                LLVMValueRef parts[3];
                union si_shader_part_key prolog_key;
                union si_shader_part_key epilog_key;
@@ -6817,12 +7011,18 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
        si_optimize_vs_outputs(&ctx);
 
        if ((debug && debug->debug_message) ||
-           si_can_dump_shader(sscreen, ctx.type))
-               si_count_scratch_private_memory(&ctx);
+           si_can_dump_shader(sscreen, ctx.type)) {
+               ctx.shader->config.private_mem_vgprs =
+                       ac_count_scratch_private_memory(ctx.main_fn);
+       }
+
+       /* Make sure the input is a pointer and not integer followed by inttoptr. */
+       assert(LLVMGetTypeKind(LLVMTypeOf(LLVMGetParam(ctx.main_fn, 0))) ==
+              LLVMPointerTypeKind);
 
        /* Compile to bytecode. */
-       r = si_compile_llvm(sscreen, &shader->binary, &shader->config, tm,
-                           ctx.gallivm.module, debug, ctx.type, "TGSI shader");
+       r = si_compile_llvm(sscreen, &shader->binary, &shader->config, compiler,
+                           ctx.ac.module, debug, ctx.type, "TGSI shader");
        si_llvm_dispose(&ctx);
        if (r) {
                fprintf(stderr, "LLVM failed to compile shader\n");
@@ -6932,7 +7132,7 @@ si_get_shader_part(struct si_screen *sscreen,
                   enum pipe_shader_type type,
                   bool prolog,
                   union si_shader_part_key *key,
-                  LLVMTargetMachineRef tm,
+                  struct ac_llvm_compiler *compiler,
                   struct pipe_debug_callback *debug,
                   void (*build)(struct si_shader_context *,
                                 union si_shader_part_key *),
@@ -6957,7 +7157,7 @@ si_get_shader_part(struct si_screen *sscreen,
        struct si_shader shader = {};
        struct si_shader_context ctx;
 
-       si_init_shader_ctx(&ctx, sscreen, tm);
+       si_init_shader_ctx(&ctx, sscreen, compiler);
        ctx.shader = &shader;
        ctx.type = type;
 
@@ -6988,7 +7188,7 @@ si_get_shader_part(struct si_screen *sscreen,
        /* Compile. */
        si_llvm_optimize_module(&ctx);
 
-       if (si_compile_llvm(sscreen, &result->binary, &result->config, tm,
+       if (si_compile_llvm(sscreen, &result->binary, &result->config, compiler,
                            ctx.ac.module, debug, ctx.type, name)) {
                FREE(result);
                result = NULL;
@@ -7013,10 +7213,17 @@ static LLVMValueRef si_prolog_get_rw_buffers(struct si_shader_context *ctx)
                 ctx->type == PIPE_SHADER_GEOMETRY ||
                 ctx->shader->key.as_ls || ctx->shader->key.as_es);
 
+       if (HAVE_32BIT_POINTERS) {
+               ptr[0] = LLVMGetParam(ctx->main_fn, (is_merged_shader ? 8 : 0) + SI_SGPR_RW_BUFFERS);
+               list = LLVMBuildIntToPtr(ctx->ac.builder, ptr[0],
+                                        ac_array_in_const32_addr_space(ctx->v4i32), "");
+               return list;
+       }
+
        /* Get the pointer to rw buffers. */
        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);
+       ptr[1] = LLVMGetParam(ctx->main_fn, (is_merged_shader ? 8 : 0) + SI_SGPR_RW_BUFFERS + 1);
+       list = ac_build_gather_values(&ctx->ac, ptr, 2);
        list = LLVMBuildBitCast(ctx->ac.builder, list, ctx->i64, "");
        list = LLVMBuildIntToPtr(ctx->ac.builder, list,
                                 ac_array_in_const_addr_space(ctx->v4i32), "");
@@ -7092,7 +7299,7 @@ static void si_build_vs_prolog_function(struct si_shader_context *ctx,
                         */
                        LLVMValueRef has_hs_threads =
                                LLVMBuildICmp(ctx->ac.builder, LLVMIntNE,
-                                   unpack_param(ctx, 3, 8, 8),
+                                   si_unpack_param(ctx, 3, 8, 8),
                                    ctx->i32_0, "");
 
                        for (i = 4; i > 0; --i) {
@@ -7171,7 +7378,7 @@ static void si_build_vs_prolog_function(struct si_shader_context *ctx,
 }
 
 static bool si_get_vs_prolog(struct si_screen *sscreen,
-                            LLVMTargetMachineRef tm,
+                            struct ac_llvm_compiler *compiler,
                             struct si_shader *shader,
                             struct pipe_debug_callback *debug,
                             struct si_shader *main_part,
@@ -7189,7 +7396,7 @@ static bool si_get_vs_prolog(struct si_screen *sscreen,
 
        shader->prolog =
                si_get_shader_part(sscreen, &sscreen->vs_prologs,
-                                  PIPE_SHADER_VERTEX, true, &prolog_key, tm,
+                                  PIPE_SHADER_VERTEX, true, &prolog_key, compiler,
                                   debug, si_build_vs_prolog_function,
                                   "Vertex Shader Prolog");
        return shader->prolog != NULL;
@@ -7199,11 +7406,11 @@ static bool si_get_vs_prolog(struct si_screen *sscreen,
  * Select and compile (or reuse) vertex shader parts (prolog & epilog).
  */
 static bool si_shader_select_vs_parts(struct si_screen *sscreen,
-                                     LLVMTargetMachineRef tm,
+                                     struct ac_llvm_compiler *compiler,
                                      struct si_shader *shader,
                                      struct pipe_debug_callback *debug)
 {
-       return si_get_vs_prolog(sscreen, tm, shader, debug, shader,
+       return si_get_vs_prolog(sscreen, compiler, shader, debug, shader,
                                &shader->key.part.vs.prolog);
 }
 
@@ -7221,38 +7428,36 @@ static void si_build_tcs_epilog_function(struct si_shader_context *ctx,
        si_init_function_info(&fninfo);
 
        if (ctx->screen->info.chip_class >= GFX9) {
-               add_arg(&fninfo, ARG_SGPR, ctx->i64);
+               add_arg(&fninfo, ARG_SGPR, ctx->i32);
+               add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_tcs_offchip_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                add_arg(&fninfo, ARG_SGPR, ctx->i32); /* wave info */
                ctx->param_tcs_factor_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                add_arg(&fninfo, ARG_SGPR, ctx->i32);
                add_arg(&fninfo, ARG_SGPR, ctx->i32);
                add_arg(&fninfo, ARG_SGPR, ctx->i32);
-               add_arg(&fninfo, ARG_SGPR, ctx->i64);
-               add_arg(&fninfo, ARG_SGPR, ctx->i64);
-               add_arg(&fninfo, ARG_SGPR, ctx->i64);
-               add_arg(&fninfo, ARG_SGPR, ctx->i64);
-               add_arg(&fninfo, ARG_SGPR, ctx->i64);
+               add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
+               add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
+               add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
+               add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
                add_arg(&fninfo, ARG_SGPR, ctx->i32);
                add_arg(&fninfo, ARG_SGPR, ctx->i32);
                add_arg(&fninfo, ARG_SGPR, ctx->i32);
                add_arg(&fninfo, ARG_SGPR, ctx->i32);
+               if (!HAVE_32BIT_POINTERS)
+                       add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
                ctx->param_tcs_offchip_layout = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                add_arg(&fninfo, ARG_SGPR, ctx->i32);
-               add_arg(&fninfo, ARG_SGPR, ctx->i32);
-               ctx->param_tcs_offchip_addr_base64k = add_arg(&fninfo, ARG_SGPR, ctx->i32);
-               ctx->param_tcs_factor_addr_base64k = add_arg(&fninfo, ARG_SGPR, ctx->i32);
+               ctx->param_tcs_out_lds_layout = add_arg(&fninfo, ARG_SGPR, ctx->i32);
        } else {
-               add_arg(&fninfo, ARG_SGPR, ctx->i64);
-               add_arg(&fninfo, ARG_SGPR, ctx->i64);
-               add_arg(&fninfo, ARG_SGPR, ctx->i64);
-               add_arg(&fninfo, ARG_SGPR, ctx->i64);
+               add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
+               add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
+               add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
+               add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
                ctx->param_tcs_offchip_layout = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                add_arg(&fninfo, ARG_SGPR, ctx->i32);
+               ctx->param_tcs_out_lds_layout = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                add_arg(&fninfo, ARG_SGPR, ctx->i32);
-               add_arg(&fninfo, ARG_SGPR, ctx->i32);
-               ctx->param_tcs_offchip_addr_base64k = add_arg(&fninfo, ARG_SGPR, ctx->i32);
-               ctx->param_tcs_factor_addr_base64k = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_tcs_offchip_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_tcs_factor_offset = add_arg(&fninfo, ARG_SGPR, ctx->i32);
        }
@@ -7290,7 +7495,7 @@ static void si_build_tcs_epilog_function(struct si_shader_context *ctx,
  * Select and compile (or reuse) TCS parts (epilog).
  */
 static bool si_shader_select_tcs_parts(struct si_screen *sscreen,
-                                      LLVMTargetMachineRef tm,
+                                      struct ac_llvm_compiler *compiler,
                                       struct si_shader *shader,
                                       struct pipe_debug_callback *debug)
 {
@@ -7298,7 +7503,7 @@ static bool si_shader_select_tcs_parts(struct si_screen *sscreen,
                struct si_shader *ls_main_part =
                        shader->key.part.tcs.ls->main_shader_part_ls;
 
-               if (!si_get_vs_prolog(sscreen, tm, shader, debug, ls_main_part,
+               if (!si_get_vs_prolog(sscreen, compiler, shader, debug, ls_main_part,
                                      &shader->key.part.tcs.ls_prolog))
                        return false;
 
@@ -7312,7 +7517,7 @@ static bool si_shader_select_tcs_parts(struct si_screen *sscreen,
 
        shader->epilog = si_get_shader_part(sscreen, &sscreen->tcs_epilogs,
                                            PIPE_SHADER_TESS_CTRL, false,
-                                           &epilog_key, tm, debug,
+                                           &epilog_key, compiler, debug,
                                            si_build_tcs_epilog_function,
                                            "Tessellation Control Shader Epilog");
        return shader->epilog != NULL;
@@ -7322,7 +7527,7 @@ static bool si_shader_select_tcs_parts(struct si_screen *sscreen,
  * Select and compile (or reuse) GS parts (prolog).
  */
 static bool si_shader_select_gs_parts(struct si_screen *sscreen,
-                                     LLVMTargetMachineRef tm,
+                                     struct ac_llvm_compiler *compiler,
                                      struct si_shader *shader,
                                      struct pipe_debug_callback *debug)
 {
@@ -7331,7 +7536,7 @@ static bool si_shader_select_gs_parts(struct si_screen *sscreen,
                        shader->key.part.gs.es->main_shader_part_es;
 
                if (shader->key.part.gs.es->type == PIPE_SHADER_VERTEX &&
-                   !si_get_vs_prolog(sscreen, tm, shader, debug, es_main_part,
+                   !si_get_vs_prolog(sscreen, compiler, shader, debug, es_main_part,
                                      &shader->key.part.gs.vs_prolog))
                        return false;
 
@@ -7347,7 +7552,7 @@ static bool si_shader_select_gs_parts(struct si_screen *sscreen,
 
        shader->prolog2 = si_get_shader_part(sscreen, &sscreen->gs_prologs,
                                            PIPE_SHADER_GEOMETRY, true,
-                                           &prolog_key, tm, debug,
+                                           &prolog_key, compiler, debug,
                                            si_build_gs_prolog_function,
                                            "Geometry Shader Prolog");
        return shader->prolog2 != NULL;
@@ -7550,7 +7755,7 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
                                                          interp_vgpr, "");
                        interp[1] = LLVMBuildExtractValue(ctx->ac.builder, ret,
                                                          interp_vgpr + 1, "");
-                       interp_ij = lp_build_gather_values(&ctx->gallivm, interp, 2);
+                       interp_ij = ac_build_gather_values(&ctx->ac, interp, 2);
                }
 
                /* Use the absolute location of the input. */
@@ -7606,7 +7811,7 @@ static void si_build_ps_prolog_function(struct si_shader_context *ctx,
                uint32_t ps_iter_mask = ps_iter_masks[key->ps_prolog.states.samplemask_log_ps_iter];
                unsigned ancillary_vgpr = key->ps_prolog.num_input_sgprs +
                                          key->ps_prolog.ancillary_vgpr_index;
-               LLVMValueRef sampleid = unpack_param(ctx, ancillary_vgpr, 8, 4);
+               LLVMValueRef sampleid = si_unpack_param(ctx, ancillary_vgpr, 8, 4);
                LLVMValueRef samplemask = LLVMGetParam(func, ancillary_vgpr + 1);
 
                samplemask = ac_to_integer(&ctx->ac, samplemask);
@@ -7648,10 +7853,10 @@ static void si_build_ps_epilog_function(struct si_shader_context *ctx,
        si_init_function_info(&fninfo);
 
        /* Declare input SGPRs. */
-       ctx->param_rw_buffers = add_arg(&fninfo, ARG_SGPR, ctx->i64);
-       ctx->param_bindless_samplers_and_images = add_arg(&fninfo, ARG_SGPR, ctx->i64);
-       ctx->param_const_and_shader_buffers = add_arg(&fninfo, ARG_SGPR, ctx->i64);
-       ctx->param_samplers_and_images = add_arg(&fninfo, ARG_SGPR, ctx->i64);
+       ctx->param_rw_buffers = add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
+       ctx->param_bindless_samplers_and_images = add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
+       ctx->param_const_and_shader_buffers = add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
+       ctx->param_samplers_and_images = add_arg(&fninfo, ARG_SGPR, ctx->ac.intptr);
        add_arg_checked(&fninfo, ARG_SGPR, ctx->f32, SI_PARAM_ALPHA_REF);
 
        /* Declare input VGPRs. */
@@ -7671,8 +7876,8 @@ static void si_build_ps_epilog_function(struct si_shader_context *ctx,
        /* Create the function. */
        si_create_function(ctx, "ps_epilog", NULL, 0, &fninfo, 0);
        /* Disable elimination of unused inputs. */
-       si_llvm_add_attribute(ctx->main_fn,
-                                 "InitialPSInputAddr", 0xffffff);
+       ac_llvm_add_target_dep_function_attr(ctx->main_fn,
+                                            "InitialPSInputAddr", 0xffffff);
 
        /* Process colors. */
        unsigned vgpr = fninfo.num_sgpr_params;
@@ -7735,7 +7940,7 @@ static void si_build_ps_epilog_function(struct si_shader_context *ctx,
  * Select and compile (or reuse) pixel shader parts (prolog & epilog).
  */
 static bool si_shader_select_ps_parts(struct si_screen *sscreen,
-                                     LLVMTargetMachineRef tm,
+                                     struct ac_llvm_compiler *compiler,
                                      struct si_shader *shader,
                                      struct pipe_debug_callback *debug)
 {
@@ -7750,7 +7955,7 @@ static bool si_shader_select_ps_parts(struct si_screen *sscreen,
                shader->prolog =
                        si_get_shader_part(sscreen, &sscreen->ps_prologs,
                                           PIPE_SHADER_FRAGMENT, true,
-                                          &prolog_key, tm, debug,
+                                          &prolog_key, compiler, debug,
                                           si_build_ps_prolog_function,
                                           "Fragment Shader Prolog");
                if (!shader->prolog)
@@ -7763,7 +7968,7 @@ static bool si_shader_select_ps_parts(struct si_screen *sscreen,
        shader->epilog =
                si_get_shader_part(sscreen, &sscreen->ps_epilogs,
                                   PIPE_SHADER_FRAGMENT, false,
-                                  &epilog_key, tm, debug,
+                                  &epilog_key, compiler, debug,
                                   si_build_ps_epilog_function,
                                   "Fragment Shader Epilog");
        if (!shader->epilog)
@@ -7837,6 +8042,11 @@ static bool si_shader_select_ps_parts(struct si_screen *sscreen,
 void si_multiwave_lds_size_workaround(struct si_screen *sscreen,
                                      unsigned *lds_size)
 {
+       /* If tessellation is all offchip and on-chip GS isn't used, this
+        * workaround is not needed.
+        */
+       return;
+
        /* SPI barrier management bug:
         *   Make sure we have at least 4k of LDS in use to avoid the bug.
         *   It applies to workgroup sizes of more than one wavefront.
@@ -7861,7 +8071,7 @@ static void si_fix_resource_usage(struct si_screen *sscreen,
        }
 }
 
-int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
+int si_shader_create(struct si_screen *sscreen, struct ac_llvm_compiler *compiler,
                     struct si_shader *shader,
                     struct pipe_debug_callback *debug)
 {
@@ -7879,7 +8089,7 @@ int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
                /* Monolithic shader (compiled as a whole, has many variants,
                 * may take a long time to compile).
                 */
-               r = si_compile_tgsi_shader(sscreen, tm, shader, true, debug);
+               r = si_compile_tgsi_shader(sscreen, compiler, shader, debug);
                if (r)
                        return r;
        } else {
@@ -7919,21 +8129,21 @@ int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
                /* Select prologs and/or epilogs. */
                switch (sel->type) {
                case PIPE_SHADER_VERTEX:
-                       if (!si_shader_select_vs_parts(sscreen, tm, shader, debug))
+                       if (!si_shader_select_vs_parts(sscreen, compiler, shader, debug))
                                return -1;
                        break;
                case PIPE_SHADER_TESS_CTRL:
-                       if (!si_shader_select_tcs_parts(sscreen, tm, shader, debug))
+                       if (!si_shader_select_tcs_parts(sscreen, compiler, shader, debug))
                                return -1;
                        break;
                case PIPE_SHADER_TESS_EVAL:
                        break;
                case PIPE_SHADER_GEOMETRY:
-                       if (!si_shader_select_gs_parts(sscreen, tm, shader, debug))
+                       if (!si_shader_select_gs_parts(sscreen, compiler, shader, debug))
                                return -1;
                        break;
                case PIPE_SHADER_FRAGMENT:
-                       if (!si_shader_select_ps_parts(sscreen, tm, shader, debug))
+                       if (!si_shader_select_ps_parts(sscreen, compiler, shader, debug))
                                return -1;
 
                        /* Make sure we have at least as many VGPRs as there