[Mesa-dev] [PATCH 1/2] gallivm: Use standard LLVMSetAlignment from LLVM 3.4 onwards.

Brian Paul brianp at vmware.com
Sat Apr 2 14:19:48 UTC 2016


On 04/02/2016 08:13 AM, Jose Fonseca wrote:
> Only provide a fallback for LLVM 3.3.
>
> One less dependency on LLVM C++ interface.
> ---
>   src/gallium/auxiliary/draw/draw_llvm.c             |  4 ++--
>   src/gallium/auxiliary/gallivm/lp_bld.h             | 14 ++++++++++++
>   .../auxiliary/gallivm/lp_bld_format_aos_array.c    |  2 +-
>   src/gallium/auxiliary/gallivm/lp_bld_gather.c      |  2 +-
>   src/gallium/auxiliary/gallivm/lp_bld_init.h        |  8 -------
>   src/gallium/auxiliary/gallivm/lp_bld_misc.cpp      | 26 +++++++++++++---------
>   src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c  |  2 +-
>   src/gallium/auxiliary/gallivm/lp_bld_struct.c      |  4 ++--
>   src/gallium/drivers/llvmpipe/lp_state_fs.c         |  4 ++--
>   9 files changed, 39 insertions(+), 27 deletions(-)
>
> diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c
> index b48bdcc..9c68d4f 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm.c
> +++ b/src/gallium/auxiliary/draw/draw_llvm.c
> @@ -817,7 +817,7 @@ store_aos(struct gallivm_state *gallivm,
>   #endif
>
>      /* Unaligned store due to the vertex header */
> -   lp_set_store_alignment(LLVMBuildStore(builder, value, data_ptr), sizeof(float));
> +   LLVMSetAlignment(LLVMBuildStore(builder, value, data_ptr), sizeof(float));
>   }
>
>   /**
> @@ -1069,7 +1069,7 @@ store_clip(struct gallivm_state *gallivm,
>         clip_ptr = LLVMBuildPointerCast(builder, clip_ptr, clip_ptr_type, "");
>
>         /* Unaligned store */
> -      lp_set_store_alignment(LLVMBuildStore(builder, aos[j], clip_ptr), sizeof(float));
> +      LLVMSetAlignment(LLVMBuildStore(builder, aos[j], clip_ptr), sizeof(float));
>      }
>   }
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld.h b/src/gallium/auxiliary/gallivm/lp_bld.h
> index 7ba925c..041cb0d 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld.h
> @@ -95,4 +95,18 @@ typedef void *LLVMMCJITMemoryManagerRef;
>   #define LLVMInsertBasicBlock ILLEGAL_LLVM_FUNCTION
>   #define LLVMCreateBuilder ILLEGAL_LLVM_FUNCTION
>
> +
> +/*
> + * Before LLVM 3.4 LLVMSetAlignment only supported GlobalValue, not
> + * LoadInst/StoreInst as we need.
> + */
> +#if HAVE_LLVM < 0x0304
> +#  ifdef __cplusplus
> +extern "C"
> +#  endif
> +void LLVMSetAlignmentBackport(LLVMValueRef V, unsigned Bytes);
> +#  define LLVMSetAlignment LLVMSetAlignmentBackport
> +#endif

Minor nit- I think the above would be a little more readable with more 
indentation:

#if HAVE_LLVM < 0x0304
#  ifdef __cplusplus
       extern "C"
#  endif
    void LLVMSetAlignmentBackport(LLVMValueRef V, unsigned Bytes);
#  define LLVMSetAlignment LLVMSetAlignmentBackport
#endif

No bid deal though.


