mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
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:
parent
6d54096fa6
commit
bcfb86b09d
9 changed files with 39 additions and 27 deletions
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue