I'd prefer if Dylan's patch goes first, as we are bumping swr too otherwise.

Though either way:

Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>

On Fri, Feb 2, 2018 at 8:15 PM, Dylan Baker <dy...@pnwbakers.com> wrote:
> FYI: I sent out a patch a few minutes ago to set the minimum version more like
> autotools does, but I'm fine with this landing first.
>
> Reviewed-by: Dylan Baker <dy...@pnwbakers.com>
>
> Quoting Marek Olšák (2018-02-02 11:07:57)
>> Adding this:
>>
>> diff --git a/meson.build b/meson.build
>> index 80ea60f..22eb702 100644
>> --- a/meson.build
>> +++ b/meson.build
>> @@ -991,12 +991,12 @@ endif
>>  _llvm = get_option('llvm')
>>  if _llvm == 'auto'
>>    dep_llvm = dependency(
>> -    'llvm', version : '>= 3.9.0', modules : llvm_modules,
>> +    'llvm', version : '>= 4.0.0', modules : llvm_modules,
>>      required : with_amd_vk or with_gallium_radeonsi or with_gallium_swr or
>> with_gallium_opencl,
>>    )
>>    with_llvm = dep_llvm.found()
>>  elif _llvm == 'true'
>> -  dep_llvm = dependency('llvm', version : '>= 3.9.0', modules : 
>> llvm_modules)
>> +  dep_llvm = dependency('llvm', version : '>= 4.0.0', modules : 
>> llvm_modules)
>>    with_llvm = true
>>  else
>>    dep_llvm = []
>> @@ -1019,7 +1019,7 @@ if with_llvm
>>      '-DMESA_LLVM_VERSION_PATCH=@0@'.format(_llvm_patch),
>>    ]
>>  elif with_amd_vk or with_gallium_radeonsi or with_gallium_swr
>> -  error('The following drivers requires LLVM: Radv, RadeonSI, SWR. One of
>> these is enabled, but LLVM is disabled.')
>> +  error('The following drivers require LLVM: Radv, RadeonSI, SWR. One of 
>> these
>> is enabled, but LLVM is disabled.')
>>  endif
>>
>>  dep_glvnd = []
>>
>> Marek
>>
>> On Fri, Feb 2, 2018 at 8:02 PM, Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
>> wrote:
>>
>>     Also change meson.build?
>>
>>     On Fri, Feb 2, 2018 at 7:34 PM, Marek Olšák <mar...@gmail.com> wrote:
>>     > From: Marek Olšák <marek.ol...@amd.com>
>>     >
>>     > Only these are supported:
>>     > - LLVM 4.0
>>     > - LLVM 5.0
>>     > - LLVM 6.0
>>     > - master (7.0)
>>     > ---
>>     >  configure.ac                                       |   4 +-
>>     >  src/amd/common/ac_llvm_build.c                     | 187
>>     ++++++---------------
>>     >  src/amd/common/ac_llvm_helper.cpp                  |  10 --
>>     >  src/amd/common/ac_llvm_util.c                      |  39 +----
>>     >  src/amd/common/ac_llvm_util.h                      |  14 +-
>>     >  src/amd/common/ac_nir_to_llvm.c                    |  32 +---
>>     >  src/amd/vulkan/radv_device.c                       |   4 -
>>     >  src/gallium/drivers/radeonsi/si_compute.c          |   3 +-
>>     >  src/gallium/drivers/radeonsi/si_get.c              |  13 +-
>>     >  src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c  |   3 +-
>>     >  .../drivers/radeonsi/si_shader_tgsi_setup.c        |   2 -
>>     >  11 files changed, 72 insertions(+), 239 deletions(-)
>>     >
>>     > diff --git a/configure.ac b/configure.ac
>>     > index a54b7cb..8ed606c 100644
>>     > --- a/configure.ac
>>     > +++ b/configure.ac
>>     > @@ -96,22 +96,22 @@ XDAMAGE_REQUIRED=1.1
>>     >  XSHMFENCE_REQUIRED=1.1
>>     >  XVMC_REQUIRED=1.0.6
>>     >  PYTHON_MAKO_REQUIRED=0.8.0
>>     >  LIBSENSORS_REQUIRED=4.0.0
>>     >  ZLIB_REQUIRED=1.2.3
>>     >
>>     >  dnl LLVM versions
>>     >  LLVM_REQUIRED_GALLIUM=3.3.0
>>     >  LLVM_REQUIRED_OPENCL=3.9.0
>>     >  LLVM_REQUIRED_R600=3.9.0
>>     > -LLVM_REQUIRED_RADEONSI=3.9.0
>>     > -LLVM_REQUIRED_RADV=3.9.0
>>     > +LLVM_REQUIRED_RADEONSI=4.0.0
>>     > +LLVM_REQUIRED_RADV=4.0.0
>>     >  LLVM_REQUIRED_SWR=3.9.0
>>     >
>>     >  dnl Check for progs
>>     >  AC_PROG_CPP
>>     >  AC_PROG_CC
>>     >  AC_PROG_CXX
>>     >  dnl add this here, so the help for this environmnet variable is close 
>> to
>>     >  dnl other CC/CXX flags related help
>>     >  AC_ARG_VAR([CXX11_CXXFLAGS], [Compiler flag to enable C++11 support
>>     (only needed if not
>>     >                                enabled by default and different  from
>>     -std=c++11)])
>>     > diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_
>>     build.c
>>     > index 6ede60a..3efcaa1 100644
>>     > --- a/src/amd/common/ac_llvm_build.c
>>     > +++ b/src/amd/common/ac_llvm_build.c
>>     > @@ -213,22 +213,21 @@ ac_to_float(struct ac_llvm_context *ctx,
>>     LLVMValueRef v)
>>     >         return LLVMBuildBitCast(ctx->builder, v, ac_to_float_type(ctx,
>>     type), "");
>>     >  }
>>     >
>>     >
>>     >  LLVMValueRef
>>     >  ac_build_intrinsic(struct ac_llvm_context *ctx, const char *name,
>>     >                    LLVMTypeRef return_type, LLVMValueRef *params,
>>     >                    unsigned param_count, unsigned attrib_mask)
>>     >  {
>>     >         LLVMValueRef function, call;
>>     > -       bool set_callsite_attrs = HAVE_LLVM >= 0x0400 &&
>>     > -                                 !(attrib_mask & AC_FUNC_ATTR_LEGACY);
>>     > +       bool set_callsite_attrs = !(attrib_mask & AC_FUNC_ATTR_LEGACY);
>>     >
>>     >         function = LLVMGetNamedFunction(ctx->module, name);
>>     >         if (!function) {
>>     >                 LLVMTypeRef param_types[32], function_type;
>>     >                 unsigned i;
>>     >
>>     >                 assert(param_count <= 32);
>>     >
>>     >                 for (i = 0; i < param_count; ++i) {
>>     >                         assert(params[i]);
>>     > @@ -714,34 +713,20 @@ ac_prepare_cube_coords(struct ac_llvm_context 
>> *ctx,
>>     >  LLVMValueRef
>>     >  ac_build_fs_interp(struct ac_llvm_context *ctx,
>>     >                    LLVMValueRef llvm_chan,
>>     >                    LLVMValueRef attr_number,
>>     >                    LLVMValueRef params,
>>     >                    LLVMValueRef i,
>>     >                    LLVMValueRef j)
>>     >  {
>>     >         LLVMValueRef args[5];
>>     >         LLVMValueRef p1;
>>     > -
>>     > -       if (HAVE_LLVM < 0x0400) {
>>     > -               LLVMValueRef ij[2];
>>     > -               ij[0] = LLVMBuildBitCast(ctx->builder, i, ctx->i32, 
>> "");
>>     > -               ij[1] = LLVMBuildBitCast(ctx->builder, j, ctx->i32, 
>> "");
>>     > -
>>     > -               args[0] = llvm_chan;
>>     > -               args[1] = attr_number;
>>     > -               args[2] = params;
>>     > -               args[3] = ac_build_gather_values(ctx, ij, 2);
>>     > -               return ac_build_intrinsic(ctx, "llvm.SI.fs.interp",
>>     > -                                         ctx->f32, args, 4,
>>     > -                                         AC_FUNC_ATTR_READNONE);
>>     > -       }
>>     >
>>     >         args[0] = i;
>>     >         args[1] = llvm_chan;
>>     >         args[2] = attr_number;
>>     >         args[3] = params;
>>     >
>>     >         p1 = ac_build_intrinsic(ctx, "llvm.amdgcn.interp.p1",
>>     >                                 ctx->f32, args, 4,
>>     AC_FUNC_ATTR_READNONE);
>>     >
>>     >         args[0] = p1;
>>     > @@ -755,30 +740,20 @@ ac_build_fs_interp(struct ac_llvm_context *ctx,
>>     >  }
>>     >
>>     >  LLVMValueRef
>>     >  ac_build_fs_interp_mov(struct ac_llvm_context *ctx,
>>     >                        LLVMValueRef parameter,
>>     >                        LLVMValueRef llvm_chan,
>>     >                        LLVMValueRef attr_number,
>>     >                        LLVMValueRef params)
>>     >  {
>>     >         LLVMValueRef args[4];
>>     > -       if (HAVE_LLVM < 0x0400) {
>>     > -               args[0] = llvm_chan;
>>     > -               args[1] = attr_number;
>>     > -               args[2] = params;
>>     > -
>>     > -               return ac_build_intrinsic(ctx,
>>     > -                                         "llvm.SI.fs.constant",
>>     > -                                         ctx->f32, args, 3,
>>     > -                                         AC_FUNC_ATTR_READNONE);
>>     > -       }
>>     >
>>     >         args[0] = parameter;
>>     >         args[1] = llvm_chan;
>>     >         args[2] = attr_number;
>>     >         args[3] = params;
>>     >
>>     >         return ac_build_intrinsic(ctx, "llvm.amdgcn.interp.mov",
>>     >                                   ctx->f32, args, 4,
>>     AC_FUNC_ATTR_READNONE);
>>     >  }
>>     >
>>     > @@ -1202,34 +1177,31 @@ ac_build_ddxy(struct ac_llvm_context *ctx,
>>     >         result = LLVMBuildFSub(ctx->builder, trbl, tl, "");
>>     >         return result;
>>     >  }
>>     >
>>     >  void
>>     >  ac_build_sendmsg(struct ac_llvm_context *ctx,
>>     >                  uint32_t msg,
>>     >                  LLVMValueRef wave_id)
>>     >  {
>>     >         LLVMValueRef args[2];
>>     > -       const char *intr_name = (HAVE_LLVM < 0x0400) ? 
>> "llvm.SI.sendmsg"
>>     : "llvm.amdgcn.s.sendmsg";
>>     >         args[0] = LLVMConstInt(ctx->i32, msg, false);
>>     >         args[1] = wave_id;
>>     > -       ac_build_intrinsic(ctx, intr_name, ctx->voidt, args, 2, 0);
>>     > +       ac_build_intrinsic(ctx, "llvm.amdgcn.s.sendmsg", ctx->voidt,
>>     args, 2, 0);
>>     >  }
>>     >
>>     >  LLVMValueRef
>>     >  ac_build_imsb(struct ac_llvm_context *ctx,
>>     >               LLVMValueRef arg,
>>     >               LLVMTypeRef dst_type)
>>     >  {
>>     > -       const char *intr_name = (HAVE_LLVM < 0x0400) ?
>>     "llvm.AMDGPU.flbit.i32" :
>>     > -
>>     "llvm.amdgcn.sffbh.i32";
>>     > -       LLVMValueRef msb = ac_build_intrinsic(ctx, intr_name,
>>     > +       LLVMValueRef msb = ac_build_intrinsic(ctx,
>>     "llvm.amdgcn.sffbh.i32",
>>     >                                               dst_type, &arg, 1,
>>     >                                               AC_FUNC_ATTR_READNONE);
>>     >
>>     >         /* The HW returns the last bit index from MSB, but NIR/TGSI 
>> wants
>>     >          * the index from LSB. Invert it by doing "31 - msb". */
>>     >         msb = LLVMBuildSub(ctx->builder, LLVMConstInt(ctx->i32, 31,
>>     false),
>>     >                            msb, "");
>>     >
>>     >         LLVMValueRef all_ones = LLVMConstInt(ctx->i32, -1, true);
>>     >         LLVMValueRef cond = LLVMBuildOr(ctx->builder,
>>     > @@ -1363,151 +1335,90 @@ void ac_build_export(struct ac_llvm_context
>>     *ctx, struct ac_export_args *a)
>>     >         args[4] = LLVMConstInt(ctx->i32, a->compr, 0);
>>     >         memcpy(args + 5, a->out, sizeof(a->out[0]) * 4);
>>     >
>>     >         ac_build_intrinsic(ctx, "llvm.SI.export", ctx->voidt, args, 9,
>>     >                            AC_FUNC_ATTR_LEGACY);
>>     >  }
>>     >
>>     >  LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx,
>>     >                                    struct ac_image_args *a)
>>     >  {
>>     > -       LLVMTypeRef dst_type;
>>     >         LLVMValueRef args[11];
>>     >         unsigned num_args = 0;
>>     >         const char *name = NULL;
>>     >         char intr_name[128], type[64];
>>     >
>>     > -       if (HAVE_LLVM >= 0x0400) {
>>     > -               bool sample = a->opcode == ac_image_sample ||
>>     > -                             a->opcode == ac_image_gather4 ||
>>     > -                             a->opcode == ac_image_get_lod;
>>     > -
>>     > -               if (sample)
>>     > -                       args[num_args++] = ac_to_float(ctx, a->addr);
>>     > -               else
>>     > -                       args[num_args++] = a->addr;
>>     > -
>>     > -               args[num_args++] = a->resource;
>>     > -               if (sample)
>>     > -                       args[num_args++] = a->sampler;
>>     > -               args[num_args++] = LLVMConstInt(ctx->i32, a->dmask, 0);
>>     > -               if (sample)
>>     > -                       args[num_args++] = LLVMConstInt(ctx->i1, a->
>>     unorm, 0);
>>     > -               args[num_args++] = ctx->i1false; /* glc */
>>     > -               args[num_args++] = ctx->i1false; /* slc */
>>     > -               args[num_args++] = ctx->i1false; /* lwe */
>>     > -               args[num_args++] = LLVMConstInt(ctx->i1, a->da, 0);
>>     > -
>>     > -               switch (a->opcode) {
>>     > -               case ac_image_sample:
>>     > -                       name = "llvm.amdgcn.image.sample";
>>     > -                       break;
>>     > -               case ac_image_gather4:
>>     > -                       name = "llvm.amdgcn.image.gather4";
>>     > -                       break;
>>     > -               case ac_image_load:
>>     > -                       name = "llvm.amdgcn.image.load";
>>     > -                       break;
>>     > -               case ac_image_load_mip:
>>     > -                       name = "llvm.amdgcn.image.load.mip";
>>     > -                       break;
>>     > -               case ac_image_get_lod:
>>     > -                       name = "llvm.amdgcn.image.getlod";
>>     > -                       break;
>>     > -               case ac_image_get_resinfo:
>>     > -                       name = "llvm.amdgcn.image.getresinfo";
>>     > -                       break;
>>     > -               default:
>>     > -                       unreachable("invalid image opcode");
>>     > -               }
>>     > +       bool sample = a->opcode == ac_image_sample ||
>>     > +                     a->opcode == ac_image_gather4 ||
>>     > +                     a->opcode == ac_image_get_lod;
>>     >
>>     > -               ac_build_type_name_for_intr(LLVMTypeOf(args[0]), type,
>>     > -                                           sizeof(type));
>>     > -
>>     > -               snprintf(intr_name, sizeof(intr_name),
>>     "%s%s%s%s.v4f32.%s.v8i32",
>>     > -                       name,
>>     > -                       a->compare ? ".c" : "",
>>     > -                       a->bias ? ".b" :
>>     > -                       a->lod ? ".l" :
>>     > -                       a->deriv ? ".d" :
>>     > -                       a->level_zero ? ".lz" : "",
>>     > -                       a->offset ? ".o" : "",
>>     > -                       type);
>>     > -
>>     > -               LLVMValueRef result =
>>     > -                       ac_build_intrinsic(ctx, intr_name,
>>     > -                                          ctx->v4f32, args, num_args,
>>     > -                                          AC_FUNC_ATTR_READNONE);
>>     > -               if (!sample) {
>>     > -                       result = LLVMBuildBitCast(ctx->builder, result,
>>     > -                                                 ctx->v4i32, "");
>>     > -               }
>>     > -               return result;
>>     > -       }
>>     > +       if (sample)
>>     > +               args[num_args++] = ac_to_float(ctx, a->addr);
>>     > +       else
>>     > +               args[num_args++] = a->addr;
>>     >
>>     > -       args[num_args++] = a->addr;
>>     >         args[num_args++] = a->resource;
>>     > -
>>     > -       if (a->opcode == ac_image_load ||
>>     > -           a->opcode == ac_image_load_mip ||
>>     > -           a->opcode == ac_image_get_resinfo) {
>>     > -               dst_type = ctx->v4i32;
>>     > -       } else {
>>     > -               dst_type = ctx->v4f32;
>>     > +       if (sample)
>>     >                 args[num_args++] = a->sampler;
>>     > -       }
>>     > -
>>     >         args[num_args++] = LLVMConstInt(ctx->i32, a->dmask, 0);
>>     > -       args[num_args++] = LLVMConstInt(ctx->i32, a->unorm, 0);
>>     > -       args[num_args++] = LLVMConstInt(ctx->i32, 0, 0); /* r128 */
>>     > -       args[num_args++] = LLVMConstInt(ctx->i32, a->da, 0);
>>     > -       args[num_args++] = LLVMConstInt(ctx->i32, 0, 0); /* glc */
>>     > -       args[num_args++] = LLVMConstInt(ctx->i32, 0, 0); /* slc */
>>     > -       args[num_args++] = LLVMConstInt(ctx->i32, 0, 0); /* tfe */
>>     > -       args[num_args++] = LLVMConstInt(ctx->i32, 0, 0); /* lwe */
>>     > +       if (sample)
>>     > +               args[num_args++] = LLVMConstInt(ctx->i1, a->unorm, 0);
>>     > +       args[num_args++] = ctx->i1false; /* glc */
>>     > +       args[num_args++] = ctx->i1false; /* slc */
>>     > +       args[num_args++] = ctx->i1false; /* lwe */
>>     > +       args[num_args++] = LLVMConstInt(ctx->i1, a->da, 0);
>>     >
>>     >         switch (a->opcode) {
>>     >         case ac_image_sample:
>>     > -               name = "llvm.SI.image.sample";
>>     > +               name = "llvm.amdgcn.image.sample";
>>     >                 break;
>>     >         case ac_image_gather4:
>>     > -               name = "llvm.SI.gather4";
>>     > +               name = "llvm.amdgcn.image.gather4";
>>     >                 break;
>>     >         case ac_image_load:
>>     > -               name = "llvm.SI.image.load";
>>     > +               name = "llvm.amdgcn.image.load";
>>     >                 break;
>>     >         case ac_image_load_mip:
>>     > -               name = "llvm.SI.image.load.mip";
>>     > +               name = "llvm.amdgcn.image.load.mip";
>>     >                 break;
>>     >         case ac_image_get_lod:
>>     > -               name = "llvm.SI.getlod";
>>     > +               name = "llvm.amdgcn.image.getlod";
>>     >                 break;
>>     >         case ac_image_get_resinfo:
>>     > -               name = "llvm.SI.getresinfo";
>>     > +               name = "llvm.amdgcn.image.getresinfo";
>>     >                 break;
>>     > +       default:
>>     > +               unreachable("invalid image opcode");
>>     >         }
>>     >
>>     > -       ac_build_type_name_for_intr(LLVMTypeOf(a->addr), type, sizeof
>>     (type));
>>     > -       snprintf(intr_name, sizeof(intr_name), "%s%s%s%s.%s",
>>     > +       ac_build_type_name_for_intr(LLVMTypeOf(args[0]), type,
>>     > +                                   sizeof(type));
>>     > +
>>     > +       snprintf(intr_name, sizeof(intr_name), 
>> "%s%s%s%s.v4f32.%s.v8i32",
>>     >                 name,
>>     >                 a->compare ? ".c" : "",
>>     >                 a->bias ? ".b" :
>>     >                 a->lod ? ".l" :
>>     >                 a->deriv ? ".d" :
>>     >                 a->level_zero ? ".lz" : "",
>>     >                 a->offset ? ".o" : "",
>>     >                 type);
>>     >
>>     > -       return ac_build_intrinsic(ctx, intr_name,
>>     > -                                 dst_type, args, num_args,
>>     > -                                 AC_FUNC_ATTR_READNONE |
>>     > -                                 AC_FUNC_ATTR_LEGACY);
>>     > +       LLVMValueRef result =
>>     > +               ac_build_intrinsic(ctx, intr_name,
>>     > +                                  ctx->v4f32, args, num_args,
>>     > +                                  AC_FUNC_ATTR_READNONE);
>>     > +       if (!sample) {
>>     > +               result = LLVMBuildBitCast(ctx->builder, result,
>>     > +                                         ctx->v4i32, "");
>>     > +       }
>>     > +       return result;
>>     >  }
>>     >
>>     >  LLVMValueRef ac_build_cvt_pkrtz_f16(struct ac_llvm_context *ctx,
>>     >                                     LLVMValueRef args[2])
>>     >  {
>>     >         if (HAVE_LLVM >= 0x0500) {
>>     >                 LLVMTypeRef v2f16 =
>>     >                         LLVMVectorType(LLVMHalfTypeInContext(ctx->
>>     context), 2);
>>     >                 LLVMValueRef res =
>>     >                         ac_build_intrinsic(ctx, 
>> "llvm.amdgcn.cvt.pkrtz",
>>     > @@ -1731,33 +1642,29 @@ void ac_get_image_intr_name(const char
>>     *base_name,
>>     >                             LLVMTypeRef data_type,
>>     >                             LLVMTypeRef coords_type,
>>     >                             LLVMTypeRef rsrc_type,
>>     >                             char *out_name, unsigned out_len)
>>     >  {
>>     >          char coords_type_name[8];
>>     >
>>     >          ac_build_type_name_for_intr(coords_type, coords_type_name,
>>     >                              sizeof(coords_type_name));
>>     >
>>     > -        if (HAVE_LLVM <= 0x0309) {
>>     > -                snprintf(out_name, out_len, "%s.%s", base_name,
>>     coords_type_name);
>>     > -        } else {
>>     > -                char data_type_name[8];
>>     > -                char rsrc_type_name[8];
>>     > -
>>     > -                ac_build_type_name_for_intr(data_type, data_type_name,
>>     > -                                        sizeof(data_type_name));
>>     > -                ac_build_type_name_for_intr(rsrc_type, rsrc_type_name,
>>     > -                                        sizeof(rsrc_type_name));
>>     > -                snprintf(out_name, out_len, "%s.%s.%s.%s", base_name,
>>     > -                         data_type_name, coords_type_name,
>>     rsrc_type_name);
>>     > -        }
>>     > +       char data_type_name[8];
>>     > +       char rsrc_type_name[8];
>>     > +
>>     > +       ac_build_type_name_for_intr(data_type, data_type_name,
>>     > +                                   sizeof(data_type_name));
>>     > +       ac_build_type_name_for_intr(rsrc_type, rsrc_type_name,
>>     > +                                   sizeof(rsrc_type_name));
>>     > +       snprintf(out_name, out_len, "%s.%s.%s.%s", base_name,
>>     > +                data_type_name, coords_type_name, rsrc_type_name);
>>     >  }
>>     >
>>     >  #define AC_EXP_TARGET (HAVE_LLVM >= 0x0500 ? 0 : 3)
>>     >  #define AC_EXP_OUT0 (HAVE_LLVM >= 0x0500 ? 2 : 5)
>>     >
>>     >  enum ac_ir_type {
>>     >         AC_IR_UNDEF,
>>     >         AC_IR_CONST,
>>     >         AC_IR_VALUE,
>>     >  };
>>     > diff --git a/src/amd/common/ac_llvm_helper.cpp 
>> b/src/amd/common/ac_llvm_
>>     helper.cpp
>>     > index 793737c..1d2369b 100644
>>     > --- a/src/amd/common/ac_llvm_helper.cpp
>>     > +++ b/src/amd/common/ac_llvm_helper.cpp
>>     > @@ -58,54 +58,44 @@ void ac_add_attr_dereferenceable(LLVMValueRef val,
>>     uint64_t bytes)
>>     >  bool ac_is_sgpr_param(LLVMValueRef arg)
>>     >  {
>>     >         llvm::Argument *A = llvm::unwrap<llvm::Argument>(arg);
>>     >         llvm::AttributeList AS = A->getParent()->getAttributes();
>>     >         unsigned ArgNo = A->getArgNo();
>>     >         return AS.hasAttribute(ArgNo + 1, llvm::Attribute::InReg);
>>     >  }
>>     >
>>     >  LLVMValueRef ac_llvm_get_called_value(LLVMValueRef call)
>>     >  {
>>     > -#if HAVE_LLVM >= 0x0309
>>     >         return LLVMGetCalledValue(call);
>>     > -#else
>>     > -       return 
>> llvm::wrap(llvm::CallSite(llvm::unwrap<llvm::Instruction>
>>     (call)).getCalledValue());
>>     > -#endif
>>     >  }
>>     >
>>     >  bool ac_llvm_is_function(LLVMValueRef v)
>>     >  {
>>     > -#if HAVE_LLVM >= 0x0309
>>     >         return LLVMGetValueKind(v) == LLVMFunctionValueKind;
>>     > -#else
>>     > -       return llvm::isa<llvm::Function>(llvm::unwrap(v));
>>     > -#endif
>>     >  }
>>     >
>>     >  LLVMBuilderRef ac_create_builder(LLVMContextRef ctx,
>>     >                                  enum ac_float_mode float_mode)
>>     >  {
>>     >         LLVMBuilderRef builder = LLVMCreateBuilderInContext(ctx);
>>     >
>>     > -#if HAVE_LLVM >= 0x0308
>>     >         llvm::FastMathFlags flags;
>>     >
>>     >         switch (float_mode) {
>>     >         case AC_FLOAT_MODE_DEFAULT:
>>     >                 break;
>>     >         case AC_FLOAT_MODE_NO_SIGNED_ZEROS_FP_MATH:
>>     >                 flags.setNoSignedZeros();
>>     >                 llvm::unwrap(builder)->setFastMathFlags(flags);
>>     >                 break;
>>     >         case AC_FLOAT_MODE_UNSAFE_FP_MATH:
>>     >  #if HAVE_LLVM >= 0x0600
>>     >                 flags.setFast();
>>     >  #else
>>     >                 flags.setUnsafeAlgebra();
>>     >  #endif
>>     >                 llvm::unwrap(builder)->setFastMathFlags(flags);
>>     >                 break;
>>     >         }
>>     > -#endif
>>     >
>>     >         return builder;
>>     >  }
>>     > diff --git a/src/amd/common/ac_llvm_util.c 
>> b/src/amd/common/ac_llvm_util.
>>     c
>>     > index 5fd785a..b88c4e4 100644
>>     > --- a/src/amd/common/ac_llvm_util.c
>>     > +++ b/src/amd/common/ac_llvm_util.c
>>     > @@ -39,26 +39,25 @@ static void ac_init_llvm_target()
>>     >         LLVMInitializeAMDGPUTarget();
>>     >         LLVMInitializeAMDGPUTargetMC();
>>     >         LLVMInitializeAMDGPUAsmPrinter();
>>     >
>>     >         /* For inline assembly. */
>>     >         LLVMInitializeAMDGPUAsmParser();
>>     >
>>     >         /* Workaround for bug in llvm 4.0 that causes image intrinsics
>>     >          * to disappear.
>>     >          * https://reviews.llvm.org/D26348
>>     > +        *
>>     > +        * "mesa" is the prefix for error messages.
>>     >          */
>>     > -       if (HAVE_LLVM >= 0x0400) {
>>     > -               /* "mesa" is the prefix for error messages */
>>     > -               const char *argv[2] = { "mesa", 
>> "-simplifycfg-sink-common
>>     =false" };
>>     > -               LLVMParseCommandLineOptions(2, argv, NULL);
>>     > -       }
>>     > +       const char *argv[2] = { "mesa", 
>> "-simplifycfg-sink-common=false"
>>     };
>>     > +       LLVMParseCommandLineOptions(2, argv, NULL);
>>     >  }
>>     >
>>     >  static once_flag ac_init_llvm_target_once_flag = ONCE_FLAG_INIT;
>>     >
>>     >  LLVMTargetRef ac_get_llvm_target(const char *triple)
>>     >  {
>>     >         LLVMTargetRef target = NULL;
>>     >         char *err_message = NULL;
>>     >
>>     >         call_once(&ac_init_llvm_target_once_flag, ac_init_llvm_target);
>>     > @@ -139,81 +138,51 @@ LLVMTargetMachineRef 
>> ac_create_target_machine(enum
>>     radeon_family family, enum ac
>>     >                                      triple,
>>     >                                      
>> ac_get_llvm_processor_name(family),
>>     >                                      features,
>>     >                                      LLVMCodeGenLevelDefault,
>>     >                                      LLVMRelocDefault,
>>     >                                      LLVMCodeModelDefault);
>>     >
>>     >         return tm;
>>     >  }
>>     >
>>     > -
>>     > -#if HAVE_LLVM < 0x0400
>>     > -static LLVMAttribute ac_attr_to_llvm_attr(enum ac_func_attr attr)
>>     > -{
>>     > -   switch (attr) {
>>     > -   case AC_FUNC_ATTR_ALWAYSINLINE: return LLVMAlwaysInlineAttribute;
>>     > -   case AC_FUNC_ATTR_INREG: return LLVMInRegAttribute;
>>     > -   case AC_FUNC_ATTR_NOALIAS: return LLVMNoAliasAttribute;
>>     > -   case AC_FUNC_ATTR_NOUNWIND: return LLVMNoUnwindAttribute;
>>     > -   case AC_FUNC_ATTR_READNONE: return LLVMReadNoneAttribute;
>>     > -   case AC_FUNC_ATTR_READONLY: return LLVMReadOnlyAttribute;
>>     > -   default:
>>     > -          fprintf(stderr, "Unhandled function attribute: %x\n", attr);
>>     > -          return 0;
>>     > -   }
>>     > -}
>>     > -
>>     > -#else
>>     > -
>>     >  static const char *attr_to_str(enum ac_func_attr attr)
>>     >  {
>>     >     switch (attr) {
>>     >     case AC_FUNC_ATTR_ALWAYSINLINE: return "alwaysinline";
>>     >     case AC_FUNC_ATTR_INREG: return "inreg";
>>     >     case AC_FUNC_ATTR_NOALIAS: return "noalias";
>>     >     case AC_FUNC_ATTR_NOUNWIND: return "nounwind";
>>     >     case AC_FUNC_ATTR_READNONE: return "readnone";
>>     >     case AC_FUNC_ATTR_READONLY: return "readonly";
>>     >     case AC_FUNC_ATTR_WRITEONLY: return "writeonly";
>>     >     case AC_FUNC_ATTR_INACCESSIBLE_MEM_ONLY: return
>>     "inaccessiblememonly";
>>     >     case AC_FUNC_ATTR_CONVERGENT: return "convergent";
>>     >     default:
>>     >            fprintf(stderr, "Unhandled function attribute: %x\n", attr);
>>     >            return 0;
>>     >     }
>>     >  }
>>     >
>>     > -#endif
>>     > -
>>     >  void
>>     >  ac_add_function_attr(LLVMContextRef ctx, LLVMValueRef function,
>>     >                       int attr_idx, enum ac_func_attr attr)
>>     >  {
>>     > -#if HAVE_LLVM < 0x0400
>>     > -   LLVMAttribute llvm_attr = ac_attr_to_llvm_attr(attr);
>>     > -   if (attr_idx == -1) {
>>     > -      LLVMAddFunctionAttr(function, llvm_attr);
>>     > -   } else {
>>     > -      LLVMAddAttribute(LLVMGetParam(function, attr_idx - 1), 
>> llvm_attr);
>>     > -   }
>>     > -#else
>>     >     const char *attr_name = attr_to_str(attr);
>>     >     unsigned kind_id = LLVMGetEnumAttributeKindForName(attr_name,
>>     >                                                        strlen
>>     (attr_name));
>>     >     LLVMAttributeRef llvm_attr = LLVMCreateEnumAttribute(ctx, kind_id,
>>     0);
>>     >
>>     >     if (LLVMIsAFunction(function))
>>     >        LLVMAddAttributeAtIndex(function, attr_idx, llvm_attr);
>>     >     else
>>     >        LLVMAddCallSiteAttribute(function, attr_idx, llvm_attr);
>>     > -#endif
>>     >  }
>>     >
>>     >  void ac_add_func_attributes(LLVMContextRef ctx, LLVMValueRef function,
>>     >                             unsigned attrib_mask)
>>     >  {
>>     >         attrib_mask |= AC_FUNC_ATTR_NOUNWIND;
>>     >         attrib_mask &= ~AC_FUNC_ATTR_LEGACY;
>>     >
>>     >         while (attrib_mask) {
>>     >                 enum ac_func_attr attr = 1u << 
>> u_bit_scan(&attrib_mask);
>>     > diff --git a/src/amd/common/ac_llvm_util.h 
>> b/src/amd/common/ac_llvm_util.
>>     h
>>     > index 29dc0c1..3cf385a 100644
>>     > --- a/src/amd/common/ac_llvm_util.h
>>     > +++ b/src/amd/common/ac_llvm_util.h
>>     > @@ -35,23 +35,23 @@
>>     >  extern "C" {
>>     >  #endif
>>     >
>>     >  enum ac_func_attr {
>>     >         AC_FUNC_ATTR_ALWAYSINLINE = (1 << 0),
>>     >         AC_FUNC_ATTR_INREG        = (1 << 2),
>>     >         AC_FUNC_ATTR_NOALIAS      = (1 << 3),
>>     >         AC_FUNC_ATTR_NOUNWIND     = (1 << 4),
>>     >         AC_FUNC_ATTR_READNONE     = (1 << 5),
>>     >         AC_FUNC_ATTR_READONLY     = (1 << 6),
>>     > -       AC_FUNC_ATTR_WRITEONLY    = HAVE_LLVM >= 0x0400 ? (1 << 7) : 0,
>>     > -       AC_FUNC_ATTR_INACCESSIBLE_MEM_ONLY = HAVE_LLVM >= 0x0400 ? (1 
>> <<
>>     8) : 0,
>>     > -       AC_FUNC_ATTR_CONVERGENT = HAVE_LLVM >= 0x0400 ? (1 << 9) : 0,
>>     > +       AC_FUNC_ATTR_WRITEONLY    = (1 << 7),
>>     > +       AC_FUNC_ATTR_INACCESSIBLE_MEM_ONLY = (1 << 8),
>>     > +       AC_FUNC_ATTR_CONVERGENT = (1 << 9),
>>     >
>>     >         /* Legacy intrinsic that needs attributes on function
>>     declarations
>>     >          * and they must match the internal LLVM definition exactly,
>>     otherwise
>>     >          * intrinsic selection fails.
>>     >          */
>>     >         AC_FUNC_ATTR_LEGACY       = (1u << 31),
>>     >  };
>>     >
>>     >  enum ac_target_machine_options {
>>     >         AC_TM_SUPPORTS_SPILL = (1 << 0),
>>     > @@ -87,28 +87,26 @@ LLVMBuilderRef ac_create_builder(LLVMContextRef 
>> ctx,
>>     >
>>     >  void
>>     >  ac_llvm_add_target_dep_function_attr(LLVMValueRef F,
>>     >                                      const char *name, int value);
>>     >
>>     >  static inline unsigned
>>     >  ac_get_load_intr_attribs(bool can_speculate)
>>     >  {
>>     >         /* READNONE means writes can't affect it, while READONLY means
>>     that
>>     >          * writes can affect it. */
>>     > -       return can_speculate && HAVE_LLVM >= 0x0400 ?
>>     > -                                AC_FUNC_ATTR_READNONE :
>>     > -                                AC_FUNC_ATTR_READONLY;
>>     > +       return can_speculate ? AC_FUNC_ATTR_READNONE :
>>     > +                              AC_FUNC_ATTR_READONLY;
>>     >  }
>>     >
>>     >  static inline unsigned
>>     >  ac_get_store_intr_attribs(bool writeonly_memory)
>>     >  {
>>     > -       return writeonly_memory && HAVE_LLVM >= 0x0400 ?
>>     > -                                 AC_FUNC_ATTR_INACCESSIBLE_MEM_ONLY :
>>     > +       return writeonly_memory ? AC_FUNC_ATTR_INACCESSIBLE_MEM_ONLY :
>>     >                                   AC_FUNC_ATTR_WRITEONLY;
>>     >  }
>>     >
>>     >  #ifdef __cplusplus
>>     >  }
>>     >  #endif
>>     >
>>     >  #endif /* AC_LLVM_UTIL_H */
>>     > diff --git a/src/amd/common/ac_nir_to_llvm.c 
>> b/src/amd/common/ac_nir_to_
>>     llvm.c
>>     > index 0f7d625..cfcd217 100644
>>     > --- a/src/amd/common/ac_nir_to_llvm.c
>>     > +++ b/src/amd/common/ac_nir_to_llvm.c
>>     > @@ -3628,32 +3628,24 @@ static LLVMValueRef visit_image_load(struct
>>     ac_nir_context *ctx,
>>     >                              dim == GLSL_SAMPLER_DIM_3D ||
>>     >                              dim == GLSL_SAMPLER_DIM_SUBPASS ||
>>     >                              dim == GLSL_SAMPLER_DIM_SUBPASS_MS;
>>     >                 LLVMValueRef da = is_da ? ctx->ac.i1true : ctx->
>>     ac.i1false;
>>     >                 LLVMValueRef glc = ctx->ac.i1false;
>>     >                 LLVMValueRef slc = ctx->ac.i1false;
>>     >
>>     >                 params[0] = get_image_coords(ctx, instr);
>>     >                 params[1] = get_sampler_desc(ctx, instr->variables[0],
>>     AC_DESC_IMAGE, NULL, true, false);
>>     >                 params[2] = LLVMConstInt(ctx->ac.i32, 15, false); /*
>>     dmask */
>>     > -               if (HAVE_LLVM <= 0x0309) {
>>     > -                       params[3] = ctx->ac.i1false;  /* r128 */
>>     > -                       params[4] = da;
>>     > -                       params[5] = glc;
>>     > -                       params[6] = slc;
>>     > -               } else {
>>     > -                       LLVMValueRef lwe = ctx->ac.i1false;
>>     > -                       params[3] = glc;
>>     > -                       params[4] = slc;
>>     > -                       params[5] = lwe;
>>     > -                       params[6] = da;
>>     > -               }
>>     > +               params[3] = glc;
>>     > +               params[4] = slc;
>>     > +               params[5] = ctx->ac.i1false;
>>     > +               params[6] = da;
>>     >
>>     >                 ac_get_image_intr_name("llvm.amdgcn.image.load",
>>     >                                        ctx->ac.v4f32, /* vdata */
>>     >                                        LLVMTypeOf(params[0]), /* 
>> coords *
>>     /
>>     >                                        LLVMTypeOf(params[1]), /* rsrc 
>> */
>>     >                                        intrinsic_name, sizeof
>>     (intrinsic_name));
>>     >
>>     >                 res = ac_build_intrinsic(&ctx->ac, intrinsic_name, 
>> ctx->
>>     ac.v4f32,
>>     >                                          params, 7,
>>     AC_FUNC_ATTR_READONLY);
>>     >         }
>>     > @@ -3687,32 +3679,24 @@ static void visit_image_store(struct
>>     ac_nir_context *ctx,
>>     >                 bool is_da = glsl_sampler_type_is_array(type) ||
>>     >                              dim == GLSL_SAMPLER_DIM_CUBE ||
>>     >                              dim == GLSL_SAMPLER_DIM_3D;
>>     >                 LLVMValueRef da = is_da ? ctx->ac.i1true : ctx->
>>     ac.i1false;
>>     >                 LLVMValueRef slc = ctx->ac.i1false;
>>     >
>>     >                 params[0] = ac_to_float(&ctx->ac, get_src(ctx, 
>> instr->src
>>     [2]));
>>     >                 params[1] = get_image_coords(ctx, instr); /* coords */
>>     >                 params[2] = get_sampler_desc(ctx, instr->variables[0],
>>     AC_DESC_IMAGE, NULL, true, true);
>>     >                 params[3] = LLVMConstInt(ctx->ac.i32, 15, false); /*
>>     dmask */
>>     > -               if (HAVE_LLVM <= 0x0309) {
>>     > -                       params[4] = ctx->ac.i1false;  /* r128 */
>>     > -                       params[5] = da;
>>     > -                       params[6] = glc;
>>     > -                       params[7] = slc;
>>     > -               } else {
>>     > -                       LLVMValueRef lwe = ctx->ac.i1false;
>>     > -                       params[4] = glc;
>>     > -                       params[5] = slc;
>>     > -                       params[6] = lwe;
>>     > -                       params[7] = da;
>>     > -               }
>>     > +               params[4] = glc;
>>     > +               params[5] = slc;
>>     > +               params[6] = ctx->ac.i1false;
>>     > +               params[7] = da;
>>     >
>>     >                 ac_get_image_intr_name("llvm.amdgcn.image.store",
>>     >                                        LLVMTypeOf(params[0]), /* vdata 
>> */
>>     >                                        LLVMTypeOf(params[1]), /* 
>> coords *
>>     /
>>     >                                        LLVMTypeOf(params[2]), /* rsrc 
>> */
>>     >                                        intrinsic_name, sizeof
>>     (intrinsic_name));
>>     >
>>     >                 ac_build_intrinsic(&ctx->ac, intrinsic_name, ctx->
>>     ac.voidt,
>>     >                                    params, 8, 0);
>>     >         }
>>     > diff --git a/src/amd/vulkan/radv_device.c 
>> b/src/amd/vulkan/radv_device.c
>>     > index aea723c..9fda419 100644
>>     > --- a/src/amd/vulkan/radv_device.c
>>     > +++ b/src/amd/vulkan/radv_device.c
>>     > @@ -1106,25 +1106,21 @@ VkResult radv_CreateDevice(
>>     >         device->pbb_allowed = device->physical_device->rad_
>>     info.chip_class >= GFX9 &&
>>     >                               (device->instance->perftest_flags &
>>     RADV_PERFTEST_BINNING);
>>     >
>>     >         /* Disabled and not implemented for now. */
>>     >         device->dfsm_allowed = device->pbb_allowed && false;
>>     >
>>     >  #ifdef ANDROID
>>     >         device->always_use_syncobj = device->physical_device->rad_
>>     info.has_syncobj_wait_for_submit;
>>     >  #endif
>>     >
>>     > -#if HAVE_LLVM < 0x0400
>>     > -       device->llvm_supports_spill = false;
>>     > -#else
>>     >         device->llvm_supports_spill = true;
>>     > -#endif
>>     >
>>     >         /* The maximum number of scratch waves. Scratch space isn't
>>     divided
>>     >          * evenly between CUs. The number is only a function of the
>>     number of CUs.
>>     >          * We can decrease the constant to decrease the scratch buffer
>>     size.
>>     >          *
>>     >          * sctx->scratch_waves must be >= the maximum posible size of
>>     >          * 1 threadgroup, so that the hw doesn't hang from being unable
>>     >          * to start any.
>>     >          *
>>     >          * The recommended value is 4 per CU at most. Higher numbers
>>     don't
>>     > diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/
>>     drivers/radeonsi/si_compute.c
>>     > index ac4fab3..91d6810 100644
>>     > --- a/src/gallium/drivers/radeonsi/si_compute.c
>>     > +++ b/src/gallium/drivers/radeonsi/si_compute.c
>>     > @@ -152,22 +152,21 @@ static void *si_create_compute_state(
>>     >         struct si_context *sctx = (struct si_context *)ctx;
>>     >         struct si_screen *sscreen = (struct si_screen *)ctx->screen;
>>     >         struct si_compute *program = CALLOC_STRUCT(si_compute);
>>     >
>>     >         pipe_reference_init(&program->reference, 1);
>>     >         program->screen = (struct si_screen *)ctx->screen;
>>     >         program->ir_type = cso->ir_type;
>>     >         program->local_size = cso->req_local_mem;
>>     >         program->private_size = cso->req_private_mem;
>>     >         program->input_size = cso->req_input_mem;
>>     > -       program->use_code_object_v2 = HAVE_LLVM >= 0x0400 &&
>>     > -                                       cso->ir_type ==
>>     PIPE_SHADER_IR_NATIVE;
>>     > +       program->use_code_object_v2 = cso->ir_type ==
>>     PIPE_SHADER_IR_NATIVE;
>>     >
>>     >         if (cso->ir_type == PIPE_SHADER_IR_TGSI) {
>>     >                 program->tokens = tgsi_dup_tokens(cso->prog);
>>     >                 if (!program->tokens) {
>>     >                         FREE(program);
>>     >                         return NULL;
>>     >                 }
>>     >
>>     >                 program->compiler_ctx_state.debug = sctx->debug;
>>     >                 program->compiler_ctx_state.is_debug_context = sctx->
>>     is_debug;
>>     > diff --git a/src/gallium/drivers/radeonsi/si_get.c 
>> b/src/gallium/drivers/
>>     radeonsi/si_get.c
>>     > index 36e6018..46d5eee 100644
>>     > --- a/src/gallium/drivers/radeonsi/si_get.c
>>     > +++ b/src/gallium/drivers/radeonsi/si_get.c
>>     > @@ -182,24 +182,22 @@ static int si_get_param(struct pipe_screen
>>     *pscreen, enum pipe_cap param)
>>     >         case PIPE_CAP_MEMOBJ:
>>     >         case PIPE_CAP_LOAD_CONSTBUF:
>>     >         case PIPE_CAP_INT64:
>>     >         case PIPE_CAP_INT64_DIVMOD:
>>     >         case PIPE_CAP_TGSI_CLOCK:
>>     >         case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
>>     >         case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
>>     >         case PIPE_CAP_TGSI_ANY_REG_AS_ADDRESS:
>>     >         case PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET:
>>     >         case PIPE_CAP_TGSI_FS_FBFETCH:
>>     > -               return 1;
>>     > -
>>     >         case PIPE_CAP_TGSI_VOTE:
>>     > -               return HAVE_LLVM >= 0x0400;
>>     > +               return 1;
>>     >
>>     >         case PIPE_CAP_TGSI_BALLOT:
>>     >                 return HAVE_LLVM >= 0x0500;
>>     >
>>     >         case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
>>     >                 return !SI_BIG_ENDIAN && sscreen->info.has_userptr;
>>     >
>>     >         case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
>>     >                 return (sscreen->info.drm_major == 2 &&
>>     >                         sscreen->info.drm_minor >= 43) ||
>>     > @@ -737,28 +735,23 @@ static unsigned get_max_threads_per_block(struct
>>     si_screen *screen,
>>     >  static int si_get_compute_param(struct pipe_screen *screen,
>>     >                                 enum pipe_shader_ir ir_type,
>>     >                                 enum pipe_compute_cap param,
>>     >                                 void *ret)
>>     >  {
>>     >         struct si_screen *sscreen = (struct si_screen *)screen;
>>     >
>>     >         //TODO: select these params by asic
>>     >         switch (param) {
>>     >         case PIPE_COMPUTE_CAP_IR_TARGET: {
>>     > -               const char *gpu;
>>     > -               const char *triple;
>>     > -
>>     > -               if (HAVE_LLVM < 0x0400)
>>     > -                       triple = "amdgcn--";
>>     > -               else
>>     > -                       triple = "amdgcn-mesa-mesa3d";
>>     > +               const char *gpu, *triple;
>>     >
>>     > +               triple = "amdgcn-mesa-mesa3d";
>>     >                 gpu = ac_get_llvm_processor_name(sscreen->info.family);
>>     >                 if (ret) {
>>     >                         sprintf(ret, "%s-%s", gpu, triple);
>>     >                 }
>>     >                 /* +2 for dash and terminating NIL byte */
>>     >                 return (strlen(triple) + strlen(gpu) + 2) * 
>> sizeof(char);
>>     >         }
>>     >         case PIPE_COMPUTE_CAP_GRID_DIMENSION:
>>     >                 if (ret) {
>>     >                         uint64_t *grid_dimension = ret;
>>     > diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c b/src/
>>     gallium/drivers/radeonsi/si_shader_tgsi_mem.c
>>     > index b5fad34..ec1de40 100644
>>     > --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
>>     > +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c
>>     > @@ -289,31 +289,30 @@ static void image_append_args(
>>     >         LLVMValueRef i1true = LLVMConstInt(ctx->i1, 1, 0);
>>     >         LLVMValueRef r128 = i1false;
>>     >         LLVMValueRef da = tgsi_is_array_image(target) ? i1true : 
>> i1false;
>>     >         LLVMValueRef glc =
>>     >                 force_glc ||
>>     >                 inst->Memory.Qualifier & (TGSI_MEMORY_COHERENT |
>>     TGSI_MEMORY_VOLATILE) ?
>>     >                 i1true : i1false;
>>     >         LLVMValueRef slc = i1false;
>>     >         LLVMValueRef lwe = i1false;
>>     >
>>     > -       if (atomic || (HAVE_LLVM <= 0x0309)) {
>>     > +       if (atomic) {
>>     >                 emit_data->args[emit_data->arg_count++] = r128;
>>     >                 emit_data->args[emit_data->arg_count++] = da;
>>     >                 if (!atomic) {
>>     >                         emit_data->args[emit_data->arg_count++] = glc;
>>     >                 }
>>     >                 emit_data->args[emit_data->arg_count++] = slc;
>>     >                 return;
>>     >         }
>>     >
>>     > -       /* HAVE_LLVM >= 0x0400 */
>>     >         emit_data->args[emit_data->arg_count++] = glc;
>>     >         emit_data->args[emit_data->arg_count++] = slc;
>>     >         emit_data->args[emit_data->arg_count++] = lwe;
>>     >         emit_data->args[emit_data->arg_count++] = da;
>>     >  }
>>     >
>>     >  /**
>>     >   * Append the resource and indexing arguments for buffer intrinsics.
>>     >   *
>>     >   * \param rsrc the v4i32 buffer resource
>>     > diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c b/src/
>>     gallium/drivers/radeonsi/si_shader_tgsi_setup.c
>>     > index f70e2bd..44294f2 100644
>>     > --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
>>     > +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
>>     > @@ -1371,24 +1371,22 @@ void si_llvm_optimize_module(struct
>>     si_shader_context *ctx)
>>     >         LLVMAddAlwaysInlinerPass(gallivm->passmgr);
>>     >
>>     >         /* This pass should eliminate all the load and store 
>> instructions
>>     */
>>     >         LLVMAddPromoteMemoryToRegisterPass(gallivm->passmgr);
>>     >
>>     >         /* Add some optimization passes */
>>     >         LLVMAddScalarReplAggregatesPass(gallivm->passmgr);
>>     >         LLVMAddLICMPass(gallivm->passmgr);
>>     >         LLVMAddAggressiveDCEPass(gallivm->passmgr);
>>     >         LLVMAddCFGSimplificationPass(gallivm->passmgr);
>>     > -#if HAVE_LLVM >= 0x0400
>>     >         /* This is recommended by the instruction combining pass. */
>>     >         LLVMAddEarlyCSEMemSSAPass(gallivm->passmgr);
>>     > -#endif
>>     >         LLVMAddInstructionCombiningPass(gallivm->passmgr);
>>     >
>>     >         /* Run the pass */
>>     >         LLVMRunPassManager(gallivm->passmgr, ctx->gallivm.module);
>>     >
>>     >         LLVMDisposeBuilder(ctx->ac.builder);
>>     >         LLVMDisposePassManager(gallivm->passmgr);
>>     >         gallivm_dispose_target_library_info(target_library_info);
>>     >  }
>>     >
>>     > --
>>     > 2.7.4
>>     >
>>     > _______________________________________________
>>     > mesa-dev mailing list
>>     > mesa-dev@lists.freedesktop.org
>>     > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>
>>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to