aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-03-25 20:45:22 +0000
committergingerBill <bill@gingerbill.org>2021-03-25 20:45:22 +0000
commit04be6d190e7b0e57c6bfca4544acff032b4b2909 (patch)
tree6f7f2742d745da251b5d9a0a5a8e5ec1f0759e4a /src/llvm_backend.cpp
parent6668fd44cfa627eb2207a002744597e9c68b0284 (diff)
Minor fix to `OdinLLVMBuildTransmute`
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 62bee0c27..9e428a5fe 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -2856,10 +2856,21 @@ LLVMValueRef OdinLLVMBuildTransmute(lbProcedure *p, LLVMValueRef val, LLVMTypeRe
}
}
- if (LLVMIsALoadInst(val)) {
+ if (LLVMIsALoadInst(val) && src_size <= dst_size) {
LLVMValueRef val_ptr = LLVMGetOperand(val, 0);
val_ptr = LLVMBuildPointerCast(p->builder, val_ptr, LLVMPointerType(dst_type, 0), "");
- return LLVMBuildLoad(p->builder, val_ptr, "");
+ LLVMValueRef loaded_val = LLVMBuildLoad(p->builder, val_ptr, "");
+
+ // TODO(bill): Figure out why this doesn't work
+ // unsigned srca = cast(unsigned)LLVMConstIntGetZExtValue(LLVMAlignOf(src_type));
+ // unsigned dsta = cast(unsigned)LLVMConstIntGetZExtValue(LLVMAlignOf(dst_type));
+
+ unsigned srca = cast(unsigned)lb_alignof(src_type);
+ unsigned dsta = cast(unsigned)lb_alignof(dst_type);
+
+ LLVMSetAlignment(loaded_val, gb_min(srca, dsta));
+
+ return loaded_val;
} else {
GB_ASSERT(p->decl_block != p->curr_block);
LLVMPositionBuilderAtEnd(p->builder, p->decl_block->block);