aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-03-29 14:31:26 +0100
committergingerBill <bill@gingerbill.org>2021-03-29 14:31:26 +0100
commitc1e125a009f282d47ea9e268491b9fd245ea2eed (patch)
tree9cfe78bd76933d1e27cf4eaa8d49adca65c0c3b0 /src/llvm_backend.cpp
parent48767301a447dde41f00c2f78dc7041882980cf1 (diff)
Change alignment of alloca to a larger one if `OdinLLVMBuildTransmute` requires it
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 2ce647b84..ca2012916 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -2865,6 +2865,18 @@ LLVMValueRef OdinLLVMBuildTransmute(lbProcedure *p, LLVMValueRef val, LLVMTypeRe
}
general_end:;
+ // make the alignment big if necessary
+ if (LLVMIsALoadInst(val) && src_align < dst_align) {
+ LLVMValueRef val_ptr = LLVMGetOperand(val, 0);
+ if (LLVMGetInstructionOpcode(val_ptr) == LLVMAlloca) {
+ src_align = gb_max(LLVMGetAlignment(val_ptr), dst_align);
+ LLVMSetAlignment(val_ptr, cast(unsigned)src_align);
+ }
+ }
+
+ src_size = align_formula(src_size, src_align);
+ dst_size = align_formula(dst_size, dst_align);
+
if (LLVMIsALoadInst(val) && (src_size >= dst_size && src_align >= dst_align)) {
LLVMValueRef val_ptr = LLVMGetOperand(val, 0);
val_ptr = LLVMBuildPointerCast(p->builder, val_ptr, LLVMPointerType(dst_type, 0), "");