diff options
| author | gingerBill <bill@gingerbill.org> | 2021-03-29 14:31:26 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-03-29 14:31:26 +0100 |
| commit | c1e125a009f282d47ea9e268491b9fd245ea2eed (patch) | |
| tree | 9cfe78bd76933d1e27cf4eaa8d49adca65c0c3b0 /src/llvm_backend.cpp | |
| parent | 48767301a447dde41f00c2f78dc7041882980cf1 (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.cpp | 12 |
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), ""); |