On Thu, 2016-11-10 at 13:05 +1000, Dave Airlie wrote:
> From: Dave Airlie <airl...@redhat.com>
> 
> Ported from corresponding changes to gallivm.
> 
> Signed-off-by: Dave Airlie <airl...@redhat.com>
> ---
>  src/amd/common/ac_nir_to_llvm.c | 144 
> ++++++++++++++++++++++++++++++----------
>  1 file changed, 108 insertions(+), 36 deletions(-)
> 
> diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
> index 1829465..5468483 100644
> --- a/src/amd/common/ac_nir_to_llvm.c
> +++ b/src/amd/common/ac_nir_to_llvm.c
> @@ -139,10 +139,81 @@ struct ac_tex_info {
>       bool has_offset;
>  };
>  
> +enum ac_func_attr {
> +     AC_FUNC_ATTR_ALWAYSINLINE = (1 << 0),
> +     AC_FUNC_ATTR_BYVAL        = (1 << 1),
> +     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_LAST         = (1 << 7)
> +};
> +
> +#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_BYVAL: return LLVMByValAttribute;
> +   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_BYVAL: return "byval";
> +   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";
> +   default:
> +        fprintf(stderr, "Unhandled function attribute: %x\n", attr);
> +        return 0;
> +   }
> +}
> +
> +#endif
> +
> +static void
> +ac_add_function_attr(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
> +   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
> +}
> +
>  static LLVMValueRef
>  emit_llvm_intrinsic(struct nir_to_llvm_context *ctx, const char *name,
>                      LLVMTypeRef return_type, LLVMValueRef *params,
> -                    unsigned param_count, LLVMAttribute attribs);
> +                    unsigned param_count, unsigned attr_mask);
>  static LLVMValueRef get_sampler_desc(struct nir_to_llvm_context *ctx,
>                                    nir_deref_var *deref,
>                                    enum desc_type desc_type);
> @@ -228,11 +299,12 @@ create_llvm_function(LLVMContextRef ctx, LLVMModuleRef 
> module,
>               LLVMValueRef P = LLVMGetParam(main_function, i);
>  
>               if (i < array_params) {
> -                     LLVMAddAttribute(P, LLVMByValAttribute);
> +                     ac_add_function_attr(P, i + 1, AC_FUNC_ATTR_BYVAL);
These two look wrong, ac_add_function_attr takes function ref as first
argument, but it gets param ref here.
I think it should be:

ac_add_function_attr(main_function, i + 1, AC_FUNC_ATTR_BYVAL);

and you can drop "P".

>                       ac_add_attr_dereferenceable(P, UINT64_MAX);
>               }
> -             else
> -                     LLVMAddAttribute(P, LLVMInRegAttribute);
> +             else {
> +                     ac_add_function_attr(P, i + 1, AC_FUNC_ATTR_INREG);

same as above.


Jan

> +             }
>       }
>  
>       if (unsafe_math) {
> @@ -708,7 +780,7 @@ static LLVMValueRef emit_intrin_1f_param(struct 
> nir_to_llvm_context *ctx,
>       LLVMValueRef params[] = {
>               to_float(ctx, src0),
>       };
> -     return emit_llvm_intrinsic(ctx, intrin, ctx->f32, params, 1, 
> LLVMReadNoneAttribute);
> +     return emit_llvm_intrinsic(ctx, intrin, ctx->f32, params, 1, 
> AC_FUNC_ATTR_READNONE);
>  }
>  
>  static LLVMValueRef emit_intrin_2f_param(struct nir_to_llvm_context *ctx,
> @@ -719,7 +791,7 @@ static LLVMValueRef emit_intrin_2f_param(struct 
> nir_to_llvm_context *ctx,
>               to_float(ctx, src0),
>               to_float(ctx, src1),
>       };
> -     return emit_llvm_intrinsic(ctx, intrin, ctx->f32, params, 2, 
> LLVMReadNoneAttribute);
> +     return emit_llvm_intrinsic(ctx, intrin, ctx->f32, params, 2, 
> AC_FUNC_ATTR_READNONE);
>  }
>  
>  static LLVMValueRef emit_intrin_3f_param(struct nir_to_llvm_context *ctx,
> @@ -731,7 +803,7 @@ static LLVMValueRef emit_intrin_3f_param(struct 
> nir_to_llvm_context *ctx,
>               to_float(ctx, src1),
>               to_float(ctx, src2),
>       };
> -     return emit_llvm_intrinsic(ctx, intrin, ctx->f32, params, 3, 
> LLVMReadNoneAttribute);
> +     return emit_llvm_intrinsic(ctx, intrin, ctx->f32, params, 3, 
> AC_FUNC_ATTR_READNONE);
>  }
>  
>  static LLVMValueRef emit_bcsel(struct nir_to_llvm_context *ctx,
> @@ -757,7 +829,7 @@ static LLVMValueRef emit_find_lsb(struct 
> nir_to_llvm_context *ctx,
>                */
>               LLVMConstInt(ctx->i32, 1, false),
>       };
> -     return emit_llvm_intrinsic(ctx, "llvm.cttz.i32", ctx->i32, params, 2, 
> LLVMReadNoneAttribute);
> +     return emit_llvm_intrinsic(ctx, "llvm.cttz.i32", ctx->i32, params, 2, 
> AC_FUNC_ATTR_READNONE);
>  }
>  
>  static LLVMValueRef emit_ifind_msb(struct nir_to_llvm_context *ctx,
> @@ -765,7 +837,7 @@ static LLVMValueRef emit_ifind_msb(struct 
> nir_to_llvm_context *ctx,
>  {
>       LLVMValueRef msb = emit_llvm_intrinsic(ctx, "llvm.AMDGPU.flbit.i32",
>                                              ctx->i32, &src0, 1,
> -                                            LLVMReadNoneAttribute);
> +                                            AC_FUNC_ATTR_READNONE);
>  
>       /* The HW returns the last bit index from MSB, but NIR wants
>        * the index from LSB. Invert it by doing "31 - msb". */
> @@ -791,7 +863,7 @@ static LLVMValueRef emit_ufind_msb(struct 
> nir_to_llvm_context *ctx,
>       };
>       LLVMValueRef msb = emit_llvm_intrinsic(ctx, "llvm.ctlz.i32",
>                                              ctx->i32, args, ARRAY_SIZE(args),
> -                                            LLVMReadNoneAttribute);
> +                                            AC_FUNC_ATTR_READNONE);
>  
>       /* The HW returns the last bit index from MSB, but NIR wants
>        * the index from LSB. Invert it by doing "31 - msb". */
> @@ -855,7 +927,7 @@ static LLVMValueRef emit_ffract(struct 
> nir_to_llvm_context *ctx,
>       };
>       LLVMValueRef floor = emit_llvm_intrinsic(ctx, intr,
>                                                ctx->f32, params, 1,
> -                                              LLVMReadNoneAttribute);
> +                                              AC_FUNC_ATTR_READNONE);
>       return LLVMBuildFSub(ctx->builder, fsrc0, floor, "");
>  }
>  
> @@ -871,7 +943,7 @@ static LLVMValueRef emit_uint_carry(struct 
> nir_to_llvm_context *ctx,
>                                          2, true);
>  
>       res = emit_llvm_intrinsic(ctx, intrin, ret_type,
> -                               params, 2, LLVMReadNoneAttribute);
> +                               params, 2, AC_FUNC_ATTR_READNONE);
>  
>       res = LLVMBuildExtractValue(ctx->builder, res, 1, "");
>       res = LLVMBuildZExt(ctx->builder, res, ctx->i32, "");
> @@ -916,7 +988,7 @@ static LLVMValueRef emit_bitfield_extract(struct 
> nir_to_llvm_context *ctx,
>  {
>       LLVMValueRef result;
>       LLVMValueRef icond = LLVMBuildICmp(ctx->builder, LLVMIntEQ, srcs[2], 
> LLVMConstInt(ctx->i32, 32, false), "");
> -     result = emit_llvm_intrinsic(ctx, intrin, ctx->i32, srcs, 3, 
> LLVMReadNoneAttribute);
> +     result = emit_llvm_intrinsic(ctx, intrin, ctx->i32, srcs, 3, 
> AC_FUNC_ATTR_READNONE);
>  
>       result = LLVMBuildSelect(ctx->builder, icond, srcs[0], result, "");
>       return result;
> @@ -1023,11 +1095,11 @@ static LLVMValueRef get_thread_id(struct 
> nir_to_llvm_context *ctx)
>       tid_args[1] = ctx->i32zero;
>       tid_args[1] = emit_llvm_intrinsic(ctx,
>                                         "llvm.amdgcn.mbcnt.lo", ctx->i32,
> -                                       tid_args, 2, LLVMReadNoneAttribute);
> +                                       tid_args, 2, AC_FUNC_ATTR_READNONE);
>  
>       tid = emit_llvm_intrinsic(ctx,
>                                 "llvm.amdgcn.mbcnt.hi", ctx->i32,
> -                               tid_args, 2, LLVMReadNoneAttribute);
> +                               tid_args, 2, AC_FUNC_ATTR_READNONE);
>       set_range_metadata(ctx, tid, 0, 64);
>       return tid;
>  }
> @@ -1115,13 +1187,13 @@ static LLVMValueRef emit_ddxy(struct 
> nir_to_llvm_context *ctx,
>               args[1] = src0;
>               tl = emit_llvm_intrinsic(ctx, "llvm.amdgcn.ds.bpermute",
>                                        ctx->i32, args, 2,
> -                                      LLVMReadNoneAttribute);
> +                                      AC_FUNC_ATTR_READNONE);
>  
>               args[0] = LLVMBuildMul(ctx->builder, trbl_tid,
>                                      LLVMConstInt(ctx->i32, 4, false), "");
>               trbl = emit_llvm_intrinsic(ctx, "llvm.amdgcn.ds.bpermute",
>                                          ctx->i32, args, 2,
> -                                        LLVMReadNoneAttribute);
> +                                        AC_FUNC_ATTR_READNONE);
>       } else {
>               LLVMBuildStore(ctx->builder, src0, store_ptr);
>  
> @@ -1451,10 +1523,10 @@ static void visit_alu(struct nir_to_llvm_context 
> *ctx, nir_alu_instr *instr)
>               result = emit_bitfield_insert(ctx, src[0], src[1], src[2], 
> src[3]);
>               break;
>       case nir_op_bitfield_reverse:
> -             result = emit_llvm_intrinsic(ctx, "llvm.bitreverse.i32", 
> ctx->i32, src, 1, LLVMReadNoneAttribute);
> +             result = emit_llvm_intrinsic(ctx, "llvm.bitreverse.i32", 
> ctx->i32, src, 1, AC_FUNC_ATTR_READNONE);
>               break;
>       case nir_op_bit_count:
> -             result = emit_llvm_intrinsic(ctx, "llvm.ctpop.i32", ctx->i32, 
> src, 1, LLVMReadNoneAttribute);
> +             result = emit_llvm_intrinsic(ctx, "llvm.ctpop.i32", ctx->i32, 
> src, 1, AC_FUNC_ATTR_READNONE);
>               break;
>       case nir_op_vec2:
>       case nir_op_vec3:
> @@ -1582,7 +1654,7 @@ static LLVMValueRef cast_ptr(struct nir_to_llvm_context 
> *ctx, LLVMValueRef ptr,
>  static LLVMValueRef
>  emit_llvm_intrinsic(struct nir_to_llvm_context *ctx, const char *name,
>                      LLVMTypeRef return_type, LLVMValueRef *params,
> -                    unsigned param_count, LLVMAttribute attribs)
> +                    unsigned param_count, unsigned attrib_mask)
>  {
>       LLVMValueRef function;
>  
> @@ -1604,7 +1676,7 @@ emit_llvm_intrinsic(struct nir_to_llvm_context *ctx, 
> const char *name,
>               LLVMSetFunctionCallConv(function, LLVMCCallConv);
>               LLVMSetLinkage(function, LLVMExternalLinkage);
>  
> -             LLVMAddFunctionAttr(function, attribs | LLVMNoUnwindAttribute);
> +             ac_add_function_attr(function, 0, attrib_mask | 
> AC_FUNC_ATTR_NOUNWIND);
>       }
>       return LLVMBuildCall(ctx->builder, function, params, param_count, "");
>  }
> @@ -1680,7 +1752,7 @@ static LLVMValueRef radv_lower_gather4_integer(struct 
> nir_to_llvm_context *ctx,
>               txq_args[txq_arg_count++] = LLVMConstInt(ctx->i32, 0, 0); /* 
> lwe */
>               size = emit_llvm_intrinsic(ctx, "llvm.SI.getresinfo.i32", 
> ctx->v4i32,
>                                          txq_args, txq_arg_count,
> -                                        LLVMReadNoneAttribute);
> +                                        AC_FUNC_ATTR_READNONE);
>  
>               for (c = 0; c < 2; c++) {
>                       half_texel[c] = LLVMBuildExtractElement(ctx->builder, 
> size,
> @@ -1704,7 +1776,7 @@ static LLVMValueRef radv_lower_gather4_integer(struct 
> nir_to_llvm_context *ctx,
>  
>       tinfo->args[0] = coord;
>       return emit_llvm_intrinsic(ctx, intr_name, tinfo->dst_type, 
> tinfo->args, tinfo->arg_count,
> -                                LLVMReadNoneAttribute | 
> LLVMNoUnwindAttribute);
> +                                AC_FUNC_ATTR_READNONE | 
> AC_FUNC_ATTR_NOUNWIND);
>  
>  }
>  
> @@ -1772,7 +1844,7 @@ static LLVMValueRef build_tex_intrinsic(struct 
> nir_to_llvm_context *ctx,
>               }
>       }
>       return emit_llvm_intrinsic(ctx, intr_name, tinfo->dst_type, 
> tinfo->args, tinfo->arg_count,
> -                                LLVMReadNoneAttribute | 
> LLVMNoUnwindAttribute);
> +                                AC_FUNC_ATTR_READNONE | 
> AC_FUNC_ATTR_NOUNWIND);
>  
>  }
>  
> @@ -2416,7 +2488,7 @@ static LLVMValueRef visit_image_load(struct 
> nir_to_llvm_context *ctx,
>                                   intrinsic_name, sizeof(intrinsic_name));
>  
>               res = emit_llvm_intrinsic(ctx, intrinsic_name, ctx->v4f32,
> -                                     params, 7, LLVMReadOnlyAttribute);
> +                                       params, 7, AC_FUNC_ATTR_READONLY);
>       }
>       return to_integer(ctx, res);
>  }
> @@ -2581,7 +2653,7 @@ static LLVMValueRef visit_image_size(struct 
> nir_to_llvm_context *ctx,
>       params[9] = ctx->i32zero;
>  
>       res = emit_llvm_intrinsic(ctx, "llvm.SI.getresinfo.i32", ctx->v4i32,
> -                               params, 10, LLVMReadNoneAttribute);
> +                               params, 10, AC_FUNC_ATTR_READNONE);
>  
>       if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_CUBE &&
>           glsl_sampler_type_is_array(type)) {
> @@ -2832,7 +2904,7 @@ static LLVMValueRef visit_interp(struct 
> nir_to_llvm_context *ctx,
>               args[3] = interp_param;
>               result[chan] = emit_llvm_intrinsic(ctx, intr_name,
>                                                  ctx->f32, args, args[3] ? 4 
> : 3,
> -                                                LLVMReadNoneAttribute);
> +                                                AC_FUNC_ATTR_READNONE);
>       }
>       return build_gather_values(ctx, result, 2);
>  }
> @@ -3130,13 +3202,13 @@ static LLVMValueRef build_cube_intrinsic(struct 
> nir_to_llvm_context *ctx,
>               LLVMValueRef out[4];
>  
>               out[0] = emit_llvm_intrinsic(ctx, "llvm.amdgcn.cubetc",
> -                                          f32, in, 3, LLVMReadNoneAttribute);
> +                                          f32, in, 3, AC_FUNC_ATTR_READNONE);
>               out[1] = emit_llvm_intrinsic(ctx, "llvm.amdgcn.cubesc",
> -                                          f32, in, 3, LLVMReadNoneAttribute);
> +                                          f32, in, 3, AC_FUNC_ATTR_READNONE);
>               out[2] = emit_llvm_intrinsic(ctx, "llvm.amdgcn.cubema",
> -                                          f32, in, 3, LLVMReadNoneAttribute);
> +                                          f32, in, 3, AC_FUNC_ATTR_READNONE);
>               out[3] = emit_llvm_intrinsic(ctx, "llvm.amdgcn.cubeid",
> -                                          f32, in, 3, LLVMReadNoneAttribute);
> +                                          f32, in, 3, AC_FUNC_ATTR_READNONE);
>  
>               return build_gather_values(ctx, out, 4);
>       } else {
> @@ -3147,7 +3219,7 @@ static LLVMValueRef build_cube_intrinsic(struct 
> nir_to_llvm_context *ctx,
>               c[3] = LLVMGetUndef(LLVMTypeOf(in[0]));
>               cube_vec = build_gather_values(ctx, c, 4);
>               v = emit_llvm_intrinsic(ctx, "llvm.AMDGPU.cube", 
> LLVMTypeOf(cube_vec),
> -                                     &cube_vec, 1, LLVMReadNoneAttribute);
> +                                     &cube_vec, 1, AC_FUNC_ATTR_READNONE);
>       }
>       return v;
>  }
> @@ -3167,7 +3239,7 @@ static void cube_to_2d_coords(struct 
> nir_to_llvm_context *ctx,
>                                                   LLVMConstInt(ctx->i32, i, 
> false), "");
>  
>       coords[2] = emit_llvm_intrinsic(ctx, "llvm.fabs.f32", ctx->f32,
> -                                     &coords[2], 1, LLVMReadNoneAttribute);
> +                                     &coords[2], 1, AC_FUNC_ATTR_READNONE);
>       coords[2] = emit_fdiv(ctx, ctx->f32one, coords[2]);
>  
>       mad_args[1] = coords[2];
> @@ -3772,7 +3844,7 @@ handle_vs_input_decl(struct nir_to_llvm_context *ctx,
>               args[2] = buffer_index;
>               input = emit_llvm_intrinsic(ctx,
>                       "llvm.SI.vs.load.input", ctx->v4f32, args, 3,
> -                     LLVMReadNoneAttribute | LLVMNoUnwindAttribute);
> +                     AC_FUNC_ATTR_READNONE | AC_FUNC_ATTR_NOUNWIND);
>  
>               for (unsigned chan = 0; chan < 4; chan++) {
>                       LLVMValueRef llvm_chan = LLVMConstInt(ctx->i32, chan, 
> false);
> @@ -3818,7 +3890,7 @@ static void interp_fs_input(struct nir_to_llvm_context 
> *ctx,
>               args[3] = interp_param;
>               result[chan] = emit_llvm_intrinsic(ctx, intr_name,
>                                                  ctx->f32, args, args[3] ? 4 
> : 3,
> -                                               LLVMReadNoneAttribute | 
> LLVMNoUnwindAttribute);
> +                                               AC_FUNC_ATTR_READNONE | 
> AC_FUNC_ATTR_NOUNWIND);
>       }
>  }
>  
> @@ -4077,7 +4149,7 @@ si_llvm_init_export_args(struct nir_to_llvm_context 
> *ctx,
>  
>                               packed = emit_llvm_intrinsic(ctx, 
> "llvm.SI.packf16",
>                                                            ctx->i32, 
> pack_args, 2,
> -                                                          
> LLVMReadNoneAttribute);
> +                                                          
> AC_FUNC_ATTR_READNONE);
>                               args[chan + 5] = packed;
>                       }
>                       break;

-- 
Jan Vesely <jan.ves...@rutgers.edu>

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to