aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-03-29 14:07:25 +0100
committergingerBill <bill@gingerbill.org>2021-03-29 14:07:25 +0100
commit253a3edd302d2a98f211fc167ff9c30b78bf9ee2 (patch)
tree09dcce4cc16a32a2a18b53c872fe0b02a5233073 /src/llvm_backend.cpp
parent8239cd34ebd1e44456cfa2d06c63f5be7c3b1acd (diff)
Change `OdinLLVMBuildTransmute` when to deal with loads
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp13
1 files changed, 4 insertions, 9 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 672b84fb2..1a80eec0f 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -2822,6 +2822,8 @@ LLVMValueRef OdinLLVMBuildTransmute(lbProcedure *p, LLVMValueRef val, LLVMTypeRe
i64 src_size = lb_sizeof(src_type);
i64 dst_size = lb_sizeof(dst_type);
+ i64 src_align = lb_alignof(src_type);
+ i64 dst_align = lb_alignof(dst_type);
LLVMTypeKind src_kind = LLVMGetTypeKind(src_type);
LLVMTypeKind dst_kind = LLVMGetTypeKind(dst_type);
@@ -2859,19 +2861,12 @@ LLVMValueRef OdinLLVMBuildTransmute(lbProcedure *p, LLVMValueRef val, LLVMTypeRe
}
general_end:;
- if (LLVMIsALoadInst(val) && src_size <= dst_size) {
+ if (LLVMIsALoadInst(val) && src_size >= dst_size) {
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, "");
- // 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));
+ // LLVMSetAlignment(loaded_val, gb_min(src_align, dst_align));
return loaded_val;
} else {