diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index 01a45747f..1dbcae5f9 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -2371,7 +2371,12 @@ static inline void llvm_emit_deref(GenContext *c, BEValue *value, Expr *inner, T llvm_emit_expr(c, value, inner); llvm_value_rvalue(c, value); AlignSize alignment = type_abi_alignment(type); - if (safe_mode_enabled() && !expr_is_const(inner)) + bool is_const = expr_is_const(inner); + if (is_const) + { + alignment = type_min_alignment(inner->const_expr.ptr, alignment); + } + if (safe_mode_enabled() && !is_const) { LLVMValueRef check = LLVMBuildICmp(c->builder, LLVMIntEQ, value->value, llvm_get_zero(c, inner->type), "checknull"); scratch_buffer_clear(); diff --git a/test/test_suite/safe/deref_absolute.c3t b/test/test_suite/safe/deref_absolute.c3t index 7fb637894..2f4b66de4 100644 --- a/test/test_suite/safe/deref_absolute.c3t +++ b/test/test_suite/safe/deref_absolute.c3t @@ -1,6 +1,18 @@ -module main; +// #target: macos-x64 +module test; -fn void main() +fn int main() { int x = *(int*)1; -} \ No newline at end of file + return 0; +} + +/* #expect: test.ll + +define i32 @main() #0 { +entry: + %x = alloca i32, align 4 + %0 = load i32, ptr inttoptr (i64 1 to ptr), align 1 + store i32 %0, ptr %x, align 4 + ret i32 0 +}