authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-01 00:29:16-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-01 00:29:16-05:00
logb5df18c8fd725a2993c520ddc8777ecad71e3d11
tree7036027c6652261cfeafce4819c809f1808e58dc
parent951dc451d6d49fca499e9a722a3f543d6e8bf7c1
signaturelock-open Commit is signed but in an unrecognized format.

inline ConstGlobalRefs into ZigValue

Having ConstGlobalRefs be a pointer in ZigValue was a hack that caused plenty of bugs. It was used to work around difficulties in type coercing array values into slices. However, after #3787 is merged, array values no longer type coerce into slices, and so this provided an opportunity to clean up the code. This has the nice effect of reducing stage1 peak RAM usage during the std lib tests from 3.443 GiB to 3.405 GiB (saving 39 MiB). There is one behavior test failing in this branch, which I plan to debug after merging #3787.

6 files changed, 103 insertions(+), 164 deletions(-)

src/all_types.hpp+3-7
...@@ -313,12 +313,6 @@ struct RuntimeHintSlice {...@@ -313,12 +313,6 @@ struct RuntimeHintSlice {
313 uint64_t len;313 uint64_t len;
314};314};
315315
316struct ConstGlobalRefs {
317 LLVMValueRef llvm_value;
318 LLVMValueRef llvm_global;
319 uint32_t align;
320};
321
322enum LazyValueId {316enum LazyValueId {
323 LazyValueIdInvalid,317 LazyValueIdInvalid,
324 LazyValueIdAlignOf,318 LazyValueIdAlignOf,
...@@ -409,8 +403,10 @@ struct LazyValueErrUnionType {...@@ -409,8 +403,10 @@ struct LazyValueErrUnionType {
409struct ZigValue {403struct ZigValue {
410 ZigType *type;404 ZigType *type;
411 ConstValSpecial special;405 ConstValSpecial special;
406 uint32_t llvm_align;
412 ConstParent parent;407 ConstParent parent;
413 ConstGlobalRefs *global_refs;408 LLVMValueRef llvm_value;
409 LLVMValueRef llvm_global;
414410
415 union {411 union {
416 // populated if special == ConstValSpecialStatic412 // populated if special == ConstValSpecialStatic
src/analyze.cpp+6-23
...@@ -5908,12 +5908,7 @@ ZigValue *create_const_arg_tuple(CodeGen *g, size_t arg_index_start, size_t arg_...@@ -5908,12 +5908,7 @@ ZigValue *create_const_arg_tuple(CodeGen *g, size_t arg_index_start, size_t arg_
59085908
59095909
5910ZigValue *create_const_vals(size_t count) {5910ZigValue *create_const_vals(size_t count) {
5911 ConstGlobalRefs *global_refs = allocate<ConstGlobalRefs>(count, "ConstGlobalRefs");5911 return allocate<ZigValue>(count, "ZigValue");
5912 ZigValue *vals = allocate<ZigValue>(count, "ZigValue");
5913 for (size_t i = 0; i < count; i += 1) {
5914 vals[i].global_refs = &global_refs[i];
5915 }
5916 return vals;
5917}5912}
59185913
5919ZigValue **alloc_const_vals_ptrs(size_t count) {5914ZigValue **alloc_const_vals_ptrs(size_t count) {
...@@ -6480,20 +6475,14 @@ bool const_values_equal_ptr(ZigValue *a, ZigValue *b) {...@@ -6480,20 +6475,14 @@ bool const_values_equal_ptr(ZigValue *a, ZigValue *b) {
6480 return false;6475 return false;
6481 return true;6476 return true;
6482 case ConstPtrSpecialBaseArray:6477 case ConstPtrSpecialBaseArray:
6483 if (a->data.x_ptr.data.base_array.array_val != b->data.x_ptr.data.base_array.array_val &&6478 if (a->data.x_ptr.data.base_array.array_val != b->data.x_ptr.data.base_array.array_val) {
6484 a->data.x_ptr.data.base_array.array_val->global_refs !=
6485 b->data.x_ptr.data.base_array.array_val->global_refs)
6486 {
6487 return false;6479 return false;
6488 }6480 }
6489 if (a->data.x_ptr.data.base_array.elem_index != b->data.x_ptr.data.base_array.elem_index)6481 if (a->data.x_ptr.data.base_array.elem_index != b->data.x_ptr.data.base_array.elem_index)
6490 return false;6482 return false;
6491 return true;6483 return true;
6492 case ConstPtrSpecialBaseStruct:6484 case ConstPtrSpecialBaseStruct:
6493 if (a->data.x_ptr.data.base_struct.struct_val != b->data.x_ptr.data.base_struct.struct_val &&6485 if (a->data.x_ptr.data.base_struct.struct_val != b->data.x_ptr.data.base_struct.struct_val) {
6494 a->data.x_ptr.data.base_struct.struct_val->global_refs !=
6495 b->data.x_ptr.data.base_struct.struct_val->global_refs)
6496 {
6497 return false;6486 return false;
6498 }6487 }
6499 if (a->data.x_ptr.data.base_struct.field_index != b->data.x_ptr.data.base_struct.field_index)6488 if (a->data.x_ptr.data.base_struct.field_index != b->data.x_ptr.data.base_struct.field_index)
...@@ -6501,27 +6490,21 @@ bool const_values_equal_ptr(ZigValue *a, ZigValue *b) {...@@ -6501,27 +6490,21 @@ bool const_values_equal_ptr(ZigValue *a, ZigValue *b) {
6501 return true;6490 return true;
6502 case ConstPtrSpecialBaseErrorUnionCode:6491 case ConstPtrSpecialBaseErrorUnionCode:
6503 if (a->data.x_ptr.data.base_err_union_code.err_union_val !=6492 if (a->data.x_ptr.data.base_err_union_code.err_union_val !=
6504 b->data.x_ptr.data.base_err_union_code.err_union_val &&6493 b->data.x_ptr.data.base_err_union_code.err_union_val)
6505 a->data.x_ptr.data.base_err_union_code.err_union_val->global_refs !=
6506 b->data.x_ptr.data.base_err_union_code.err_union_val->global_refs)
6507 {6494 {
6508 return false;6495 return false;
6509 }6496 }
6510 return true;6497 return true;
6511 case ConstPtrSpecialBaseErrorUnionPayload:6498 case ConstPtrSpecialBaseErrorUnionPayload:
6512 if (a->data.x_ptr.data.base_err_union_payload.err_union_val !=6499 if (a->data.x_ptr.data.base_err_union_payload.err_union_val !=
6513 b->data.x_ptr.data.base_err_union_payload.err_union_val &&6500 b->data.x_ptr.data.base_err_union_payload.err_union_val)
6514 a->data.x_ptr.data.base_err_union_payload.err_union_val->global_refs !=
6515 b->data.x_ptr.data.base_err_union_payload.err_union_val->global_refs)
6516 {6501 {
6517 return false;6502 return false;
6518 }6503 }
6519 return true;6504 return true;
6520 case ConstPtrSpecialBaseOptionalPayload:6505 case ConstPtrSpecialBaseOptionalPayload:
6521 if (a->data.x_ptr.data.base_optional_payload.optional_val !=6506 if (a->data.x_ptr.data.base_optional_payload.optional_val !=
6522 b->data.x_ptr.data.base_optional_payload.optional_val &&6507 b->data.x_ptr.data.base_optional_payload.optional_val)
6523 a->data.x_ptr.data.base_optional_payload.optional_val->global_refs !=
6524 b->data.x_ptr.data.base_optional_payload.optional_val->global_refs)
6525 {6508 {
6526 return false;6509 return false;
6527 }6510 }
src/codegen.cpp+42-68
...@@ -946,7 +946,7 @@ static Buf *panic_msg_buf(PanicMsgId msg_id) {...@@ -946,7 +946,7 @@ static Buf *panic_msg_buf(PanicMsgId msg_id) {
946946
947static LLVMValueRef get_panic_msg_ptr_val(CodeGen *g, PanicMsgId msg_id) {947static LLVMValueRef get_panic_msg_ptr_val(CodeGen *g, PanicMsgId msg_id) {
948 ZigValue *val = &g->panic_msg_vals[msg_id];948 ZigValue *val = &g->panic_msg_vals[msg_id];
949 if (!val->global_refs->llvm_global) {949 if (!val->llvm_global) {
950950
951 Buf *buf_msg = panic_msg_buf(msg_id);951 Buf *buf_msg = panic_msg_buf(msg_id);
952 ZigValue *array_val = create_const_str_lit(g, buf_msg)->data.x_ptr.data.ref.pointee;952 ZigValue *array_val = create_const_str_lit(g, buf_msg)->data.x_ptr.data.ref.pointee;
...@@ -955,13 +955,13 @@ static LLVMValueRef get_panic_msg_ptr_val(CodeGen *g, PanicMsgId msg_id) {...@@ -955,13 +955,13 @@ static LLVMValueRef get_panic_msg_ptr_val(CodeGen *g, PanicMsgId msg_id) {
955 render_const_val(g, val, "");955 render_const_val(g, val, "");
956 render_const_val_global(g, val, "");956 render_const_val_global(g, val, "");
957957
958 assert(val->global_refs->llvm_global);958 assert(val->llvm_global);
959 }959 }
960960
961 ZigType *u8_ptr_type = get_pointer_to_type_extra(g, g->builtin_types.entry_u8, true, false,961 ZigType *u8_ptr_type = get_pointer_to_type_extra(g, g->builtin_types.entry_u8, true, false,
962 PtrLenUnknown, get_abi_alignment(g, g->builtin_types.entry_u8), 0, 0, false);962 PtrLenUnknown, get_abi_alignment(g, g->builtin_types.entry_u8), 0, 0, false);
963 ZigType *str_type = get_slice_type(g, u8_ptr_type);963 ZigType *str_type = get_slice_type(g, u8_ptr_type);
964 return LLVMConstBitCast(val->global_refs->llvm_global, LLVMPointerType(get_llvm_type(g, str_type), 0));964 return LLVMConstBitCast(val->llvm_global, LLVMPointerType(get_llvm_type(g, str_type), 0));
965}965}
966966
967static ZigType *ptr_to_stack_trace_type(CodeGen *g) {967static ZigType *ptr_to_stack_trace_type(CodeGen *g) {
...@@ -1727,9 +1727,9 @@ static LLVMValueRef ir_llvm_value(CodeGen *g, IrInstruction *instruction) {...@@ -1727,9 +1727,9 @@ static LLVMValueRef ir_llvm_value(CodeGen *g, IrInstruction *instruction) {
1727 if (handle_is_ptr(instruction->value->type)) {1727 if (handle_is_ptr(instruction->value->type)) {
1728 render_const_val_global(g, instruction->value, "");1728 render_const_val_global(g, instruction->value, "");
1729 ZigType *ptr_type = get_pointer_to_type(g, instruction->value->type, true);1729 ZigType *ptr_type = get_pointer_to_type(g, instruction->value->type, true);
1730 instruction->llvm_value = LLVMBuildBitCast(g->builder, instruction->value->global_refs->llvm_global, get_llvm_type(g, ptr_type), "");1730 instruction->llvm_value = LLVMBuildBitCast(g->builder, instruction->value->llvm_global, get_llvm_type(g, ptr_type), "");
1731 } else {1731 } else {
1732 instruction->llvm_value = LLVMBuildBitCast(g->builder, instruction->value->global_refs->llvm_value,1732 instruction->llvm_value = LLVMBuildBitCast(g->builder, instruction->value->llvm_value,
1733 get_llvm_type(g, instruction->value->type), "");1733 get_llvm_type(g, instruction->value->type), "");
1734 }1734 }
1735 assert(instruction->llvm_value);1735 assert(instruction->llvm_value);
...@@ -6374,7 +6374,7 @@ static LLVMValueRef gen_parent_ptr(CodeGen *g, ZigValue *val, ConstParent *paren...@@ -6374,7 +6374,7 @@ static LLVMValueRef gen_parent_ptr(CodeGen *g, ZigValue *val, ConstParent *paren
6374 case ConstParentIdNone:6374 case ConstParentIdNone:
6375 render_const_val(g, val, "");6375 render_const_val(g, val, "");
6376 render_const_val_global(g, val, "");6376 render_const_val_global(g, val, "");
6377 return val->global_refs->llvm_global;6377 return val->llvm_global;
6378 case ConstParentIdStruct:6378 case ConstParentIdStruct:
6379 return gen_const_ptr_struct_recursive(g, parent->data.p_struct.struct_val,6379 return gen_const_ptr_struct_recursive(g, parent->data.p_struct.struct_val,
6380 parent->data.p_struct.field_index);6380 parent->data.p_struct.field_index);
...@@ -6392,7 +6392,7 @@ static LLVMValueRef gen_parent_ptr(CodeGen *g, ZigValue *val, ConstParent *paren...@@ -6392,7 +6392,7 @@ static LLVMValueRef gen_parent_ptr(CodeGen *g, ZigValue *val, ConstParent *paren
6392 case ConstParentIdScalar:6392 case ConstParentIdScalar:
6393 render_const_val(g, parent->data.p_scalar.scalar_val, "");6393 render_const_val(g, parent->data.p_scalar.scalar_val, "");
6394 render_const_val_global(g, parent->data.p_scalar.scalar_val, "");6394 render_const_val_global(g, parent->data.p_scalar.scalar_val, "");
6395 return parent->data.p_scalar.scalar_val->global_refs->llvm_global;6395 return parent->data.p_scalar.scalar_val->llvm_global;
6396 }6396 }
6397 zig_unreachable();6397 zig_unreachable();
6398}6398}
...@@ -6623,17 +6623,15 @@ static LLVMValueRef gen_const_val_ptr(CodeGen *g, ZigValue *const_val, const cha...@@ -6623,17 +6623,15 @@ static LLVMValueRef gen_const_val_ptr(CodeGen *g, ZigValue *const_val, const cha
6623 zig_unreachable();6623 zig_unreachable();
6624 case ConstPtrSpecialRef:6624 case ConstPtrSpecialRef:
6625 {6625 {
6626 assert(const_val->global_refs != nullptr);
6627 ZigValue *pointee = const_val->data.x_ptr.data.ref.pointee;6626 ZigValue *pointee = const_val->data.x_ptr.data.ref.pointee;
6628 render_const_val(g, pointee, "");6627 render_const_val(g, pointee, "");
6629 render_const_val_global(g, pointee, "");6628 render_const_val_global(g, pointee, "");
6630 const_val->global_refs->llvm_value = LLVMConstBitCast(pointee->global_refs->llvm_global,6629 const_val->llvm_value = LLVMConstBitCast(pointee->llvm_global,
6631 get_llvm_type(g, const_val->type));6630 get_llvm_type(g, const_val->type));
6632 return const_val->global_refs->llvm_value;6631 return const_val->llvm_value;
6633 }6632 }
6634 case ConstPtrSpecialBaseArray:6633 case ConstPtrSpecialBaseArray:
6635 {6634 {
6636 assert(const_val->global_refs != nullptr);
6637 ZigValue *array_const_val = const_val->data.x_ptr.data.base_array.array_val;6635 ZigValue *array_const_val = const_val->data.x_ptr.data.base_array.array_val;
6638 assert(array_const_val->type->id == ZigTypeIdArray);6636 assert(array_const_val->type->id == ZigTypeIdArray);
6639 if (!type_has_bits(array_const_val->type)) {6637 if (!type_has_bits(array_const_val->type)) {
...@@ -6641,102 +6639,97 @@ static LLVMValueRef gen_const_val_ptr(CodeGen *g, ZigValue *const_val, const cha...@@ -6641,102 +6639,97 @@ static LLVMValueRef gen_const_val_ptr(CodeGen *g, ZigValue *const_val, const cha
6641 ZigValue *pointee = array_const_val->type->data.array.sentinel;6639 ZigValue *pointee = array_const_val->type->data.array.sentinel;
6642 render_const_val(g, pointee, "");6640 render_const_val(g, pointee, "");
6643 render_const_val_global(g, pointee, "");6641 render_const_val_global(g, pointee, "");
6644 const_val->global_refs->llvm_value = LLVMConstBitCast(pointee->global_refs->llvm_global,6642 const_val->llvm_value = LLVMConstBitCast(pointee->llvm_global,
6645 get_llvm_type(g, const_val->type));6643 get_llvm_type(g, const_val->type));
6646 return const_val->global_refs->llvm_value;6644 return const_val->llvm_value;
6647 } else {6645 } else {
6648 // make this a null pointer6646 // make this a null pointer
6649 ZigType *usize = g->builtin_types.entry_usize;6647 ZigType *usize = g->builtin_types.entry_usize;
6650 const_val->global_refs->llvm_value = LLVMConstIntToPtr(LLVMConstNull(usize->llvm_type),6648 const_val->llvm_value = LLVMConstIntToPtr(LLVMConstNull(usize->llvm_type),
6651 get_llvm_type(g, const_val->type));6649 get_llvm_type(g, const_val->type));
6652 return const_val->global_refs->llvm_value;6650 return const_val->llvm_value;
6653 }6651 }
6654 }6652 }
6655 size_t elem_index = const_val->data.x_ptr.data.base_array.elem_index;6653 size_t elem_index = const_val->data.x_ptr.data.base_array.elem_index;
6656 LLVMValueRef uncasted_ptr_val = gen_const_ptr_array_recursive(g, array_const_val, elem_index);6654 LLVMValueRef uncasted_ptr_val = gen_const_ptr_array_recursive(g, array_const_val, elem_index);
6657 LLVMValueRef ptr_val = LLVMConstBitCast(uncasted_ptr_val, get_llvm_type(g, const_val->type));6655 LLVMValueRef ptr_val = LLVMConstBitCast(uncasted_ptr_val, get_llvm_type(g, const_val->type));
6658 const_val->global_refs->llvm_value = ptr_val;6656 const_val->llvm_value = ptr_val;
6659 return ptr_val;6657 return ptr_val;
6660 }6658 }
6661 case ConstPtrSpecialBaseStruct:6659 case ConstPtrSpecialBaseStruct:
6662 {6660 {
6663 assert(const_val->global_refs != nullptr);
6664 ZigValue *struct_const_val = const_val->data.x_ptr.data.base_struct.struct_val;6661 ZigValue *struct_const_val = const_val->data.x_ptr.data.base_struct.struct_val;
6665 assert(struct_const_val->type->id == ZigTypeIdStruct);6662 assert(struct_const_val->type->id == ZigTypeIdStruct);
6666 if (!type_has_bits(struct_const_val->type)) {6663 if (!type_has_bits(struct_const_val->type)) {
6667 // make this a null pointer6664 // make this a null pointer
6668 ZigType *usize = g->builtin_types.entry_usize;6665 ZigType *usize = g->builtin_types.entry_usize;
6669 const_val->global_refs->llvm_value = LLVMConstIntToPtr(LLVMConstNull(usize->llvm_type),6666 const_val->llvm_value = LLVMConstIntToPtr(LLVMConstNull(usize->llvm_type),
6670 get_llvm_type(g, const_val->type));6667 get_llvm_type(g, const_val->type));
6671 return const_val->global_refs->llvm_value;6668 return const_val->llvm_value;
6672 }6669 }
6673 size_t src_field_index = const_val->data.x_ptr.data.base_struct.field_index;6670 size_t src_field_index = const_val->data.x_ptr.data.base_struct.field_index;
6674 size_t gen_field_index = struct_const_val->type->data.structure.fields[src_field_index]->gen_index;6671 size_t gen_field_index = struct_const_val->type->data.structure.fields[src_field_index]->gen_index;
6675 LLVMValueRef uncasted_ptr_val = gen_const_ptr_struct_recursive(g, struct_const_val,6672 LLVMValueRef uncasted_ptr_val = gen_const_ptr_struct_recursive(g, struct_const_val,
6676 gen_field_index);6673 gen_field_index);
6677 LLVMValueRef ptr_val = LLVMConstBitCast(uncasted_ptr_val, get_llvm_type(g, const_val->type));6674 LLVMValueRef ptr_val = LLVMConstBitCast(uncasted_ptr_val, get_llvm_type(g, const_val->type));
6678 const_val->global_refs->llvm_value = ptr_val;6675 const_val->llvm_value = ptr_val;
6679 return ptr_val;6676 return ptr_val;
6680 }6677 }
6681 case ConstPtrSpecialBaseErrorUnionCode:6678 case ConstPtrSpecialBaseErrorUnionCode:
6682 {6679 {
6683 assert(const_val->global_refs != nullptr);
6684 ZigValue *err_union_const_val = const_val->data.x_ptr.data.base_err_union_code.err_union_val;6680 ZigValue *err_union_const_val = const_val->data.x_ptr.data.base_err_union_code.err_union_val;
6685 assert(err_union_const_val->type->id == ZigTypeIdErrorUnion);6681 assert(err_union_const_val->type->id == ZigTypeIdErrorUnion);
6686 if (!type_has_bits(err_union_const_val->type)) {6682 if (!type_has_bits(err_union_const_val->type)) {
6687 // make this a null pointer6683 // make this a null pointer
6688 ZigType *usize = g->builtin_types.entry_usize;6684 ZigType *usize = g->builtin_types.entry_usize;
6689 const_val->global_refs->llvm_value = LLVMConstIntToPtr(LLVMConstNull(usize->llvm_type),6685 const_val->llvm_value = LLVMConstIntToPtr(LLVMConstNull(usize->llvm_type),
6690 get_llvm_type(g, const_val->type));6686 get_llvm_type(g, const_val->type));
6691 return const_val->global_refs->llvm_value;6687 return const_val->llvm_value;
6692 }6688 }
6693 LLVMValueRef uncasted_ptr_val = gen_const_ptr_err_union_code_recursive(g, err_union_const_val);6689 LLVMValueRef uncasted_ptr_val = gen_const_ptr_err_union_code_recursive(g, err_union_const_val);
6694 LLVMValueRef ptr_val = LLVMConstBitCast(uncasted_ptr_val, get_llvm_type(g, const_val->type));6690 LLVMValueRef ptr_val = LLVMConstBitCast(uncasted_ptr_val, get_llvm_type(g, const_val->type));
6695 const_val->global_refs->llvm_value = ptr_val;6691 const_val->llvm_value = ptr_val;
6696 return ptr_val;6692 return ptr_val;
6697 }6693 }
6698 case ConstPtrSpecialBaseErrorUnionPayload:6694 case ConstPtrSpecialBaseErrorUnionPayload:
6699 {6695 {
6700 assert(const_val->global_refs != nullptr);
6701 ZigValue *err_union_const_val = const_val->data.x_ptr.data.base_err_union_payload.err_union_val;6696 ZigValue *err_union_const_val = const_val->data.x_ptr.data.base_err_union_payload.err_union_val;
6702 assert(err_union_const_val->type->id == ZigTypeIdErrorUnion);6697 assert(err_union_const_val->type->id == ZigTypeIdErrorUnion);
6703 if (!type_has_bits(err_union_const_val->type)) {6698 if (!type_has_bits(err_union_const_val->type)) {
6704 // make this a null pointer6699 // make this a null pointer
6705 ZigType *usize = g->builtin_types.entry_usize;6700 ZigType *usize = g->builtin_types.entry_usize;
6706 const_val->global_refs->llvm_value = LLVMConstIntToPtr(LLVMConstNull(usize->llvm_type),6701 const_val->llvm_value = LLVMConstIntToPtr(LLVMConstNull(usize->llvm_type),
6707 get_llvm_type(g, const_val->type));6702 get_llvm_type(g, const_val->type));
6708 return const_val->global_refs->llvm_value;6703 return const_val->llvm_value;
6709 }6704 }
6710 LLVMValueRef uncasted_ptr_val = gen_const_ptr_err_union_payload_recursive(g, err_union_const_val);6705 LLVMValueRef uncasted_ptr_val = gen_const_ptr_err_union_payload_recursive(g, err_union_const_val);
6711 LLVMValueRef ptr_val = LLVMConstBitCast(uncasted_ptr_val, get_llvm_type(g, const_val->type));6706 LLVMValueRef ptr_val = LLVMConstBitCast(uncasted_ptr_val, get_llvm_type(g, const_val->type));
6712 const_val->global_refs->llvm_value = ptr_val;6707 const_val->llvm_value = ptr_val;
6713 return ptr_val;6708 return ptr_val;
6714 }6709 }
6715 case ConstPtrSpecialBaseOptionalPayload:6710 case ConstPtrSpecialBaseOptionalPayload:
6716 {6711 {
6717 assert(const_val->global_refs != nullptr);
6718 ZigValue *optional_const_val = const_val->data.x_ptr.data.base_optional_payload.optional_val;6712 ZigValue *optional_const_val = const_val->data.x_ptr.data.base_optional_payload.optional_val;
6719 assert(optional_const_val->type->id == ZigTypeIdOptional);6713 assert(optional_const_val->type->id == ZigTypeIdOptional);
6720 if (!type_has_bits(optional_const_val->type)) {6714 if (!type_has_bits(optional_const_val->type)) {
6721 // make this a null pointer6715 // make this a null pointer
6722 ZigType *usize = g->builtin_types.entry_usize;6716 ZigType *usize = g->builtin_types.entry_usize;
6723 const_val->global_refs->llvm_value = LLVMConstIntToPtr(LLVMConstNull(usize->llvm_type),6717 const_val->llvm_value = LLVMConstIntToPtr(LLVMConstNull(usize->llvm_type),
6724 get_llvm_type(g, const_val->type));6718 get_llvm_type(g, const_val->type));
6725 return const_val->global_refs->llvm_value;6719 return const_val->llvm_value;
6726 }6720 }
6727 LLVMValueRef uncasted_ptr_val = gen_const_ptr_optional_payload_recursive(g, optional_const_val);6721 LLVMValueRef uncasted_ptr_val = gen_const_ptr_optional_payload_recursive(g, optional_const_val);
6728 LLVMValueRef ptr_val = LLVMConstBitCast(uncasted_ptr_val, get_llvm_type(g, const_val->type));6722 LLVMValueRef ptr_val = LLVMConstBitCast(uncasted_ptr_val, get_llvm_type(g, const_val->type));
6729 const_val->global_refs->llvm_value = ptr_val;6723 const_val->llvm_value = ptr_val;
6730 return ptr_val;6724 return ptr_val;
6731 }6725 }
6732 case ConstPtrSpecialHardCodedAddr:6726 case ConstPtrSpecialHardCodedAddr:
6733 {6727 {
6734 assert(const_val->global_refs != nullptr);
6735 uint64_t addr_value = const_val->data.x_ptr.data.hard_coded_addr.addr;6728 uint64_t addr_value = const_val->data.x_ptr.data.hard_coded_addr.addr;
6736 ZigType *usize = g->builtin_types.entry_usize;6729 ZigType *usize = g->builtin_types.entry_usize;
6737 const_val->global_refs->llvm_value = LLVMConstIntToPtr(6730 const_val->llvm_value = LLVMConstIntToPtr(
6738 LLVMConstInt(usize->llvm_type, addr_value, false), get_llvm_type(g, const_val->type));6731 LLVMConstInt(usize->llvm_type, addr_value, false), get_llvm_type(g, const_val->type));
6739 return const_val->global_refs->llvm_value;6732 return const_val->llvm_value;
6740 }6733 }
6741 case ConstPtrSpecialFunction:6734 case ConstPtrSpecialFunction:
6742 return LLVMConstBitCast(fn_llvm_value(g, const_val->data.x_ptr.data.fn.fn_entry),6735 return LLVMConstBitCast(fn_llvm_value(g, const_val->data.x_ptr.data.fn.fn_entry),
...@@ -7175,34 +7168,29 @@ check: switch (const_val->special) {...@@ -7175,34 +7168,29 @@ check: switch (const_val->special) {
7175}7168}
71767169
7177static void render_const_val(CodeGen *g, ZigValue *const_val, const char *name) {7170static void render_const_val(CodeGen *g, ZigValue *const_val, const char *name) {
7178 if (!const_val->global_refs)7171 if (!const_val->llvm_value)
7179 const_val->global_refs = allocate<ConstGlobalRefs>(1);7172 const_val->llvm_value = gen_const_val(g, const_val, name);
7180 if (!const_val->global_refs->llvm_value)
7181 const_val->global_refs->llvm_value = gen_const_val(g, const_val, name);
71827173
7183 if (const_val->global_refs->llvm_global)7174 if (const_val->llvm_global)
7184 LLVMSetInitializer(const_val->global_refs->llvm_global, const_val->global_refs->llvm_value);7175 LLVMSetInitializer(const_val->llvm_global, const_val->llvm_value);
7185}7176}
71867177
7187static void render_const_val_global(CodeGen *g, ZigValue *const_val, const char *name) {7178static void render_const_val_global(CodeGen *g, ZigValue *const_val, const char *name) {
7188 if (!const_val->global_refs)7179 if (!const_val->llvm_global) {
7189 const_val->global_refs = allocate<ConstGlobalRefs>(1);7180 LLVMTypeRef type_ref = const_val->llvm_value ?
71907181 LLVMTypeOf(const_val->llvm_value) : get_llvm_type(g, const_val->type);
7191 if (!const_val->global_refs->llvm_global) {
7192 LLVMTypeRef type_ref = const_val->global_refs->llvm_value ?
7193 LLVMTypeOf(const_val->global_refs->llvm_value) : get_llvm_type(g, const_val->type);
7194 LLVMValueRef global_value = LLVMAddGlobal(g->module, type_ref, name);7182 LLVMValueRef global_value = LLVMAddGlobal(g->module, type_ref, name);
7195 LLVMSetLinkage(global_value, LLVMInternalLinkage);7183 LLVMSetLinkage(global_value, LLVMInternalLinkage);
7196 LLVMSetGlobalConstant(global_value, true);7184 LLVMSetGlobalConstant(global_value, true);
7197 LLVMSetUnnamedAddr(global_value, true);7185 LLVMSetUnnamedAddr(global_value, true);
7198 LLVMSetAlignment(global_value, (const_val->global_refs->align == 0) ?7186 LLVMSetAlignment(global_value, (const_val->llvm_align == 0) ?
7199 get_abi_alignment(g, const_val->type) : const_val->global_refs->align);7187 get_abi_alignment(g, const_val->type) : const_val->llvm_align);
72007188
7201 const_val->global_refs->llvm_global = global_value;7189 const_val->llvm_global = global_value;
7202 }7190 }
72037191
7204 if (const_val->global_refs->llvm_value)7192 if (const_val->llvm_value)
7205 LLVMSetInitializer(const_val->global_refs->llvm_global, const_val->global_refs->llvm_value);7193 LLVMSetInitializer(const_val->llvm_global, const_val->llvm_value);
7206}7194}
72077195
7208static void generate_error_name_table(CodeGen *g) {7196static void generate_error_name_table(CodeGen *g) {
...@@ -7403,7 +7391,7 @@ static void do_code_gen(CodeGen *g) {...@@ -7403,7 +7391,7 @@ static void do_code_gen(CodeGen *g) {
7403 bool exported = (linkage != GlobalLinkageIdInternal);7391 bool exported = (linkage != GlobalLinkageIdInternal);
7404 render_const_val(g, var->const_value, symbol_name);7392 render_const_val(g, var->const_value, symbol_name);
7405 render_const_val_global(g, var->const_value, symbol_name);7393 render_const_val_global(g, var->const_value, symbol_name);
7406 global_value = var->const_value->global_refs->llvm_global;7394 global_value = var->const_value->llvm_global;
74077395
7408 if (exported) {7396 if (exported) {
7409 LLVMSetLinkage(global_value, to_llvm_linkage(linkage));7397 LLVMSetLinkage(global_value, to_llvm_linkage(linkage));
...@@ -7418,7 +7406,7 @@ static void do_code_gen(CodeGen *g) {...@@ -7418,7 +7406,7 @@ static void do_code_gen(CodeGen *g) {
7418 // Here we use const_value->type because that's the type of the llvm global,7406 // Here we use const_value->type because that's the type of the llvm global,
7419 // which we const ptr cast upon use to whatever it needs to be.7407 // which we const ptr cast upon use to whatever it needs to be.
7420 if (var->gen_is_const && var->const_value->type->id != ZigTypeIdFn) {7408 if (var->gen_is_const && var->const_value->type->id != ZigTypeIdFn) {
7421 gen_global_var(g, var, var->const_value->global_refs->llvm_value, var->const_value->type);7409 gen_global_var(g, var, var->const_value->llvm_value, var->const_value->type);
7422 }7410 }
74237411
7424 LLVMSetGlobalConstant(global_value, var->gen_is_const);7412 LLVMSetGlobalConstant(global_value, var->gen_is_const);
...@@ -8012,31 +8000,26 @@ static void define_intern_values(CodeGen *g) {...@@ -8012,31 +8000,26 @@ static void define_intern_values(CodeGen *g) {
8012 {8000 {
8013 auto& value = g->intern.x_undefined;8001 auto& value = g->intern.x_undefined;
8014 value.type = g->builtin_types.entry_undef;8002 value.type = g->builtin_types.entry_undef;
8015 value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.undefined");
8016 value.special = ConstValSpecialStatic;8003 value.special = ConstValSpecialStatic;
8017 }8004 }
8018 {8005 {
8019 auto& value = g->intern.x_void;8006 auto& value = g->intern.x_void;
8020 value.type = g->builtin_types.entry_void;8007 value.type = g->builtin_types.entry_void;
8021 value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.void");
8022 value.special = ConstValSpecialStatic;8008 value.special = ConstValSpecialStatic;
8023 }8009 }
8024 {8010 {
8025 auto& value = g->intern.x_null;8011 auto& value = g->intern.x_null;
8026 value.type = g->builtin_types.entry_null;8012 value.type = g->builtin_types.entry_null;
8027 value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.null");
8028 value.special = ConstValSpecialStatic;8013 value.special = ConstValSpecialStatic;
8029 }8014 }
8030 {8015 {
8031 auto& value = g->intern.x_unreachable;8016 auto& value = g->intern.x_unreachable;
8032 value.type = g->builtin_types.entry_unreachable;8017 value.type = g->builtin_types.entry_unreachable;
8033 value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.unreachable");
8034 value.special = ConstValSpecialStatic;8018 value.special = ConstValSpecialStatic;
8035 }8019 }
8036 {8020 {
8037 auto& value = g->intern.zero_byte;8021 auto& value = g->intern.zero_byte;
8038 value.type = g->builtin_types.entry_u8;8022 value.type = g->builtin_types.entry_u8;
8039 value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.zero_byte");
8040 value.special = ConstValSpecialStatic;8023 value.special = ConstValSpecialStatic;
8041 bigint_init_unsigned(&value.data.x_bigint, 0);8024 bigint_init_unsigned(&value.data.x_bigint, 0);
8042 }8025 }
...@@ -8669,19 +8652,10 @@ static void init(CodeGen *g) {...@@ -8669,19 +8652,10 @@ static void init(CodeGen *g) {
8669 g->invalid_instruction = &sentinel_instructions[0];8652 g->invalid_instruction = &sentinel_instructions[0];
8670 g->invalid_instruction->value = allocate<ZigValue>(1, "ZigValue");8653 g->invalid_instruction->value = allocate<ZigValue>(1, "ZigValue");
8671 g->invalid_instruction->value->type = g->builtin_types.entry_invalid;8654 g->invalid_instruction->value->type = g->builtin_types.entry_invalid;
8672 g->invalid_instruction->value->global_refs = allocate<ConstGlobalRefs>(1);
86738655
8674 g->unreach_instruction = &sentinel_instructions[1];8656 g->unreach_instruction = &sentinel_instructions[1];
8675 g->unreach_instruction->value = allocate<ZigValue>(1, "ZigValue");8657 g->unreach_instruction->value = allocate<ZigValue>(1, "ZigValue");
8676 g->unreach_instruction->value->type = g->builtin_types.entry_unreachable;8658 g->unreach_instruction->value->type = g->builtin_types.entry_unreachable;
8677 g->unreach_instruction->value->global_refs = allocate<ConstGlobalRefs>(1);
8678
8679 {
8680 ConstGlobalRefs *global_refs = allocate<ConstGlobalRefs>(PanicMsgIdCount);
8681 for (size_t i = 0; i < PanicMsgIdCount; i += 1) {
8682 g->panic_msg_vals[i].global_refs = &global_refs[i];
8683 }
8684 }
86858659
8686 define_builtin_fns(g);8660 define_builtin_fns(g);
8687 Error err;8661 Error err;
src/ir.cpp+49-63
...@@ -219,7 +219,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source...@@ -219,7 +219,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source
219static IrInstruction *ir_analyze_ptr_cast(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *ptr,219static IrInstruction *ir_analyze_ptr_cast(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *ptr,
220 ZigType *dest_type, IrInstruction *dest_type_src, bool safety_check_on);220 ZigType *dest_type, IrInstruction *dest_type_src, bool safety_check_on);
221static ZigValue *ir_resolve_const(IrAnalyze *ira, IrInstruction *value, UndefAllowed undef_allowed);221static ZigValue *ir_resolve_const(IrAnalyze *ira, IrInstruction *value, UndefAllowed undef_allowed);
222static void copy_const_val(ZigValue *dest, ZigValue *src, bool same_global_refs);222static void copy_const_val(ZigValue *dest, ZigValue *src);
223static Error resolve_ptr_align(IrAnalyze *ira, ZigType *ty, uint32_t *result_align);223static Error resolve_ptr_align(IrAnalyze *ira, ZigType *ty, uint32_t *result_align);
224static IrInstruction *ir_analyze_int_to_ptr(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *target,224static IrInstruction *ir_analyze_int_to_ptr(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *target,
225 ZigType *ptr_type);225 ZigType *ptr_type);
...@@ -1165,7 +1165,6 @@ static T *ir_create_instruction(IrBuilder *irb, Scope *scope, AstNode *source_no...@@ -1165,7 +1165,6 @@ static T *ir_create_instruction(IrBuilder *irb, Scope *scope, AstNode *source_no
1165 special_instruction->base.debug_id = exec_next_debug_id(irb->exec);1165 special_instruction->base.debug_id = exec_next_debug_id(irb->exec);
1166 special_instruction->base.owner_bb = irb->current_basic_block;1166 special_instruction->base.owner_bb = irb->current_basic_block;
1167 special_instruction->base.value = allocate<ZigValue>(1, "ZigValue");1167 special_instruction->base.value = allocate<ZigValue>(1, "ZigValue");
1168 special_instruction->base.value->global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs");
1169 return special_instruction;1168 return special_instruction;
1170}1169}
11711170
...@@ -8735,7 +8734,7 @@ static Error eval_comptime_ptr_reinterpret(IrAnalyze *ira, CodeGen *codegen, Ast...@@ -8735,7 +8734,7 @@ static Error eval_comptime_ptr_reinterpret(IrAnalyze *ira, CodeGen *codegen, Ast
8735 if ((err = ir_read_const_ptr(ira, codegen, source_node, &tmp, ptr_val)))8734 if ((err = ir_read_const_ptr(ira, codegen, source_node, &tmp, ptr_val)))
8736 return err;8735 return err;
8737 ZigValue *child_val = const_ptr_pointee_unchecked(codegen, ptr_val);8736 ZigValue *child_val = const_ptr_pointee_unchecked(codegen, ptr_val);
8738 copy_const_val(child_val, &tmp, false);8737 copy_const_val(child_val, &tmp);
8739 return ErrorNone;8738 return ErrorNone;
8740}8739}
87418740
...@@ -11018,18 +11017,14 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT...@@ -11018,18 +11017,14 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
11018 }11017 }
11019}11018}
1102011019
11021static void copy_const_val(ZigValue *dest, ZigValue *src, bool same_global_refs) {11020static void copy_const_val(ZigValue *dest, ZigValue *src) {
11022 ConstGlobalRefs *global_refs = dest->global_refs;
11023 memcpy(dest, src, sizeof(ZigValue));11021 memcpy(dest, src, sizeof(ZigValue));
11024 if (!same_global_refs) {11022 if (src->special != ConstValSpecialStatic)
11025 dest->global_refs = global_refs;11023 return;
11026 if (src->special != ConstValSpecialStatic)11024 if (dest->type->id == ZigTypeIdStruct) {
11027 return;11025 dest->data.x_struct.fields = alloc_const_vals_ptrs(dest->type->data.structure.src_field_count);
11028 if (dest->type->id == ZigTypeIdStruct) {11026 for (size_t i = 0; i < dest->type->data.structure.src_field_count; i += 1) {
11029 dest->data.x_struct.fields = alloc_const_vals_ptrs(dest->type->data.structure.src_field_count);11027 copy_const_val(dest->data.x_struct.fields[i], src->data.x_struct.fields[i]);
11030 for (size_t i = 0; i < dest->type->data.structure.src_field_count; i += 1) {
11031 copy_const_val(dest->data.x_struct.fields[i], src->data.x_struct.fields[i], false);
11032 }
11033 }11028 }
11034 }11029 }
11035}11030}
...@@ -11048,13 +11043,11 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInstruction *source_...@@ -11048,13 +11043,11 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInstruction *source_
11048 case CastOpErrSet:11043 case CastOpErrSet:
11049 case CastOpBitCast:11044 case CastOpBitCast:
11050 zig_panic("TODO");11045 zig_panic("TODO");
11051 case CastOpNoop:11046 case CastOpNoop: {
11052 {11047 copy_const_val(const_val, other_val);
11053 bool same_global_refs = other_val->special == ConstValSpecialStatic;11048 const_val->type = new_type;
11054 copy_const_val(const_val, other_val, same_global_refs);11049 break;
11055 const_val->type = new_type;11050 }
11056 break;
11057 }
11058 case CastOpNumLitToConcrete:11051 case CastOpNumLitToConcrete:
11059 if (other_val->type->id == ZigTypeIdComptimeFloat) {11052 if (other_val->type->id == ZigTypeIdComptimeFloat) {
11060 assert(new_type->id == ZigTypeIdFloat);11053 assert(new_type->id == ZigTypeIdFloat);
...@@ -11775,7 +11768,7 @@ static IrInstruction *ir_analyze_optional_wrap(IrAnalyze *ira, IrInstruction *so...@@ -11775,7 +11768,7 @@ static IrInstruction *ir_analyze_optional_wrap(IrAnalyze *ira, IrInstruction *so
11775 source_instr->scope, source_instr->source_node);11768 source_instr->scope, source_instr->source_node);
11776 const_instruction->base.value->special = ConstValSpecialStatic;11769 const_instruction->base.value->special = ConstValSpecialStatic;
11777 if (types_have_same_zig_comptime_repr(ira->codegen, wanted_type, payload_type)) {11770 if (types_have_same_zig_comptime_repr(ira->codegen, wanted_type, payload_type)) {
11778 copy_const_val(const_instruction->base.value, val, val->data.x_ptr.mut == ConstPtrMutComptimeConst);11771 copy_const_val(const_instruction->base.value, val);
11779 } else {11772 } else {
11780 const_instruction->base.value->data.x_optional = val;11773 const_instruction->base.value->data.x_optional = val;
11781 }11774 }
...@@ -12779,7 +12772,7 @@ static IrInstruction *ir_analyze_array_to_vector(IrAnalyze *ira, IrInstruction *...@@ -12779,7 +12772,7 @@ static IrInstruction *ir_analyze_array_to_vector(IrAnalyze *ira, IrInstruction *
12779 if (instr_is_comptime(array)) {12772 if (instr_is_comptime(array)) {
12780 // arrays and vectors have the same ZigValue representation12773 // arrays and vectors have the same ZigValue representation
12781 IrInstruction *result = ir_const(ira, source_instr, vector_type);12774 IrInstruction *result = ir_const(ira, source_instr, vector_type);
12782 copy_const_val(result->value, array->value, false);12775 copy_const_val(result->value, array->value);
12783 result->value->type = vector_type;12776 result->value->type = vector_type;
12784 return result;12777 return result;
12785 }12778 }
...@@ -12792,7 +12785,7 @@ static IrInstruction *ir_analyze_vector_to_array(IrAnalyze *ira, IrInstruction *...@@ -12792,7 +12785,7 @@ static IrInstruction *ir_analyze_vector_to_array(IrAnalyze *ira, IrInstruction *
12792 if (instr_is_comptime(vector)) {12785 if (instr_is_comptime(vector)) {
12793 // arrays and vectors have the same ZigValue representation12786 // arrays and vectors have the same ZigValue representation
12794 IrInstruction *result = ir_const(ira, source_instr, array_type);12787 IrInstruction *result = ir_const(ira, source_instr, array_type);
12795 copy_const_val(result->value, vector->value, false);12788 copy_const_val(result->value, vector->value);
12796 result->value->type = array_type;12789 result->value->type = array_type;
12797 return result;12790 return result;
12798 }12791 }
...@@ -13080,7 +13073,7 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst...@@ -13080,7 +13073,7 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst
13080 if (wanted_type->id == ZigTypeIdComptimeInt || wanted_type->id == ZigTypeIdInt) {13073 if (wanted_type->id == ZigTypeIdComptimeInt || wanted_type->id == ZigTypeIdInt) {
13081 IrInstruction *result = ir_const(ira, source_instr, wanted_type);13074 IrInstruction *result = ir_const(ira, source_instr, wanted_type);
13082 if (actual_type->id == ZigTypeIdComptimeInt || actual_type->id == ZigTypeIdInt) {13075 if (actual_type->id == ZigTypeIdComptimeInt || actual_type->id == ZigTypeIdInt) {
13083 copy_const_val(result->value, value->value, false);13076 copy_const_val(result->value, value->value);
13084 result->value->type = wanted_type;13077 result->value->type = wanted_type;
13085 } else {13078 } else {
13086 float_init_bigint(&result->value->data.x_bigint, value->value);13079 float_init_bigint(&result->value->data.x_bigint, value->value);
...@@ -13963,7 +13956,7 @@ static IrInstruction *ir_analyze_instruction_return(IrAnalyze *ira, IrInstructio...@@ -13963,7 +13956,7 @@ static IrInstruction *ir_analyze_instruction_return(IrAnalyze *ira, IrInstructio
1396313956
13964static IrInstruction *ir_analyze_instruction_const(IrAnalyze *ira, IrInstructionConst *instruction) {13957static IrInstruction *ir_analyze_instruction_const(IrAnalyze *ira, IrInstructionConst *instruction) {
13965 IrInstruction *result = ir_const(ira, &instruction->base, nullptr);13958 IrInstruction *result = ir_const(ira, &instruction->base, nullptr);
13966 copy_const_val(result->value, instruction->base.value, true);13959 copy_const_val(result->value, instruction->base.value);
13967 return result;13960 return result;
13968}13961}
1396913962
...@@ -14502,7 +14495,7 @@ never_mind_just_calculate_it_normally:...@@ -14502,7 +14495,7 @@ never_mind_just_calculate_it_normally:
14502 &op1_val->data.x_array.data.s_none.elements[i],14495 &op1_val->data.x_array.data.s_none.elements[i],
14503 &op2_val->data.x_array.data.s_none.elements[i],14496 &op2_val->data.x_array.data.s_none.elements[i],
14504 bin_op_instruction, op_id, one_possible_value);14497 bin_op_instruction, op_id, one_possible_value);
14505 copy_const_val(&result->value->data.x_array.data.s_none.elements[i], cur_res->value, false);14498 copy_const_val(&result->value->data.x_array.data.s_none.elements[i], cur_res->value);
14506 }14499 }
14507 return result;14500 return result;
14508 }14501 }
...@@ -15368,21 +15361,21 @@ static IrInstruction *ir_analyze_array_cat(IrAnalyze *ira, IrInstructionBinOp *i...@@ -15368,21 +15361,21 @@ static IrInstruction *ir_analyze_array_cat(IrAnalyze *ira, IrInstructionBinOp *i
15368 size_t next_index = 0;15361 size_t next_index = 0;
15369 for (size_t i = op1_array_index; i < op1_array_end; i += 1, next_index += 1) {15362 for (size_t i = op1_array_index; i < op1_array_end; i += 1, next_index += 1) {
15370 ZigValue *elem_dest_val = &out_array_val->data.x_array.data.s_none.elements[next_index];15363 ZigValue *elem_dest_val = &out_array_val->data.x_array.data.s_none.elements[next_index];
15371 copy_const_val(elem_dest_val, &op1_array_val->data.x_array.data.s_none.elements[i], false);15364 copy_const_val(elem_dest_val, &op1_array_val->data.x_array.data.s_none.elements[i]);
15372 elem_dest_val->parent.id = ConstParentIdArray;15365 elem_dest_val->parent.id = ConstParentIdArray;
15373 elem_dest_val->parent.data.p_array.array_val = out_array_val;15366 elem_dest_val->parent.data.p_array.array_val = out_array_val;
15374 elem_dest_val->parent.data.p_array.elem_index = next_index;15367 elem_dest_val->parent.data.p_array.elem_index = next_index;
15375 }15368 }
15376 for (size_t i = op2_array_index; i < op2_array_end; i += 1, next_index += 1) {15369 for (size_t i = op2_array_index; i < op2_array_end; i += 1, next_index += 1) {
15377 ZigValue *elem_dest_val = &out_array_val->data.x_array.data.s_none.elements[next_index];15370 ZigValue *elem_dest_val = &out_array_val->data.x_array.data.s_none.elements[next_index];
15378 copy_const_val(elem_dest_val, &op2_array_val->data.x_array.data.s_none.elements[i], false);15371 copy_const_val(elem_dest_val, &op2_array_val->data.x_array.data.s_none.elements[i]);
15379 elem_dest_val->parent.id = ConstParentIdArray;15372 elem_dest_val->parent.id = ConstParentIdArray;
15380 elem_dest_val->parent.data.p_array.array_val = out_array_val;15373 elem_dest_val->parent.data.p_array.array_val = out_array_val;
15381 elem_dest_val->parent.data.p_array.elem_index = next_index;15374 elem_dest_val->parent.data.p_array.elem_index = next_index;
15382 }15375 }
15383 if (next_index < full_len) {15376 if (next_index < full_len) {
15384 ZigValue *elem_dest_val = &out_array_val->data.x_array.data.s_none.elements[next_index];15377 ZigValue *elem_dest_val = &out_array_val->data.x_array.data.s_none.elements[next_index];
15385 copy_const_val(elem_dest_val, sentinel, false);15378 copy_const_val(elem_dest_val, sentinel);
15386 elem_dest_val->parent.id = ConstParentIdArray;15379 elem_dest_val->parent.id = ConstParentIdArray;
15387 elem_dest_val->parent.data.p_array.array_val = out_array_val;15380 elem_dest_val->parent.data.p_array.array_val = out_array_val;
15388 elem_dest_val->parent.data.p_array.elem_index = next_index;15381 elem_dest_val->parent.data.p_array.elem_index = next_index;
...@@ -15467,7 +15460,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp *...@@ -15467,7 +15460,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp *
15467 for (uint64_t x = 0; x < mult_amt; x += 1) {15460 for (uint64_t x = 0; x < mult_amt; x += 1) {
15468 for (uint64_t y = 0; y < old_array_len; y += 1) {15461 for (uint64_t y = 0; y < old_array_len; y += 1) {
15469 ZigValue *elem_dest_val = &out_val->data.x_array.data.s_none.elements[i];15462 ZigValue *elem_dest_val = &out_val->data.x_array.data.s_none.elements[i];
15470 copy_const_val(elem_dest_val, &array_val->data.x_array.data.s_none.elements[y], false);15463 copy_const_val(elem_dest_val, &array_val->data.x_array.data.s_none.elements[y]);
15471 elem_dest_val->parent.id = ConstParentIdArray;15464 elem_dest_val->parent.id = ConstParentIdArray;
15472 elem_dest_val->parent.data.p_array.array_val = out_val;15465 elem_dest_val->parent.data.p_array.array_val = out_val;
15473 elem_dest_val->parent.data.p_array.elem_index = i;15466 elem_dest_val->parent.data.p_array.elem_index = i;
...@@ -15478,7 +15471,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp *...@@ -15478,7 +15471,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp *
1547815471
15479 if (array_type->data.array.sentinel != nullptr) {15472 if (array_type->data.array.sentinel != nullptr) {
15480 ZigValue *elem_dest_val = &out_val->data.x_array.data.s_none.elements[i];15473 ZigValue *elem_dest_val = &out_val->data.x_array.data.s_none.elements[i];
15481 copy_const_val(elem_dest_val, array_type->data.array.sentinel, false);15474 copy_const_val(elem_dest_val, array_type->data.array.sentinel);
15482 elem_dest_val->parent.id = ConstParentIdArray;15475 elem_dest_val->parent.id = ConstParentIdArray;
15483 elem_dest_val->parent.data.p_array.array_val = out_val;15476 elem_dest_val->parent.data.p_array.array_val = out_val;
15484 elem_dest_val->parent.data.p_array.elem_index = i;15477 elem_dest_val->parent.data.p_array.elem_index = i;
...@@ -15628,7 +15621,7 @@ static IrInstruction *ir_analyze_instruction_decl_var(IrAnalyze *ira,...@@ -15628,7 +15621,7 @@ static IrInstruction *ir_analyze_instruction_decl_var(IrAnalyze *ira,
15628 var->const_value = init_val;15621 var->const_value = init_val;
15629 } else {15622 } else {
15630 var->const_value = create_const_vals(1);15623 var->const_value = create_const_vals(1);
15631 copy_const_val(var->const_value, init_val, false);15624 copy_const_val(var->const_value, init_val);
15632 }15625 }
15633 }15626 }
15634 }15627 }
...@@ -15738,7 +15731,7 @@ static IrInstruction *ir_analyze_instruction_decl_var(IrAnalyze *ira,...@@ -15738,7 +15731,7 @@ static IrInstruction *ir_analyze_instruction_decl_var(IrAnalyze *ira,
15738 if (instr_is_comptime(var_ptr) && var->mem_slot_index != SIZE_MAX) {15731 if (instr_is_comptime(var_ptr) && var->mem_slot_index != SIZE_MAX) {
15739 assert(var->mem_slot_index < ira->exec_context.mem_slot_list.length);15732 assert(var->mem_slot_index < ira->exec_context.mem_slot_list.length);
15740 ZigValue *mem_slot = ira->exec_context.mem_slot_list.at(var->mem_slot_index);15733 ZigValue *mem_slot = ira->exec_context.mem_slot_list.at(var->mem_slot_index);
15741 copy_const_val(mem_slot, init_val, !is_comptime_var || var->gen_is_const);15734 copy_const_val(mem_slot, init_val);
1574215735
15743 if (is_comptime_var || (var_class_requires_const && var->gen_is_const)) {15736 if (is_comptime_var || (var_class_requires_const && var->gen_is_const)) {
15744 return ir_const_void(ira, &decl_var_instruction->base);15737 return ir_const_void(ira, &decl_var_instruction->base);
...@@ -16217,8 +16210,8 @@ static IrInstruction *ir_resolve_result_raw(IrAnalyze *ira, IrInstruction *suspe...@@ -16217,8 +16210,8 @@ static IrInstruction *ir_resolve_result_raw(IrAnalyze *ira, IrInstruction *suspe
16217 }16210 }
16218 IrInstruction *alloca_gen;16211 IrInstruction *alloca_gen;
16219 if (is_comptime && value != nullptr) {16212 if (is_comptime && value != nullptr) {
16220 if (align > value->value->global_refs->align) {16213 if (align > value->value->llvm_align) {
16221 value->value->global_refs->align = align;16214 value->value->llvm_align = align;
16222 }16215 }
16223 alloca_gen = ir_get_ref(ira, result_loc->source_instruction, value, true, false);16216 alloca_gen = ir_get_ref(ira, result_loc->source_instruction, value, true, false);
16224 } else {16217 } else {
...@@ -16782,7 +16775,7 @@ static bool ir_analyze_fn_call_generic_arg(IrAnalyze *ira, AstNode *fn_proto_nod...@@ -16782,7 +16775,7 @@ static bool ir_analyze_fn_call_generic_arg(IrAnalyze *ira, AstNode *fn_proto_nod
16782 arg_val = create_const_runtime(casted_arg->value->type);16775 arg_val = create_const_runtime(casted_arg->value->type);
16783 }16776 }
16784 if (arg_part_of_generic_id) {16777 if (arg_part_of_generic_id) {
16785 copy_const_val(&generic_id->params[generic_id->param_count], arg_val, true);16778 copy_const_val(&generic_id->params[generic_id->param_count], arg_val);
16786 generic_id->param_count += 1;16779 generic_id->param_count += 1;
16787 }16780 }
1678816781
...@@ -16963,7 +16956,7 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source...@@ -16963,7 +16956,7 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source
16963 IrInstruction *casted_ptr;16956 IrInstruction *casted_ptr;
16964 if (instr_is_comptime(ptr)) {16957 if (instr_is_comptime(ptr)) {
16965 casted_ptr = ir_const(ira, source_instr, struct_ptr_type);16958 casted_ptr = ir_const(ira, source_instr, struct_ptr_type);
16966 copy_const_val(casted_ptr->value, ptr->value, false);16959 copy_const_val(casted_ptr->value, ptr->value);
16967 casted_ptr->value->type = struct_ptr_type;16960 casted_ptr->value->type = struct_ptr_type;
16968 } else {16961 } else {
16969 casted_ptr = ir_build_cast(&ira->new_irb, source_instr->scope,16962 casted_ptr = ir_build_cast(&ira->new_irb, source_instr->scope,
...@@ -17026,14 +17019,7 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source...@@ -17026,14 +17019,7 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source
17026 if (dest_val == nullptr)17019 if (dest_val == nullptr)
17027 return ira->codegen->invalid_instruction;17020 return ira->codegen->invalid_instruction;
17028 if (dest_val->special != ConstValSpecialRuntime) {17021 if (dest_val->special != ConstValSpecialRuntime) {
17029 // TODO this allows a value stored to have the original value modified and then17022 copy_const_val(dest_val, value->value);
17030 // have that affect what should be a copy. We need some kind of advanced copy-on-write
17031 // system to make these two tests pass at the same time:
17032 // * "string literal used as comptime slice is memoized"
17033 // * "comptime modification of const struct field" - except modified to avoid
17034 // ConstPtrMutComptimeVar, thus defeating the logic below.
17035 bool same_global_refs = ptr->value->data.x_ptr.mut != ConstPtrMutComptimeVar;
17036 copy_const_val(dest_val, value->value, same_global_refs);
17037 if (ptr->value->data.x_ptr.mut == ConstPtrMutComptimeVar &&17023 if (ptr->value->data.x_ptr.mut == ConstPtrMutComptimeVar &&
17038 !ira->new_irb.current_basic_block->must_be_comptime_source_instr)17024 !ira->new_irb.current_basic_block->must_be_comptime_source_instr)
17039 {17025 {
...@@ -17308,7 +17294,7 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c...@@ -17308,7 +17294,7 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c
17308 }17294 }
1730917295
17310 IrInstruction *new_instruction = ir_const(ira, &call_instruction->base, result->type);17296 IrInstruction *new_instruction = ir_const(ira, &call_instruction->base, result->type);
17311 copy_const_val(new_instruction->value, result, true);17297 copy_const_val(new_instruction->value, result);
17312 new_instruction->value->type = return_type;17298 new_instruction->value->type = return_type;
17313 return ir_finish_anal(ira, new_instruction);17299 return ir_finish_anal(ira, new_instruction);
17314 }17300 }
...@@ -17465,7 +17451,7 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c...@@ -17465,7 +17451,7 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c
17465 nullptr, UndefBad);17451 nullptr, UndefBad);
17466 IrInstructionConst *const_instruction = ir_create_instruction<IrInstructionConst>(&ira->new_irb,17452 IrInstructionConst *const_instruction = ir_create_instruction<IrInstructionConst>(&ira->new_irb,
17467 impl_fn->child_scope, fn_proto_node->data.fn_proto.align_expr);17453 impl_fn->child_scope, fn_proto_node->data.fn_proto.align_expr);
17468 copy_const_val(const_instruction->base.value, align_result, true);17454 copy_const_val(const_instruction->base.value, align_result);
1746917455
17470 uint32_t align_bytes = 0;17456 uint32_t align_bytes = 0;
17471 ir_resolve_align(ira, &const_instruction->base, nullptr, &align_bytes);17457 ir_resolve_align(ira, &const_instruction->base, nullptr, &align_bytes);
...@@ -17795,7 +17781,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source...@@ -17795,7 +17781,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source
1779517781
17796 if (dst_size <= src_size) {17782 if (dst_size <= src_size) {
17797 if (src_size == dst_size && types_have_same_zig_comptime_repr(codegen, out_val->type, pointee->type)) {17783 if (src_size == dst_size && types_have_same_zig_comptime_repr(codegen, out_val->type, pointee->type)) {
17798 copy_const_val(out_val, pointee, ptr_val->data.x_ptr.mut != ConstPtrMutComptimeVar);17784 copy_const_val(out_val, pointee);
17799 return ErrorNone;17785 return ErrorNone;
17800 }17786 }
17801 Buf buf = BUF_INIT;17787 Buf buf = BUF_INIT;
...@@ -18158,7 +18144,7 @@ static IrInstruction *ir_analyze_instruction_phi(IrAnalyze *ira, IrInstructionPh...@@ -18158,7 +18144,7 @@ static IrInstruction *ir_analyze_instruction_phi(IrAnalyze *ira, IrInstructionPh
1815818144
18159 if (value->value->special != ConstValSpecialRuntime) {18145 if (value->value->special != ConstValSpecialRuntime) {
18160 IrInstruction *result = ir_const(ira, &phi_instruction->base, nullptr);18146 IrInstruction *result = ir_const(ira, &phi_instruction->base, nullptr);
18161 copy_const_val(result->value, value->value, true);18147 copy_const_val(result->value, value->value);
18162 return result;18148 return result;
18163 } else {18149 } else {
18164 return value;18150 return value;
...@@ -18551,7 +18537,7 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct...@@ -18551,7 +18537,7 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct
18551 if (index == array_len && array_type->data.array.sentinel != nullptr) {18537 if (index == array_len && array_type->data.array.sentinel != nullptr) {
18552 ZigType *elem_type = array_type->data.array.child_type;18538 ZigType *elem_type = array_type->data.array.child_type;
18553 IrInstruction *sentinel_elem = ir_const(ira, &elem_ptr_instruction->base, elem_type);18539 IrInstruction *sentinel_elem = ir_const(ira, &elem_ptr_instruction->base, elem_type);
18554 copy_const_val(sentinel_elem->value, array_type->data.array.sentinel, false);18540 copy_const_val(sentinel_elem->value, array_type->data.array.sentinel);
18555 return ir_get_ref(ira, &elem_ptr_instruction->base, sentinel_elem, true, false);18541 return ir_get_ref(ira, &elem_ptr_instruction->base, sentinel_elem, true, false);
18556 }18542 }
18557 if (index >= array_len) {18543 if (index >= array_len) {
...@@ -19042,7 +19028,7 @@ static IrInstruction *ir_analyze_inferred_field_ptr(IrAnalyze *ira, Buf *field_n...@@ -19042,7 +19028,7 @@ static IrInstruction *ir_analyze_inferred_field_ptr(IrAnalyze *ira, Buf *field_n
1904219028
19043 if (instr_is_comptime(container_ptr)) {19029 if (instr_is_comptime(container_ptr)) {
19044 IrInstruction *result = ir_const(ira, source_instr, field_ptr_type);19030 IrInstruction *result = ir_const(ira, source_instr, field_ptr_type);
19045 copy_const_val(result->value, container_ptr->value, false);19031 copy_const_val(result->value, container_ptr->value);
19046 result->value->type = field_ptr_type;19032 result->value->type = field_ptr_type;
19047 return result;19033 return result;
19048 }19034 }
...@@ -20474,7 +20460,7 @@ static IrInstruction *ir_analyze_instruction_switch_target(IrAnalyze *ira,...@@ -20474,7 +20460,7 @@ static IrInstruction *ir_analyze_instruction_switch_target(IrAnalyze *ira,
20474 case ZigTypeIdErrorSet: {20460 case ZigTypeIdErrorSet: {
20475 if (pointee_val) {20461 if (pointee_val) {
20476 IrInstruction *result = ir_const(ira, &switch_target_instruction->base, nullptr);20462 IrInstruction *result = ir_const(ira, &switch_target_instruction->base, nullptr);
20477 copy_const_val(result->value, pointee_val, true);20463 copy_const_val(result->value, pointee_val);
20478 result->value->type = target_type;20464 result->value->type = target_type;
20479 return result;20465 return result;
20480 }20466 }
...@@ -20970,7 +20956,7 @@ static IrInstruction *ir_analyze_container_init_fields(IrAnalyze *ira, IrInstruc...@@ -20970,7 +20956,7 @@ static IrInstruction *ir_analyze_container_init_fields(IrAnalyze *ira, IrInstruc
20970 return ira->codegen->invalid_instruction;20956 return ira->codegen->invalid_instruction;
2097120957
20972 IrInstruction *runtime_inst = ir_const(ira, instruction, field->init_val->type);20958 IrInstruction *runtime_inst = ir_const(ira, instruction, field->init_val->type);
20973 copy_const_val(runtime_inst->value, field->init_val, true);20959 copy_const_val(runtime_inst->value, field->init_val);
2097420960
20975 IrInstruction *field_ptr = ir_analyze_struct_field_ptr(ira, instruction, field, result_loc,20961 IrInstruction *field_ptr = ir_analyze_struct_field_ptr(ira, instruction, field, result_loc,
20976 container_type, true);20962 container_type, true);
...@@ -21228,7 +21214,7 @@ static IrInstruction *ir_analyze_instruction_err_name(IrAnalyze *ira, IrInstruct...@@ -21228,7 +21214,7 @@ static IrInstruction *ir_analyze_instruction_err_name(IrAnalyze *ira, IrInstruct
21228 err->cached_error_name_val = create_const_slice(ira->codegen, array_val, 0, buf_len(&err->name), true);21214 err->cached_error_name_val = create_const_slice(ira->codegen, array_val, 0, buf_len(&err->name), true);
21229 }21215 }
21230 IrInstruction *result = ir_const(ira, &instruction->base, nullptr);21216 IrInstruction *result = ir_const(ira, &instruction->base, nullptr);
21231 copy_const_val(result->value, err->cached_error_name_val, true);21217 copy_const_val(result->value, err->cached_error_name_val);
21232 result->value->type = str_type;21218 result->value->type = str_type;
21233 return result;21219 return result;
21234 }21220 }
...@@ -22665,7 +22651,7 @@ static IrInstruction *ir_analyze_instruction_type_name(IrAnalyze *ira, IrInstruc...@@ -22665,7 +22651,7 @@ static IrInstruction *ir_analyze_instruction_type_name(IrAnalyze *ira, IrInstruc
22665 type_entry->cached_const_name_val = create_const_str_lit(ira->codegen, type_bare_name(type_entry));22651 type_entry->cached_const_name_val = create_const_str_lit(ira->codegen, type_bare_name(type_entry));
22666 }22652 }
22667 IrInstruction *result = ir_const(ira, &instruction->base, nullptr);22653 IrInstruction *result = ir_const(ira, &instruction->base, nullptr);
22668 copy_const_val(result->value, type_entry->cached_const_name_val, true);22654 copy_const_val(result->value, type_entry->cached_const_name_val);
22669 return result;22655 return result;
22670}22656}
2267122657
...@@ -23365,7 +23351,7 @@ static IrInstruction *ir_analyze_instruction_to_bytes(IrAnalyze *ira, IrInstruct...@@ -23365,7 +23351,7 @@ static IrInstruction *ir_analyze_instruction_to_bytes(IrAnalyze *ira, IrInstruct
2336523351
23366 ZigValue *ptr_val = result->value->data.x_struct.fields[slice_ptr_index];23352 ZigValue *ptr_val = result->value->data.x_struct.fields[slice_ptr_index];
23367 ZigValue *target_ptr_val = target_val->data.x_struct.fields[slice_ptr_index];23353 ZigValue *target_ptr_val = target_val->data.x_struct.fields[slice_ptr_index];
23368 copy_const_val(ptr_val, target_ptr_val, false);23354 copy_const_val(ptr_val, target_ptr_val);
23369 ptr_val->type = dest_ptr_type;23355 ptr_val->type = dest_ptr_type;
2337023356
23371 ZigValue *len_val = result->value->data.x_struct.fields[slice_len_index];23357 ZigValue *len_val = result->value->data.x_struct.fields[slice_len_index];
...@@ -23658,7 +23644,7 @@ static IrInstruction *ir_analyze_shuffle_vector(IrAnalyze *ira, IrInstruction *s...@@ -23658,7 +23644,7 @@ static IrInstruction *ir_analyze_shuffle_vector(IrAnalyze *ira, IrInstruction *s
23658 ZigValue *src_elem_val = (v >= 0) ?23644 ZigValue *src_elem_val = (v >= 0) ?
23659 &a->value->data.x_array.data.s_none.elements[v] :23645 &a->value->data.x_array.data.s_none.elements[v] :
23660 &b->value->data.x_array.data.s_none.elements[~v];23646 &b->value->data.x_array.data.s_none.elements[~v];
23661 copy_const_val(result_elem_val, src_elem_val, false);23647 copy_const_val(result_elem_val, src_elem_val);
2366223648
23663 ir_assert(result_elem_val->special == ConstValSpecialStatic, source_instr);23649 ir_assert(result_elem_val->special == ConstValSpecialStatic, source_instr);
23664 }23650 }
...@@ -23753,7 +23739,7 @@ static IrInstruction *ir_analyze_instruction_splat(IrAnalyze *ira, IrInstruction...@@ -23753,7 +23739,7 @@ static IrInstruction *ir_analyze_instruction_splat(IrAnalyze *ira, IrInstruction
23753 IrInstruction *result = ir_const(ira, &instruction->base, return_type);23739 IrInstruction *result = ir_const(ira, &instruction->base, return_type);
23754 result->value->data.x_array.data.s_none.elements = create_const_vals(len_int);23740 result->value->data.x_array.data.s_none.elements = create_const_vals(len_int);
23755 for (uint32_t i = 0; i < len_int; i += 1) {23741 for (uint32_t i = 0; i < len_int; i += 1) {
23756 copy_const_val(&result->value->data.x_array.data.s_none.elements[i], scalar_val, false);23742 copy_const_val(&result->value->data.x_array.data.s_none.elements[i], scalar_val);
23757 }23743 }
23758 return result;23744 return result;
23759 }23745 }
...@@ -23894,7 +23880,7 @@ static IrInstruction *ir_analyze_instruction_memset(IrAnalyze *ira, IrInstructio...@@ -23894,7 +23880,7 @@ static IrInstruction *ir_analyze_instruction_memset(IrAnalyze *ira, IrInstructio
23894 }23880 }
2389523881
23896 for (size_t i = start; i < end; i += 1) {23882 for (size_t i = start; i < end; i += 1) {
23897 copy_const_val(&dest_elements[i], byte_val, true);23883 copy_const_val(&dest_elements[i], byte_val);
23898 }23884 }
2389923885
23900 return ir_const_void(ira, &instruction->base);23886 return ir_const_void(ira, &instruction->base);
...@@ -24073,7 +24059,7 @@ static IrInstruction *ir_analyze_instruction_memcpy(IrAnalyze *ira, IrInstructio...@@ -24073,7 +24059,7 @@ static IrInstruction *ir_analyze_instruction_memcpy(IrAnalyze *ira, IrInstructio
24073 // TODO check for noalias violations - this should be generalized to work for any function24059 // TODO check for noalias violations - this should be generalized to work for any function
2407424060
24075 for (size_t i = 0; i < count; i += 1) {24061 for (size_t i = 0; i < count; i += 1) {
24076 copy_const_val(&dest_elements[dest_start + i], &src_elements[src_start + i], true);24062 copy_const_val(&dest_elements[dest_start + i], &src_elements[src_start + i]);
24077 }24063 }
2407824064
24079 return ir_const_void(ira, &instruction->base);24065 return ir_const_void(ira, &instruction->base);
...@@ -25515,7 +25501,7 @@ static IrInstruction *ir_align_cast(IrAnalyze *ira, IrInstruction *target, uint3...@@ -25515,7 +25501,7 @@ static IrInstruction *ir_align_cast(IrAnalyze *ira, IrInstruction *target, uint3
25515 }25501 }
2551625502
25517 IrInstruction *result = ir_const(ira, target, result_type);25503 IrInstruction *result = ir_const(ira, target, result_type);
25518 copy_const_val(result->value, val, true);25504 copy_const_val(result->value, val);
25519 result->value->type = result_type;25505 result->value->type = result_type;
25520 return result;25506 return result;
25521 }25507 }
...@@ -25597,7 +25583,7 @@ static IrInstruction *ir_analyze_ptr_cast(IrAnalyze *ira, IrInstruction *source_...@@ -25597,7 +25583,7 @@ static IrInstruction *ir_analyze_ptr_cast(IrAnalyze *ira, IrInstruction *source_
25597 } else {25583 } else {
25598 result = ir_const(ira, source_instr, dest_type);25584 result = ir_const(ira, source_instr, dest_type);
25599 }25585 }
25600 copy_const_val(result->value, val, true);25586 copy_const_val(result->value, val);
25601 result->value->type = dest_type;25587 result->value->type = dest_type;
2560225588
25603 // Keep the bigger alignment, it can only help-25589 // Keep the bigger alignment, it can only help-
test/stage1/behavior/bugs/1607.zig+2-2
...@@ -10,6 +10,6 @@ fn checkAddress(s: []const u8) void {...@@ -10,6 +10,6 @@ fn checkAddress(s: []const u8) void {
10}10}
1111
12test "slices pointing at the same address as global array." {12test "slices pointing at the same address as global array." {
13 checkAddress(a);13 checkAddress(&a);
14 comptime checkAddress(a);14 comptime checkAddress(&a);
15}15}
test/stage1/behavior/struct.zig+1-1
...@@ -783,7 +783,7 @@ test "struct with var field" {...@@ -783,7 +783,7 @@ test "struct with var field" {
783 x: var,783 x: var,
784 y: var,784 y: var,
785 };785 };
786 const pt = Point {786 const pt = Point{
787 .x = 1,787 .x = 1,
788 .y = 2,788 .y = 2,
789 };789 };