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 > >
signature.asc
Description: signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev