aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-03-29 14:11:02 +0100
committergingerBill <bill@gingerbill.org>2021-03-29 14:11:02 +0100
commit48767301a447dde41f00c2f78dc7041882980cf1 (patch)
tree2c7c42a12c5b88e7d4d69ce23b03618e03e3f215 /src/llvm_backend.cpp
parent253a3edd302d2a98f211fc167ff9c30b78bf9ee2 (diff)
Another minor change to `OdinLLVMBuildTransmute` regarding minimum source alignment
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 1a80eec0f..2ce647b84 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -2824,6 +2824,10 @@ LLVMValueRef OdinLLVMBuildTransmute(lbProcedure *p, LLVMValueRef val, LLVMTypeRe
i64 dst_size = lb_sizeof(dst_type);
i64 src_align = lb_alignof(src_type);
i64 dst_align = lb_alignof(dst_type);
+ if (LLVMIsALoadInst(val)) {
+ src_align = gb_min(src_align, LLVMGetAlignment(val));
+ }
+
LLVMTypeKind src_kind = LLVMGetTypeKind(src_type);
LLVMTypeKind dst_kind = LLVMGetTypeKind(dst_type);
@@ -2861,7 +2865,7 @@ LLVMValueRef OdinLLVMBuildTransmute(lbProcedure *p, LLVMValueRef val, LLVMTypeRe
}
general_end:;
- if (LLVMIsALoadInst(val) && src_size >= dst_size) {
+ 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), "");
LLVMValueRef loaded_val = LLVMBuildLoad(p->builder, val_ptr, "");