From 253a3edd302d2a98f211fc167ff9c30b78bf9ee2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 29 Mar 2021 14:07:25 +0100 Subject: [PATCH] Change `OdinLLVMBuildTransmute` when to deal with loads --- src/llvm_backend.cpp | 13 ++++--------- 1 file 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 {