> +
> +
>   #endif /* LP_BLD_H */
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c b/src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c
> index ee3ca86..8cad3a6 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c
> @@ -74,7 +74,7 @@ lp_build_fetch_rgba_aos_array(struct gallivm_state *gallivm,
>      ptr = LLVMBuildGEP(builder, base_ptr, &offset, 1, "");
>      ptr = LLVMBuildPointerCast(builder, ptr, LLVMPointerType(src_vec_type, 0), "");
>      res = LLVMBuildLoad(builder, ptr, "");
> -   lp_set_load_alignment(res, src_type.width / 8);
> +   LLVMSetAlignment(res, src_type.width / 8);
>
>      /* Truncate doubles to float */
>      if (src_type.floating && src_type.width == 64) {
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_gather.c b/src/gallium/auxiliary/gallivm/lp_bld_gather.c
> index d026020..c641c8b 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_gather.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_gather.c
> @@ -112,7 +112,7 @@ lp_build_gather_elem(struct gallivm_state *gallivm,
>       * gallium could not do anything else except 16 no matter what...
>       */
>     if (!aligned) {
> -      lp_set_load_alignment(res, 1);
> +      LLVMSetAlignment(res, 1);
>      }
>
>      assert(src_width <= dst_width);
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.h b/src/gallium/auxiliary/gallivm/lp_bld_init.h
> index ab44661..f0155b3 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_init.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.h
> @@ -77,14 +77,6 @@ func_pointer
>   gallivm_jit_function(struct gallivm_state *gallivm,
>                        LLVMValueRef func);
>
> -void
> -lp_set_load_alignment(LLVMValueRef Inst,
> -                       unsigned Align);
> -
> -void
> -lp_set_store_alignment(LLVMValueRef Inst,
> -		       unsigned Align);
> -
>   #ifdef __cplusplus
>   }
>   #endif
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
> index 30ef37c..61a50fa 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
> @@ -187,22 +187,28 @@ lp_build_load_volatile(LLVMBuilderRef B, LLVMValueRef PointerVal,
>   }
>
>
> -extern "C"
> -void
> -lp_set_load_alignment(LLVMValueRef Inst,
> -                       unsigned Align)
> -{
> -   llvm::unwrap<llvm::LoadInst>(Inst)->setAlignment(Align);
> -}
> +#if HAVE_LLVM < 0x0304
>
>   extern "C"
>   void
> -lp_set_store_alignment(LLVMValueRef Inst,
> -                       unsigned Align)
> +LLVMSetAlignmentBackport(LLVMValueRef V,
> +                         unsigned Bytes)

Could this function just be named LLVMSetAlignment() and then drop the 
macro?


>   {
> -   llvm::unwrap<llvm::StoreInst>(Inst)->setAlignment(Align);
> +   switch (LLVMGetInstructionOpcode(V)) {
> +   case LLVMLoad:
> +      llvm::unwrap<llvm::LoadInst>(V)->setAlignment(Bytes);
> +      break;
> +   case LLVMStore:
> +      llvm::unwrap<llvm::StoreInst>(V)->setAlignment(Bytes);
> +      break;
> +   default:
> +      assert(0);
> +      break;
> +   }
>   }
>
> +#endif
> +
>
>   #if HAVE_LLVM < 0x0306
>   typedef llvm::JITMemoryManager BaseMemoryManager;
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> index e21933f..937948b 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> @@ -1939,7 +1939,7 @@ lp_build_clamp_border_color(struct lp_build_sample_context *bld,
>                                          LLVMPointerType(vec4_bld.vec_type, 0), "");
>      border_color = LLVMBuildLoad(builder, border_color_ptr, "");
>      /* we don't have aligned type in the dynamic state unfortunately */
> -   lp_set_load_alignment(border_color, 4);
> +   LLVMSetAlignment(border_color, 4);
>
>      /*
>       * Instead of having some incredibly complex logic which will try to figure out
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_struct.c b/src/gallium/auxiliary/gallivm/lp_bld_struct.c
> index cc248d1..0df4416 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_struct.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_struct.c
> @@ -157,7 +157,7 @@ lp_build_pointer_get_unaligned(LLVMBuilderRef builder,
>      assert(LLVMGetTypeKind(LLVMTypeOf(ptr)) == LLVMPointerTypeKind);
>      element_ptr = LLVMBuildGEP(builder, ptr, &index, 1, "");
>      res = LLVMBuildLoad(builder, element_ptr, "");
> -   lp_set_load_alignment(res, alignment);
> +   LLVMSetAlignment(res, alignment);
>   #ifdef DEBUG
>      lp_build_name(res, "%s[%s]", LLVMGetValueName(ptr), LLVMGetValueName(index));
>   #endif
> @@ -188,5 +188,5 @@ lp_build_pointer_set_unaligned(LLVMBuilderRef builder,
>      LLVMValueRef instr;
>      element_ptr = LLVMBuildGEP(builder, ptr, &index, 1, "");
>      instr = LLVMBuildStore(builder, value, element_ptr);
> -   lp_set_store_alignment(instr, alignment);
> +   LLVMSetAlignment(instr, alignment);
>   }
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> index 83ff976..ca0533b 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> @@ -786,7 +786,7 @@ load_unswizzled_block(struct gallivm_state *gallivm,
>
>         dst[i] = LLVMBuildLoad(builder, dst_ptr, "");
>
> -      lp_set_load_alignment(dst[i], dst_alignment);
> +      LLVMSetAlignment(dst[i], dst_alignment);
>      }
>   }
>
> @@ -830,7 +830,7 @@ store_unswizzled_block(struct gallivm_state *gallivm,
>
>         src_ptr = LLVMBuildStore(builder, src[i], src_ptr);
>
> -      lp_set_store_alignment(src_ptr, src_alignment);
> +      LLVMSetAlignment(src_ptr, src_alignment);
>      }
>   }
>
>

In any case, for the series, Reviewed-by: Brian Paul <brianp at vmware.com>



More information about the mesa-dev mailing list