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