gallivm: Use standard LLVMSetAlignment from LLVM 3.4 onwards.

Only provide a fallback for LLVM 3.3.

One less dependency on LLVM C++ interface.

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
This commit is contained in:
Jose Fonseca 2016-04-02 14:31:16 +01:00
parent 6d54096fa6
commit bcfb86b09d
9 changed files with 39 additions and 27 deletions

View file

@ -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));
}
}

View file

@ -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
#endif /* LP_BLD_H */

View file

@ -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) {

View file

@ -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);

View file

@ -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

View file

@ -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)
{
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;

View file

@ -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

View file

@ -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);
}

View file

@ -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);
}
}