On Wed, Nov 09, 2016 at 11:45:38PM +0100, Roland Scheidegger wrote:
> Am 09.11.2016 um 16:22 schrieb Tom Stellard:
> > v2:
> >   Fix adding parameter attributes with LLVM < 4.0.
> > 
> > v3:
> >   Fix typo.
> >   Fix parameter index.
> >   Add a gallivm enum for function attributes.
> > ---
> >  src/gallium/auxiliary/draw/draw_llvm.c            |  6 +-
> >  src/gallium/auxiliary/gallivm/lp_bld_intr.c       | 70 
> > ++++++++++++++++++++++-
> >  src/gallium/auxiliary/gallivm/lp_bld_intr.h       | 22 ++++++-
> >  src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c |  4 +-
> >  src/gallium/drivers/radeonsi/si_shader.c          | 69 
> > +++++++++++-----------
> >  src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c | 24 ++++----
> >  6 files changed, 143 insertions(+), 52 deletions(-)
> > 
> > diff --git a/src/gallium/auxiliary/draw/draw_llvm.c 
> > b/src/gallium/auxiliary/draw/draw_llvm.c
> > index 5b4e2a1..ba86b11 100644
> > --- a/src/gallium/auxiliary/draw/draw_llvm.c
> > +++ b/src/gallium/auxiliary/draw/draw_llvm.c
> > @@ -1568,8 +1568,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct 
> > draw_llvm_variant *variant,
> >     LLVMSetFunctionCallConv(variant_func, LLVMCCallConv);
> >     for (i = 0; i < num_arg_types; ++i)
> >        if (LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind)
> > -         LLVMAddAttribute(LLVMGetParam(variant_func, i),
> > -                          LLVMNoAliasAttribute);
> > +         lp_add_function_attr(variant_func, i + 1, LP_FUNC_ATTR_NOALIAS);
> >  
> >     context_ptr               = LLVMGetParam(variant_func, 0);
> >     io_ptr                    = LLVMGetParam(variant_func, 1);
> > @@ -2193,8 +2192,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm,
> >  
> >     for (i = 0; i < ARRAY_SIZE(arg_types); ++i)
> >        if (LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind)
> > -         LLVMAddAttribute(LLVMGetParam(variant_func, i),
> > -                          LLVMNoAliasAttribute);
> > +         lp_add_function_attr(variant_func, i + 1, LP_FUNC_ATTR_NOALIAS);
> >  
> >     context_ptr               = LLVMGetParam(variant_func, 0);
> >     input_array               = LLVMGetParam(variant_func, 1);
> > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_intr.c 
> > b/src/gallium/auxiliary/gallivm/lp_bld_intr.c
> > index f12e735..049671a 100644
> > --- a/src/gallium/auxiliary/gallivm/lp_bld_intr.c
> > +++ b/src/gallium/auxiliary/gallivm/lp_bld_intr.c
> > @@ -46,6 +46,7 @@
> >  
> >  #include "util/u_debug.h"
> >  #include "util/u_string.h"
> > +#include "util/bitscan.h"
> >  
> >  #include "lp_bld_const.h"
> >  #include "lp_bld_intr.h"
> > @@ -120,13 +121,73 @@ lp_declare_intrinsic(LLVMModuleRef module,
> >  }
> >  
> >  
> > +#if HAVE_LLVM < 0x0400
> > +static LLVMAttribute lp_attr_to_llvm_attr(enum lp_func_attr attr)
> > +{
> > +   switch (attr) {
> > +   case LP_FUNC_ATTR_ALWAYSINLINE: return LLVMAlwaysInlineAttribute;
> > +   case LP_FUNC_ATTR_BYVAL: return LLVMByValAttribute;
> > +   case LP_FUNC_ATTR_INREG: return LLVMInRegAttribute;
> > +   case LP_FUNC_ATTR_NOALIAS: return LLVMNoAliasAttribute;
> > +   case LP_FUNC_ATTR_NOUNWIND: return LLVMNoUnwindAttribute;
> > +   case LP_FUNC_ATTR_READNONE: return LLVMReadNoneAttribute;
> > +   case LP_FUNC_ATTR_READONLY: return LLVMReadOnlyAttribute;
> > +   default:
> > +      _debug_printf("Unhandled function attribute: %x\n", attr);
> > +      return 0;
> > +   }
> > +}
> > +
> > +#else
> > +
> > +static const char *attr_to_str(enum lp_func_attr attr)
> > +{
> > +   switch (attr) {
> > +   case LP_FUNC_ATTR_ALWAYSINLINE: return "alwaysinline";
> > +   case LP_FUNC_ATTR_BYVAL: return "byval";
> > +   case LP_FUNC_ATTR_INREG: return "inreg";
> > +   case LP_FUNC_ATTR_NOALIAS: return "noalias";
> > +   case LP_FUNC_ATTR_NOUNWIND: return "nounwind";
> > +   case LP_FUNC_ATTR_READNONE: return "readnone";
> > +   case LP_FUNC_ATTR_READONLY: return "readonly";
> > +   default:
> > +      _debug_printf("Unhandled function attribute: %x\n", attr);
> > +      return 0;
> > +   }
> > +}
> > +
> > +#endif
> > +
> > +void
> > +lp_add_function_attr(LLVMValueRef function,
> > +                     int attr_idx,
> > +                     enum lp_func_attr attr)
> > +{
> > +
> > +#if HAVE_LLVM < 0x0400
> > +   LLVMAttribute llvm_attr = lp_attr_to_llvm_attr(attr);
> > +   if (attr_idx == -1) {
> > +      LLVMAddFunctionAttr(function, llvm_attr);
> > +   } else {
> > +      LLVMAddAttribute(LLVMGetParam(function, attr_idx - 1), llvm_attr);
> > +   }
> > +#else
> > +   LLVMContextRef context = 
> > LLVMGetModuleContext(LLVMGetGlobalParent(function));
> > +   const char *attr_name = attr_to_str(attr);
> > +   unsigned kind_id = LLVMGetEnumAttributeKindForName(attr_name,
> > +                                                      strlen(attr_name));
> > +   LLVMAttributeRef llvm_attr = LLVMCreateEnumAttribute(context, kind_id, 
> > 0);
> > +   LLVMAddAttributeAtIndex(function, attr_idx, llvm_attr);
> > +#endif
> > +}
> > +
> >  LLVMValueRef
> >  lp_build_intrinsic(LLVMBuilderRef builder,
> >                     const char *name,
> >                     LLVMTypeRef ret_type,
> >                     LLVMValueRef *args,
> >                     unsigned num_args,
> > -                   LLVMAttribute attr)
> > +                   unsigned attr_mask)
> >  {
> >     LLVMModuleRef module = 
> > LLVMGetGlobalParent(LLVMGetBasicBlockParent(LLVMGetInsertBlock(builder)));
> >     LLVMValueRef function;
> > @@ -148,7 +209,12 @@ lp_build_intrinsic(LLVMBuilderRef builder,
> >        /* NoUnwind indicates that the intrinsic never raises a C++ 
> > exception.
> >         * Set it for all intrinsics.
> >         */
> > -      LLVMAddFunctionAttr(function, attr | LLVMNoUnwindAttribute);
> > +      attr_mask |= LP_FUNC_ATTR_NOUNWIND;
> > +
> > +      while (attr_mask) {
> > +         enum lp_func_attr attr = 1 << u_bit_scan(&attr_mask);
> > +         lp_add_function_attr(function, -1, attr);
> > +      }
> >  
> >        if (gallivm_debug & GALLIVM_DEBUG_IR) {
> >           lp_debug_dump_value(function);
> > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_intr.h 
> > b/src/gallium/auxiliary/gallivm/lp_bld_intr.h
> > index 7d80ac2..85a86c2 100644
> > --- a/src/gallium/auxiliary/gallivm/lp_bld_intr.h
> > +++ b/src/gallium/auxiliary/gallivm/lp_bld_intr.h
> > @@ -46,6 +46,16 @@
> >   */
> >  #define LP_MAX_FUNC_ARGS 32
> >  
> > +enum lp_func_attr {
> > +   LP_FUNC_ATTR_ALWAYSINLINE = (1 << 0),
> > +   LP_FUNC_ATTR_BYVAL        = (1 << 1),
> > +   LP_FUNC_ATTR_INREG        = (1 << 2),
> > +   LP_FUNC_ATTR_NOALIAS      = (1 << 3),
> > +   LP_FUNC_ATTR_NOUNWIND     = (1 << 4),
> > +   LP_FUNC_ATTR_READNONE     = (1 << 5),
> > +   LP_FUNC_ATTR_READONLY     = (1 << 6),
> > +   LP_FUNC_ATTR_LAST         = (1 << 7)
> > +};
> Not sure if there's any value in using bit flags? Or is it supposed to
> handle multiple attributes simultaneously at some point?
> Not that it would really matter much, though...
> 

I used a bitfield, so that lp_build_intrinsic could handle multiple
flags at once.  I thought it would be more convenient to be able to
do this.

-Tom

> Otherwise both patches look good (albeit I think having to get the
> attribute kind by name from llvm is rather awkward).
> 
> For the series:
> Reviewed-by: Roland Scheidegger <[email protected]>
> 
> 
> 
> 
> >  
> >  void
> >  lp_format_intrinsic(char *name,
> > @@ -60,13 +70,23 @@ lp_declare_intrinsic(LLVMModuleRef module,
> >                       LLVMTypeRef *arg_types,
> >                       unsigned num_args);
> >  
> > +void
> > +lp_remove_attr(LLVMValueRef value,
> > +               const char *attr_name,
> > +               unsigned attr_len);
> > +
> > +void
> > +lp_add_function_attr(LLVMValueRef function,
> > +                     int attr_idx,
> > +                     enum lp_func_attr attr);
> > +
> >  LLVMValueRef
> >  lp_build_intrinsic(LLVMBuilderRef builder,
> >                     const char *name,
> >                     LLVMTypeRef ret_type,
> >                     LLVMValueRef *args,
> >                     unsigned num_args,
> > -                   LLVMAttribute attr);
> > +                   unsigned attr_mask);
> >  
> >  
> >  LLVMValueRef
> > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c 
> > b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> > index 1477a72..939cd43 100644
> > --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> > +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> > @@ -60,6 +60,7 @@
> >  #include "lp_bld_struct.h"
> >  #include "lp_bld_quad.h"
> >  #include "lp_bld_pack.h"
> > +#include "lp_bld_intr.h"
> >  
> >  
> >  /**
> > @@ -3316,7 +3317,8 @@ lp_build_sample_soa_func(struct gallivm_state 
> > *gallivm,
> >  
> >        for (i = 0; i < num_param; ++i) {
> >           if(LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind) {
> > -            LLVMAddAttribute(LLVMGetParam(function, i), 
> > LLVMNoAliasAttribute);
> > +
> > +            lp_add_function_attr(function, i + 1, LP_FUNC_ATTR_NOALIAS);
> >           }
> >        }
> >  
> > diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
> > b/src/gallium/drivers/radeonsi/si_shader.c
> > index b170eb9..287b22f 100644
> > --- a/src/gallium/drivers/radeonsi/si_shader.c
> > +++ b/src/gallium/drivers/radeonsi/si_shader.c
> > @@ -407,7 +407,7 @@ static void declare_input_vs(
> >     args[2] = buffer_index;
> >     input = lp_build_intrinsic(gallivm->builder,
> >             "llvm.SI.vs.load.input", ctx->v4f32, args, 3,
> > -           LLVMReadNoneAttribute);
> > +           LP_FUNC_ATTR_READNONE);
> >  
> >     /* Break up the vec4 into individual components */
> >     for (chan = 0; chan < 4; chan++) {
> > @@ -841,7 +841,7 @@ static LLVMValueRef build_buffer_load(struct 
> > si_shader_context *ctx,
> >                      type_names[func]);
> >  
> >             return lp_build_intrinsic(gallivm->builder, name, types[func], 
> > args,
> > -                                     ARRAY_SIZE(args), 
> > LLVMReadOnlyAttribute);
> > +                                     ARRAY_SIZE(args), 
> > LP_FUNC_ATTR_READONLY);
> >     } else {
> >             LLVMValueRef args[] = {
> >                     LLVMBuildBitCast(gallivm->builder, rsrc, ctx->v16i8, 
> > ""),
> > @@ -872,7 +872,7 @@ static LLVMValueRef build_buffer_load(struct 
> > si_shader_context *ctx,
> >                      type_names[func], arg_type);
> >  
> >             return lp_build_intrinsic(gallivm->builder, name, types[func], 
> > args,
> > -                                     ARRAY_SIZE(args), 
> > LLVMReadOnlyAttribute);
> > +                                     ARRAY_SIZE(args), 
> > LP_FUNC_ATTR_READONLY);
> >     }
> >  }
> >  
> > @@ -1159,14 +1159,14 @@ static LLVMValueRef fetch_input_gs(
> >     value = lp_build_intrinsic(gallivm->builder,
> >                                "llvm.SI.buffer.load.dword.i32.i32",
> >                                ctx->i32, args, 9,
> > -                              LLVMReadOnlyAttribute);
> > +                              LP_FUNC_ATTR_READONLY);
> >     if (tgsi_type_is_64bit(type)) {
> >             LLVMValueRef value2;
> >             args[2] = lp_build_const_int32(gallivm, (param * 4 + swizzle + 
> > 1) * 256);
> >             value2 = lp_build_intrinsic(gallivm->builder,
> >                                         "llvm.SI.buffer.load.dword.i32.i32",
> >                                         ctx->i32, args, 9,
> > -                                       LLVMReadOnlyAttribute);
> > +                                       LP_FUNC_ATTR_READONLY);
> >             return si_llvm_emit_fetch_64bit(bld_base, type,
> >                                             value, value2);
> >     }
> > @@ -1279,12 +1279,12 @@ static void interp_fs_input(struct 
> > si_shader_context *ctx,
> >                     args[1] = attr_number;
> >                     front = lp_build_intrinsic(gallivm->builder, intr_name,
> >                                             ctx->f32, args, args[3] ? 4 : 3,
> > -                                           LLVMReadNoneAttribute);
> > +                                           LP_FUNC_ATTR_READNONE);
> >  
> >                     args[1] = back_attr_number;
> >                     back = lp_build_intrinsic(gallivm->builder, intr_name,
> >                                            ctx->f32, args, args[3] ? 4 : 3,
> > -                                          LLVMReadNoneAttribute);
> > +                                          LP_FUNC_ATTR_READNONE);
> >  
> >                     result[chan] = LLVMBuildSelect(gallivm->builder,
> >                                             is_face_positive,
> > @@ -1301,7 +1301,7 @@ static void interp_fs_input(struct si_shader_context 
> > *ctx,
> >             args[3] = interp_param;
> >             result[0] = lp_build_intrinsic(gallivm->builder, intr_name,
> >                                     ctx->f32, args, args[3] ? 4 : 3,
> > -                                   LLVMReadNoneAttribute);
> > +                                   LP_FUNC_ATTR_READNONE);
> >             result[1] =
> >             result[2] = lp_build_const_float(gallivm, 0.0f);
> >             result[3] = lp_build_const_float(gallivm, 1.0f);
> > @@ -1316,7 +1316,7 @@ static void interp_fs_input(struct si_shader_context 
> > *ctx,
> >                     args[3] = interp_param;
> >                     result[chan] = lp_build_intrinsic(gallivm->builder, 
> > intr_name,
> >                                             ctx->f32, args, args[3] ? 4 : 3,
> > -                                           LLVMReadNoneAttribute);
> > +                                           LP_FUNC_ATTR_READNONE);
> >             }
> >     }
> >  }
> > @@ -1404,18 +1404,18 @@ static LLVMValueRef get_thread_id(struct 
> > si_shader_context *ctx)
> >  
> >     if (HAVE_LLVM < 0x0308) {
> >             tid = lp_build_intrinsic(gallivm->builder, "llvm.SI.tid",
> > -                           ctx->i32,   NULL, 0, LLVMReadNoneAttribute);
> > +                           ctx->i32,   NULL, 0, LP_FUNC_ATTR_READNONE);
> >     } else {
> >             LLVMValueRef tid_args[2];
> >             tid_args[0] = lp_build_const_int32(gallivm, 0xffffffff);
> >             tid_args[1] = lp_build_const_int32(gallivm, 0);
> >             tid_args[1] = lp_build_intrinsic(gallivm->builder,
> >                                     "llvm.amdgcn.mbcnt.lo", ctx->i32,
> > -                                   tid_args, 2, LLVMReadNoneAttribute);
> > +                                   tid_args, 2, LP_FUNC_ATTR_READNONE);
> >  
> >             tid = lp_build_intrinsic(gallivm->builder,
> >                                     "llvm.amdgcn.mbcnt.hi", ctx->i32,
> > -                                   tid_args, 2, LLVMReadNoneAttribute);
> > +                                   tid_args, 2, LP_FUNC_ATTR_READNONE);
> >     }
> >     set_range_metadata(ctx, tid, 0, 64);
> >     return tid;
> > @@ -1432,7 +1432,7 @@ static LLVMValueRef buffer_load_const(struct 
> > si_shader_context *ctx,
> >     LLVMValueRef args[2] = {resource, offset};
> >  
> >     return lp_build_intrinsic(builder, "llvm.SI.load.const", ctx->f32, 
> > args, 2,
> > -                          LLVMReadNoneAttribute);
> > +                          LP_FUNC_ATTR_READNONE);
> >  }
> >  
> >  static LLVMValueRef load_sample_position(struct si_shader_context 
> > *radeon_bld, LLVMValueRef sample_id)
> > @@ -1670,7 +1670,7 @@ static void declare_system_value(
> >             value = lp_build_intrinsic(gallivm->builder,
> >                                        "llvm.amdgcn.ps.live",
> >                                        ctx->i1, NULL, 0,
> > -                                      LLVMReadNoneAttribute);
> > +                                      LP_FUNC_ATTR_READNONE);
> >             value = LLVMBuildNot(gallivm->builder, value, "");
> >             value = LLVMBuildSExt(gallivm->builder, value, ctx->i32, "");
> >             break;
> > @@ -1883,7 +1883,7 @@ static void si_llvm_init_export_args(struct 
> > lp_build_tgsi_context *bld_base,
> >                     packed = lp_build_intrinsic(base->gallivm->builder,
> >                                                 "llvm.SI.packf16",
> >                                                 ctx->i32, pack_args, 2,
> > -                                               LLVMReadNoneAttribute);
> > +                                               LP_FUNC_ATTR_READNONE);
> >                     args[chan + 5] =
> >                             LLVMBuildBitCast(base->gallivm->builder,
> >                                              packed, ctx->f32, "");
> > @@ -2028,7 +2028,7 @@ static LLVMValueRef 
> > si_scale_alpha_by_sample_mask(struct lp_build_tgsi_context *
> >  
> >     coverage = lp_build_intrinsic(gallivm->builder, "llvm.ctpop.i32",
> >                                ctx->i32,
> > -                              &coverage, 1, LLVMReadNoneAttribute);
> > +                              &coverage, 1, LP_FUNC_ATTR_READNONE);
> >  
> >     coverage = LLVMBuildUIToFP(gallivm->builder, coverage,
> >                                ctx->f32, "");
> > @@ -3469,7 +3469,7 @@ static void load_emit_buffer(struct si_shader_context 
> > *ctx,
> >     emit_data->output[emit_data->chan] = lp_build_intrinsic(
> >                     builder, intrinsic_name, dst_type,
> >                     emit_data->args, emit_data->arg_count,
> > -                   LLVMReadOnlyAttribute);
> > +                   LP_FUNC_ATTR_READONLY);
> >  }
> >  
> >  static LLVMValueRef get_memory_ptr(struct si_shader_context *ctx,
> > @@ -3574,7 +3574,7 @@ static void load_emit(
> >                     lp_build_intrinsic(
> >                             builder, 
> > "llvm.amdgcn.buffer.load.format.v4f32", emit_data->dst_type,
> >                             emit_data->args, emit_data->arg_count,
> > -                           LLVMReadOnlyAttribute);
> > +                           LP_FUNC_ATTR_READONLY);
> >     } else {
> >             get_image_intr_name("llvm.amdgcn.image.load",
> >                             emit_data->dst_type,            /* vdata */
> > @@ -3586,7 +3586,7 @@ static void load_emit(
> >                     lp_build_intrinsic(
> >                             builder, intrinsic_name, emit_data->dst_type,
> >                             emit_data->args, emit_data->arg_count,
> > -                           LLVMReadOnlyAttribute);
> > +                           LP_FUNC_ATTR_READONLY);
> >     }
> >  }
> >  
> > @@ -4014,7 +4014,7 @@ static void resq_emit(
> >             out = lp_build_intrinsic(
> >                     builder, "llvm.SI.getresinfo.i32", emit_data->dst_type,
> >                     emit_data->args, emit_data->arg_count,
> > -                   LLVMReadNoneAttribute);
> > +                   LP_FUNC_ATTR_READNONE);
> >  
> >             /* Divide the number of layers by 6 to get the number of cubes. 
> > */
> >             if (inst->Memory.Texture == TGSI_TEXTURE_CUBE_ARRAY) {
> > @@ -4248,7 +4248,7 @@ static void txq_emit(const struct 
> > lp_build_tgsi_action *action,
> >     emit_data->output[emit_data->chan] = lp_build_intrinsic(
> >             base->gallivm->builder, "llvm.SI.getresinfo.i32",
> >             emit_data->dst_type, emit_data->args, emit_data->arg_count,
> > -           LLVMReadNoneAttribute);
> > +           LP_FUNC_ATTR_READNONE);
> >  
> >     /* Divide the number of layers by 6 to get the number of cubes. */
> >     if (target == TGSI_TEXTURE_CUBE_ARRAY ||
> > @@ -4666,7 +4666,7 @@ static void si_lower_gather4_integer(struct 
> > si_shader_context *ctx,
> >     emit_data->output[emit_data->chan] =
> >             lp_build_intrinsic(builder, intr_name, emit_data->dst_type,
> >                                emit_data->args, emit_data->arg_count,
> > -                              LLVMReadNoneAttribute);
> > +                              LP_FUNC_ATTR_READNONE);
> >  }
> >  
> >  static void build_tex_intrinsic(const struct lp_build_tgsi_action *action,
> > @@ -4690,7 +4690,7 @@ static void build_tex_intrinsic(const struct 
> > lp_build_tgsi_action *action,
> >                     base->gallivm->builder,
> >                     "llvm.SI.vs.load.input", emit_data->dst_type,
> >                     emit_data->args, emit_data->arg_count,
> > -                   LLVMReadNoneAttribute);
> > +                   LP_FUNC_ATTR_READNONE);
> >             return;
> >     }
> >  
> > @@ -4767,7 +4767,7 @@ static void build_tex_intrinsic(const struct 
> > lp_build_tgsi_action *action,
> >     emit_data->output[emit_data->chan] = lp_build_intrinsic(
> >             base->gallivm->builder, intr_name, emit_data->dst_type,
> >             emit_data->args, emit_data->arg_count,
> > -           LLVMReadNoneAttribute);
> > +           LP_FUNC_ATTR_READNONE);
> >  }
> >  
> >  static void si_llvm_emit_txqs(
> > @@ -4865,13 +4865,13 @@ static void si_llvm_emit_ddxy(
> >             args[1] = val;
> >             tl = lp_build_intrinsic(gallivm->builder,
> >                                     "llvm.amdgcn.ds.bpermute", ctx->i32,
> > -                                   args, 2, LLVMReadNoneAttribute);
> > +                                   args, 2, LP_FUNC_ATTR_READNONE);
> >  
> >             args[0] = LLVMBuildMul(gallivm->builder, trbl_tid,
> >                                    lp_build_const_int32(gallivm, 4), "");
> >             trbl = lp_build_intrinsic(gallivm->builder,
> >                                       "llvm.amdgcn.ds.bpermute", ctx->i32,
> > -                                     args, 2, LLVMReadNoneAttribute);
> > +                                     args, 2, LP_FUNC_ATTR_READNONE);
> >     } else {
> >             LLVMValueRef store_ptr, load_ptr0, load_ptr1;
> >  
> > @@ -5054,7 +5054,7 @@ static void build_interp_intrinsic(const struct 
> > lp_build_tgsi_action *action,
> >             emit_data->output[chan] =
> >                     lp_build_intrinsic(gallivm->builder, intr_name,
> >                                        ctx->f32, args, args[3] ? 4 : 3,
> > -                                      LLVMReadNoneAttribute);
> > +                                      LP_FUNC_ATTR_READNONE);
> >     }
> >  }
> >  
> > @@ -5223,10 +5223,10 @@ static void si_create_function(struct 
> > si_shader_context *ctx,
> >              * SGPR spilling significantly.
> >              */
> >             if (LLVMGetTypeKind(LLVMTypeOf(P)) == LLVMPointerTypeKind) {
> > -                   LLVMAddAttribute(P, LLVMByValAttribute);
> > +                   lp_add_function_attr(ctx->main_fn, i + 1, 
> > LP_FUNC_ATTR_BYVAL);
> >                     lp_add_attr_dereferenceable(P, UINT64_MAX);
> >             } else
> > -                   LLVMAddAttribute(P, LLVMInRegAttribute);
> > +                   lp_add_function_attr(ctx->main_fn, i + 1, 
> > LP_FUNC_ATTR_INREG);
> >     }
> >  
> >     if (ctx->screen->b.debug_flags & DBG_UNSAFE_MATH) {
> > @@ -6177,7 +6177,7 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
> >                                              
> > lp_build_intrinsic(gallivm->builder,
> >                                                              
> > "llvm.SI.buffer.load.dword.i32.i32",
> >                                                              ctx.i32, args, 
> > 9,
> > -                                                            
> > LLVMReadOnlyAttribute),
> > +                                                            
> > LP_FUNC_ATTR_READONLY),
> >                                              ctx.f32, "");
> >             }
> >     }
> > @@ -6878,7 +6878,7 @@ static void si_build_wrapper_function(struct 
> > si_shader_context *ctx,
> >     unsigned gprs;
> >  
> >     for (unsigned i = 0; i < num_parts; ++i) {
> > -           LLVMAddFunctionAttr(parts[i], LLVMAlwaysInlineAttribute);
> > +           lp_add_function_attr(parts[i], -1, LP_FUNC_ATTR_ALWAYSINLINE);
> >             LLVMSetLinkage(parts[i], LLVMPrivateLinkage);
> >     }
> >  
> > @@ -6989,8 +6989,13 @@ static void si_build_wrapper_function(struct 
> > si_shader_context *ctx,
> >                     is_sgpr = ac_is_sgpr_param(param);
> >  
> >                     if (is_sgpr) {
> > +#if HAVE_LLVM < 0x0400
> >                             LLVMRemoveAttribute(param, LLVMByValAttribute);
> > -                           LLVMAddAttribute(param, LLVMInRegAttribute);
> > +#else
> > +                           unsigned kind_id = 
> > LLVMGetEnumAttributeKindForName("byval", 5);
> > +                           LLVMRemoveEnumAttributeAtIndex(parts[part], 
> > param_idx + 1, kind_id);
> > +#endif
> > +                           lp_add_function_attr(parts[part], param_idx + 
> > 1, LP_FUNC_ATTR_INREG);
> >                     }
> >  
> >                     assert(out_idx + param_size <= (is_sgpr ? num_out_sgpr 
> > : num_out));
> > diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c 
> > b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
> > index 18e905b..1966752 100644
> > --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
> > +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
> > @@ -399,7 +399,7 @@ static void emit_frac(const struct lp_build_tgsi_action 
> > *action,
> >  
> >     LLVMValueRef floor = lp_build_intrinsic(builder, intr, 
> > emit_data->dst_type,
> >                                             &emit_data->args[0], 1,
> > -                                           LLVMReadNoneAttribute);
> > +                                           LP_FUNC_ATTR_READNONE);
> >     emit_data->output[emit_data->chan] = LLVMBuildFSub(builder,
> >                     emit_data->args[0], floor, "");
> >  }
> > @@ -449,7 +449,7 @@ build_tgsi_intrinsic_nomem(const struct 
> > lp_build_tgsi_action *action,
> >     emit_data->output[emit_data->chan] =
> >             lp_build_intrinsic(base->gallivm->builder, action->intr_name,
> >                                emit_data->dst_type, emit_data->args,
> > -                              emit_data->arg_count, LLVMReadNoneAttribute);
> > +                              emit_data->arg_count, LP_FUNC_ATTR_READNONE);
> >  }
> >  
> >  static void emit_bfi(const struct lp_build_tgsi_action *action,
> > @@ -507,7 +507,7 @@ static void emit_bfe(const struct lp_build_tgsi_action 
> > *action,
> >  
> >     bfe_sm5 = lp_build_intrinsic(builder, action->intr_name,
> >                                  emit_data->dst_type, emit_data->args,
> > -                                emit_data->arg_count, 
> > LLVMReadNoneAttribute);
> > +                                emit_data->arg_count, 
> > LP_FUNC_ATTR_READNONE);
> >  
> >     /* Correct for GLSL semantics. */
> >     cond = LLVMBuildICmp(builder, LLVMIntUGE, emit_data->args[2],
> > @@ -539,7 +539,7 @@ static void emit_lsb(const struct lp_build_tgsi_action 
> > *action,
> >     LLVMValueRef lsb =
> >             lp_build_intrinsic(gallivm->builder, "llvm.cttz.i32",
> >                             emit_data->dst_type, args, ARRAY_SIZE(args),
> > -                           LLVMReadNoneAttribute);
> > +                           LP_FUNC_ATTR_READNONE);
> >  
> >     /* TODO: We need an intrinsic to skip this conditional. */
> >     /* Check for zero: */
> > @@ -566,7 +566,7 @@ static void emit_umsb(const struct lp_build_tgsi_action 
> > *action,
> >     LLVMValueRef msb =
> >             lp_build_intrinsic(builder, "llvm.ctlz.i32",
> >                             emit_data->dst_type, args, ARRAY_SIZE(args),
> > -                           LLVMReadNoneAttribute);
> > +                           LP_FUNC_ATTR_READNONE);
> >  
> >     /* The HW returns the last bit index from MSB, but TGSI wants
> >      * the index from LSB. Invert it by doing "31 - msb". */
> > @@ -593,7 +593,7 @@ static void emit_imsb(const struct lp_build_tgsi_action 
> > *action,
> >     LLVMValueRef msb =
> >             lp_build_intrinsic(builder, "llvm.AMDGPU.flbit.i32",
> >                             emit_data->dst_type, &arg, 1,
> > -                           LLVMReadNoneAttribute);
> > +                           LP_FUNC_ATTR_READNONE);
> >  
> >     /* The HW returns the last bit index from MSB, but TGSI wants
> >      * the index from LSB. Invert it by doing "31 - msb". */
> > @@ -917,13 +917,13 @@ static LLVMValueRef build_cube_intrinsic(struct 
> > gallivm_state *gallivm,
> >             LLVMValueRef out[4];
> >  
> >             out[0] = lp_build_intrinsic(gallivm->builder, 
> > "llvm.amdgcn.cubetc",
> > -                                       f32, in, 3, LLVMReadNoneAttribute);
> > +                                       f32, in, 3, LP_FUNC_ATTR_READNONE);
> >             out[1] = lp_build_intrinsic(gallivm->builder, 
> > "llvm.amdgcn.cubesc",
> > -                                       f32, in, 3, LLVMReadNoneAttribute);
> > +                                       f32, in, 3, LP_FUNC_ATTR_READNONE);
> >             out[2] = lp_build_intrinsic(gallivm->builder, 
> > "llvm.amdgcn.cubema",
> > -                                       f32, in, 3, LLVMReadNoneAttribute);
> > +                                       f32, in, 3, LP_FUNC_ATTR_READNONE);
> >             out[3] = lp_build_intrinsic(gallivm->builder, 
> > "llvm.amdgcn.cubeid",
> > -                                       f32, in, 3, LLVMReadNoneAttribute);
> > +                                       f32, in, 3, LP_FUNC_ATTR_READNONE);
> >  
> >             return lp_build_gather_values(gallivm, out, 4);
> >     } else {
> > @@ -937,7 +937,7 @@ static LLVMValueRef build_cube_intrinsic(struct 
> > gallivm_state *gallivm,
> >  
> >             return lp_build_intrinsic(gallivm->builder, "llvm.AMDGPU.cube",
> >                                       LLVMTypeOf(vec), &vec, 1,
> > -                                     LLVMReadNoneAttribute);
> > +                                     LP_FUNC_ATTR_READNONE);
> >     }
> >  }
> >  
> > @@ -959,7 +959,7 @@ static void si_llvm_cube_to_2d_coords(struct 
> > lp_build_tgsi_context *bld_base,
> >                                                 
> > lp_build_const_int32(gallivm, i), "");
> >  
> >     coords[2] = lp_build_intrinsic(builder, "llvm.fabs.f32",
> > -                   type, &coords[2], 1, LLVMReadNoneAttribute);
> > +                   type, &coords[2], 1, LP_FUNC_ATTR_READNONE);
> >     coords[2] = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_RCP, 
> > coords[2]);
> >  
> >     mad_args[1] = coords[2];
> > 
> 
> _______________________________________________
> mesa-dev mailing list
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to