aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-06-08 14:27:36 +0100
committergingerBill <bill@gingerbill.org>2021-06-08 14:27:36 +0100
commit76bb82a7260158cb1ecd5d2da1b775fbdb1f0b7d (patch)
tree1f54c85463c76be4fc3a04c69191ac615c040402
parent8e62f9c83c4834c795e0a074084974b6e4b342be (diff)
Minor alignment cleanup for swizzle load
-rw-r--r--src/llvm_backend.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 875a8a60a..57af0c83f 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -797,9 +797,18 @@ lbValue lb_addr_load(lbProcedure *p, lbAddr const &addr) {
Type *array_type = base_type(addr.swizzle.type);
GB_ASSERT(array_type->kind == Type_Array);
+ unsigned res_align = cast(unsigned)type_align_of(addr.swizzle.type);
+
static u8 const ordered_indices[4] = {0, 1, 2, 3};
if (gb_memcompare(ordered_indices, addr.swizzle.indices, addr.swizzle.count) == 0) {
- if (LLVMGetAlignment(addr.addr.value) >= type_align_of(addr.swizzle.type)) {
+ LLVMValueRef addr_ptr = addr.addr.value;
+ if (LLVMGetAlignment(addr.addr.value) < res_align) {
+ if (LLVMIsAAllocaInst(addr_ptr) || LLVMIsAGlobalValue(addr_ptr)) {
+ LLVMSetAlignment(addr_ptr, res_align);
+ }
+ }
+
+ if (LLVMGetAlignment(addr.addr.value) >= res_align) {
Type *pt = alloc_type_pointer(addr.swizzle.type);
lbValue res = {};
res.value = LLVMBuildPointerCast(p->builder, addr.addr.value, lb_type(p->module, pt), "");