authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-01 09:58:32-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-01 09:58:32-05:00
log78811ff4acf6d05ae9e6d9acafe58f40ae3ae952
treec8fd7b39f969c342cf2cc4cb5001d45bfd3914a8
parentb36c07a95a6cf9b2cc120133b44cbd0673e6823a
parentb5df18c8fd725a2993c520ddc8777ecad71e3d11
signaturelock-open Commit is signed but in an unrecognized format.

Merge remote-tracking branch 'origin/kill-ConstGlobalRefs' into remove-array-type-coercion


4 files changed, 100 insertions(+), 161 deletions(-)

src/all_types.hpp+3-7
......@@ -313,12 +313,6 @@ struct RuntimeHintSlice {
313313 uint64_t len;
314314};
315315
316struct ConstGlobalRefs {
317 LLVMValueRef llvm_value;
318 LLVMValueRef llvm_global;
319 uint32_t align;
320};
321
322316enum LazyValueId {
323317 LazyValueIdInvalid,
324318 LazyValueIdAlignOf,
......@@ -409,8 +403,10 @@ struct LazyValueErrUnionType {
409403struct ZigValue {
410404 ZigType *type;
411405 ConstValSpecial special;
406 uint32_t llvm_align;
412407 ConstParent parent;
413 ConstGlobalRefs *global_refs;
408 LLVMValueRef llvm_value;
409 LLVMValueRef llvm_global;
414410
415411 union {
416412 // populated if special == ConstValSpecialStatic
src/analyze.cpp+6-23
......@@ -5909,12 +5909,7 @@ ZigValue *create_const_arg_tuple(CodeGen *g, size_t arg_index_start, size_t arg_
59095909
59105910
59115911ZigValue *create_const_vals(size_t count) {
5912 ConstGlobalRefs *global_refs = allocate<ConstGlobalRefs>(count, "ConstGlobalRefs");
5913 ZigValue *vals = allocate<ZigValue>(count, "ZigValue");
5914 for (size_t i = 0; i < count; i += 1) {
5915 vals[i].global_refs = &global_refs[i];
5916 }
5917 return vals;
5912 return allocate<ZigValue>(count, "ZigValue");
59185913}
59195914
59205915ZigValue **alloc_const_vals_ptrs(size_t count) {
......@@ -6492,20 +6487,14 @@ bool const_values_equal_ptr(ZigValue *a, ZigValue *b) {
64926487 return false;
64936488 return true;
64946489 case ConstPtrSpecialBaseArray:
6495 if (a->data.x_ptr.data.base_array.array_val != b->data.x_ptr.data.base_array.array_val &&
6496 a->data.x_ptr.data.base_array.array_val->global_refs !=
6497 b->data.x_ptr.data.base_array.array_val->global_refs)
6498 {
6490 if (a->data.x_ptr.data.base_array.array_val != b->data.x_ptr.data.base_array.array_val) {
64996491 return false;
65006492 }
65016493 if (a->data.x_ptr.data.base_array.elem_index != b->data.x_ptr.data.base_array.elem_index)
65026494 return false;
65036495 return true;
65046496 case ConstPtrSpecialBaseStruct:
6505 if (a->data.x_ptr.data.base_struct.struct_val != b->data.x_ptr.data.base_struct.struct_val &&
6506 a->data.x_ptr.data.base_struct.struct_val->global_refs !=
6507 b->data.x_ptr.data.base_struct.struct_val->global_refs)
6508 {
6497 if (a->data.x_ptr.data.base_struct.struct_val != b->data.x_ptr.data.base_struct.struct_val) {
65096498 return false;
65106499 }
65116500 if (a->data.x_ptr.data.base_struct.field_index != b->data.x_ptr.data.base_struct.field_index)
......@@ -6513,27 +6502,21 @@ bool const_values_equal_ptr(ZigValue *a, ZigValue *b) {
65136502 return true;
65146503 case ConstPtrSpecialBaseErrorUnionCode:
65156504 if (a->data.x_ptr.data.base_err_union_code.err_union_val !=
6516 b->data.x_ptr.data.base_err_union_code.err_union_val &&
6517 a->data.x_ptr.data.base_err_union_code.err_union_val->global_refs !=
6518 b->data.x_ptr.data.base_err_union_code.err_union_val->global_refs)
6505 b->data.x_ptr.data.base_err_union_code.err_union_val)
65196506 {
65206507 return false;
65216508 }
65226509 return true;
65236510 case ConstPtrSpecialBaseErrorUnionPayload:
65246511 if (a->data.x_ptr.data.base_err_union_payload.err_union_val !=
6525 b->data.x_ptr.data.base_err_union_payload.err_union_val &&
6526 a->data.x_ptr.data.base_err_union_payload.err_union_val->global_refs !=
6527 b->data.x_ptr.data.base_err_union_payload.err_union_val->global_refs)
6512 b->data.x_ptr.data.base_err_union_payload.err_union_val)
65286513 {
65296514 return false;
65306515 }
65316516 return true;
65326517 case ConstPtrSpecialBaseOptionalPayload:
65336518 if (a->data.x_ptr.data.base_optional_payload.optional_val !=
6534 b->data.x_ptr.data.base_optional_payload.optional_val &&
6535 a->data.x_ptr.data.base_optional_payload.optional_val->global_refs !=
6536 b->data.x_ptr.data.base_optional_payload.optional_val->global_refs)
6519 b->data.x_ptr.data.base_optional_payload.optional_val)
65376520 {
65386521 return false;
65396522 }
src/codegen.cpp+42-68
......@@ -946,7 +946,7 @@ static Buf *panic_msg_buf(PanicMsgId msg_id) {
946946
947947static LLVMValueRef get_panic_msg_ptr_val(CodeGen *g, PanicMsgId msg_id) {
948948 ZigValue *val = &g->panic_msg_vals[msg_id];
949 if (!val->global_refs->llvm_global) {
949 if (!val->llvm_global) {
950950
951951 Buf *buf_msg = panic_msg_buf(msg_id);
952952 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) {
955955 render_const_val(g, val, "");
956956 render_const_val_global(g, val, "");
957957
958 assert(val->global_refs->llvm_global);
958 assert(val->llvm_global);
959959 }
960960
961961 ZigType *u8_ptr_type = get_pointer_to_type_extra(g, g->builtin_types.entry_u8, true, false,
962962 PtrLenUnknown, get_abi_alignment(g, g->builtin_types.entry_u8), 0, 0, false);
963963 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));
965965}
966966
967967static ZigType *ptr_to_stack_trace_type(CodeGen *g) {
......@@ -1727,9 +1727,9 @@ static LLVMValueRef ir_llvm_value(CodeGen *g, IrInstruction *instruction) {
17271727 if (handle_is_ptr(instruction->value->type)) {
17281728 render_const_val_global(g, instruction->value, "");
17291729 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), "");
17311731 } 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,
17331733 get_llvm_type(g, instruction->value->type), "");
17341734 }
17351735 assert(instruction->llvm_value);
......@@ -6374,7 +6374,7 @@ static LLVMValueRef gen_parent_ptr(CodeGen *g, ZigValue *val, ConstParent *paren
63746374 case ConstParentIdNone:
63756375 render_const_val(g, val, "");
63766376 render_const_val_global(g, val, "");
6377 return val->global_refs->llvm_global;
6377 return val->llvm_global;
63786378 case ConstParentIdStruct:
63796379 return gen_const_ptr_struct_recursive(g, parent->data.p_struct.struct_val,
63806380 parent->data.p_struct.field_index);
......@@ -6392,7 +6392,7 @@ static LLVMValueRef gen_parent_ptr(CodeGen *g, ZigValue *val, ConstParent *paren
63926392 case ConstParentIdScalar:
63936393 render_const_val(g, parent->data.p_scalar.scalar_val, "");
63946394 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;
63966396 }
63976397 zig_unreachable();
63986398}
......@@ -6623,17 +6623,15 @@ static LLVMValueRef gen_const_val_ptr(CodeGen *g, ZigValue *const_val, const cha
66236623 zig_unreachable();
66246624 case ConstPtrSpecialRef:
66256625 {
6626 assert(const_val->global_refs != nullptr);
66276626 ZigValue *pointee = const_val->data.x_ptr.data.ref.pointee;
66286627 render_const_val(g, pointee, "");
66296628 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,
66316630 get_llvm_type(g, const_val->type));
6632 return const_val->global_refs->llvm_value;
6631 return const_val->llvm_value;
66336632 }
66346633 case ConstPtrSpecialBaseArray:
66356634 {
6636 assert(const_val->global_refs != nullptr);
66376635 ZigValue *array_const_val = const_val->data.x_ptr.data.base_array.array_val;
66386636 assert(array_const_val->type->id == ZigTypeIdArray);
66396637 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
66416639 ZigValue *pointee = array_const_val->type->data.array.sentinel;
66426640 render_const_val(g, pointee, "");
66436641 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,
66456643 get_llvm_type(g, const_val->type));
6646 return const_val->global_refs->llvm_value;
6644 return const_val->llvm_value;
66476645 } else {
66486646 // make this a null pointer
66496647 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),
66516649 get_llvm_type(g, const_val->type));
6652 return const_val->global_refs->llvm_value;
6650 return const_val->llvm_value;
66536651 }
66546652 }
66556653 size_t elem_index = const_val->data.x_ptr.data.base_array.elem_index;
66566654 LLVMValueRef uncasted_ptr_val = gen_const_ptr_array_recursive(g, array_const_val, elem_index);
66576655 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;
66596657 return ptr_val;
66606658 }
66616659 case ConstPtrSpecialBaseStruct:
66626660 {
6663 assert(const_val->global_refs != nullptr);
66646661 ZigValue *struct_const_val = const_val->data.x_ptr.data.base_struct.struct_val;
66656662 assert(struct_const_val->type->id == ZigTypeIdStruct);
66666663 if (!type_has_bits(struct_const_val->type)) {
66676664 // make this a null pointer
66686665 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),
66706667 get_llvm_type(g, const_val->type));
6671 return const_val->global_refs->llvm_value;
6668 return const_val->llvm_value;
66726669 }
66736670 size_t src_field_index = const_val->data.x_ptr.data.base_struct.field_index;
66746671 size_t gen_field_index = struct_const_val->type->data.structure.fields[src_field_index]->gen_index;
66756672 LLVMValueRef uncasted_ptr_val = gen_const_ptr_struct_recursive(g, struct_const_val,
66766673 gen_field_index);
66776674 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;
66796676 return ptr_val;
66806677 }
66816678 case ConstPtrSpecialBaseErrorUnionCode:
66826679 {
6683 assert(const_val->global_refs != nullptr);
66846680 ZigValue *err_union_const_val = const_val->data.x_ptr.data.base_err_union_code.err_union_val;
66856681 assert(err_union_const_val->type->id == ZigTypeIdErrorUnion);
66866682 if (!type_has_bits(err_union_const_val->type)) {
66876683 // make this a null pointer
66886684 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),
66906686 get_llvm_type(g, const_val->type));
6691 return const_val->global_refs->llvm_value;
6687 return const_val->llvm_value;
66926688 }
66936689 LLVMValueRef uncasted_ptr_val = gen_const_ptr_err_union_code_recursive(g, err_union_const_val);
66946690 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;
66966692 return ptr_val;
66976693 }
66986694 case ConstPtrSpecialBaseErrorUnionPayload:
66996695 {
6700 assert(const_val->global_refs != nullptr);
67016696 ZigValue *err_union_const_val = const_val->data.x_ptr.data.base_err_union_payload.err_union_val;
67026697 assert(err_union_const_val->type->id == ZigTypeIdErrorUnion);
67036698 if (!type_has_bits(err_union_const_val->type)) {
67046699 // make this a null pointer
67056700 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),
67076702 get_llvm_type(g, const_val->type));
6708 return const_val->global_refs->llvm_value;
6703 return const_val->llvm_value;
67096704 }
67106705 LLVMValueRef uncasted_ptr_val = gen_const_ptr_err_union_payload_recursive(g, err_union_const_val);
67116706 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;
67136708 return ptr_val;
67146709 }
67156710 case ConstPtrSpecialBaseOptionalPayload:
67166711 {
6717 assert(const_val->global_refs != nullptr);
67186712 ZigValue *optional_const_val = const_val->data.x_ptr.data.base_optional_payload.optional_val;
67196713 assert(optional_const_val->type->id == ZigTypeIdOptional);
67206714 if (!type_has_bits(optional_const_val->type)) {
67216715 // make this a null pointer
67226716 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),
67246718 get_llvm_type(g, const_val->type));
6725 return const_val->global_refs->llvm_value;
6719 return const_val->llvm_value;
67266720 }
67276721 LLVMValueRef uncasted_ptr_val = gen_const_ptr_optional_payload_recursive(g, optional_const_val);
67286722 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;
67306724 return ptr_val;
67316725 }
67326726 case ConstPtrSpecialHardCodedAddr:
67336727 {
6734 assert(const_val->global_refs != nullptr);
67356728 uint64_t addr_value = const_val->data.x_ptr.data.hard_coded_addr.addr;
67366729 ZigType *usize = g->builtin_types.entry_usize;
6737 const_val->global_refs->llvm_value = LLVMConstIntToPtr(
6730 const_val->llvm_value = LLVMConstIntToPtr(
67386731 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;
67406733 }
67416734 case ConstPtrSpecialFunction:
67426735 return LLVMConstBitCast(fn_llvm_value(g, const_val->data.x_ptr.data.fn.fn_entry),
......@@ -7175,34 +7168,29 @@ check: switch (const_val->special) {
71757168}
71767169
71777170static void render_const_val(CodeGen *g, ZigValue *const_val, const char *name) {
7178 if (!const_val->global_refs)
7179 const_val->global_refs = allocate<ConstGlobalRefs>(1);
7180 if (!const_val->global_refs->llvm_value)
7181 const_val->global_refs->llvm_value = gen_const_val(g, const_val, name);
7171 if (!const_val->llvm_value)
7172 const_val->llvm_value = gen_const_val(g, const_val, name);
71827173
7183 if (const_val->global_refs->llvm_global)
7184 LLVMSetInitializer(const_val->global_refs->llvm_global, const_val->global_refs->llvm_value);
7174 if (const_val->llvm_global)
7175 LLVMSetInitializer(const_val->llvm_global, const_val->llvm_value);
71857176}
71867177
71877178static void render_const_val_global(CodeGen *g, ZigValue *const_val, const char *name) {
7188 if (!const_val->global_refs)
7189 const_val->global_refs = allocate<ConstGlobalRefs>(1);
7190
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);
7179 if (!const_val->llvm_global) {
7180 LLVMTypeRef type_ref = const_val->llvm_value ?
7181 LLVMTypeOf(const_val->llvm_value) : get_llvm_type(g, const_val->type);
71947182 LLVMValueRef global_value = LLVMAddGlobal(g->module, type_ref, name);
71957183 LLVMSetLinkage(global_value, LLVMInternalLinkage);
71967184 LLVMSetGlobalConstant(global_value, true);
71977185 LLVMSetUnnamedAddr(global_value, true);
7198 LLVMSetAlignment(global_value, (const_val->global_refs->align == 0) ?
7199 get_abi_alignment(g, const_val->type) : const_val->global_refs->align);
7186 LLVMSetAlignment(global_value, (const_val->llvm_align == 0) ?
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;
72027190 }
72037191
7204 if (const_val->global_refs->llvm_value)
7205 LLVMSetInitializer(const_val->global_refs->llvm_global, const_val->global_refs->llvm_value);
7192 if (const_val->llvm_value)
7193 LLVMSetInitializer(const_val->llvm_global, const_val->llvm_value);
72067194}
72077195
72087196static void generate_error_name_table(CodeGen *g) {
......@@ -7403,7 +7391,7 @@ static void do_code_gen(CodeGen *g) {
74037391 bool exported = (linkage != GlobalLinkageIdInternal);
74047392 render_const_val(g, var->const_value, symbol_name);
74057393 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
74087396 if (exported) {
74097397 LLVMSetLinkage(global_value, to_llvm_linkage(linkage));
......@@ -7418,7 +7406,7 @@ static void do_code_gen(CodeGen *g) {
74187406 // Here we use const_value->type because that's the type of the llvm global,
74197407 // which we const ptr cast upon use to whatever it needs to be.
74207408 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);
74227410 }
74237411
74247412 LLVMSetGlobalConstant(global_value, var->gen_is_const);
......@@ -8012,31 +8000,26 @@ static void define_intern_values(CodeGen *g) {
80128000 {
80138001 auto& value = g->intern.x_undefined;
80148002 value.type = g->builtin_types.entry_undef;
8015 value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.undefined");
80168003 value.special = ConstValSpecialStatic;
80178004 }
80188005 {
80198006 auto& value = g->intern.x_void;
80208007 value.type = g->builtin_types.entry_void;
8021 value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.void");
80228008 value.special = ConstValSpecialStatic;
80238009 }
80248010 {
80258011 auto& value = g->intern.x_null;
80268012 value.type = g->builtin_types.entry_null;
8027 value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.null");
80288013 value.special = ConstValSpecialStatic;
80298014 }
80308015 {
80318016 auto& value = g->intern.x_unreachable;
80328017 value.type = g->builtin_types.entry_unreachable;
8033 value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.unreachable");
80348018 value.special = ConstValSpecialStatic;
80358019 }
80368020 {
80378021 auto& value = g->intern.zero_byte;
80388022 value.type = g->builtin_types.entry_u8;
8039 value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.zero_byte");
80408023 value.special = ConstValSpecialStatic;
80418024 bigint_init_unsigned(&value.data.x_bigint, 0);
80428025 }
......@@ -8669,19 +8652,10 @@ static void init(CodeGen *g) {
86698652 g->invalid_instruction = &sentinel_instructions[0];
86708653 g->invalid_instruction->value = allocate<ZigValue>(1, "ZigValue");
86718654 g->invalid_instruction->value->type = g->builtin_types.entry_invalid;
8672 g->invalid_instruction->value->global_refs = allocate<ConstGlobalRefs>(1);
86738655
86748656 g->unreach_instruction = &sentinel_instructions[1];
86758657 g->unreach_instruction->value = allocate<ZigValue>(1, "ZigValue");
86768658 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
86868660 define_builtin_fns(g);
86878661 Error err;
src/ir.cpp+49-63
......@@ -223,7 +223,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source
223223static IrInstruction *ir_analyze_ptr_cast(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *ptr,
224224 ZigType *dest_type, IrInstruction *dest_type_src, bool safety_check_on);
225225static ZigValue *ir_resolve_const(IrAnalyze *ira, IrInstruction *value, UndefAllowed undef_allowed);
226static void copy_const_val(ZigValue *dest, ZigValue *src, bool same_global_refs);
226static void copy_const_val(ZigValue *dest, ZigValue *src);
227227static Error resolve_ptr_align(IrAnalyze *ira, ZigType *ty, uint32_t *result_align);
228228static IrInstruction *ir_analyze_int_to_ptr(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *target,
229229 ZigType *ptr_type);
......@@ -1545,7 +1545,6 @@ static T *ir_create_instruction(IrBuilder *irb, Scope *scope, AstNode *source_no
15451545 special_instruction->base.debug_id = exec_next_debug_id(irb->exec);
15461546 special_instruction->base.owner_bb = irb->current_basic_block;
15471547 special_instruction->base.value = allocate<ZigValue>(1, "ZigValue");
1548 special_instruction->base.value->global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs");
15491548 return special_instruction;
15501549}
15511550
......@@ -9122,7 +9121,7 @@ static Error eval_comptime_ptr_reinterpret(IrAnalyze *ira, CodeGen *codegen, Ast
91229121 if ((err = ir_read_const_ptr(ira, codegen, source_node, &tmp, ptr_val)))
91239122 return err;
91249123 ZigValue *child_val = const_ptr_pointee_unchecked(codegen, ptr_val);
9125 copy_const_val(child_val, &tmp, false);
9124 copy_const_val(child_val, &tmp);
91269125 return ErrorNone;
91279126}
91289127
......@@ -11348,18 +11347,14 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
1134811347 }
1134911348}
1135011349
11351static void copy_const_val(ZigValue *dest, ZigValue *src, bool same_global_refs) {
11352 ConstGlobalRefs *global_refs = dest->global_refs;
11350static void copy_const_val(ZigValue *dest, ZigValue *src) {
1135311351 memcpy(dest, src, sizeof(ZigValue));
11354 if (!same_global_refs) {
11355 dest->global_refs = global_refs;
11356 if (src->special != ConstValSpecialStatic)
11357 return;
11358 if (dest->type->id == ZigTypeIdStruct) {
11359 dest->data.x_struct.fields = alloc_const_vals_ptrs(dest->type->data.structure.src_field_count);
11360 for (size_t i = 0; i < dest->type->data.structure.src_field_count; i += 1) {
11361 copy_const_val(dest->data.x_struct.fields[i], src->data.x_struct.fields[i], false);
11362 }
11352 if (src->special != ConstValSpecialStatic)
11353 return;
11354 if (dest->type->id == ZigTypeIdStruct) {
11355 dest->data.x_struct.fields = alloc_const_vals_ptrs(dest->type->data.structure.src_field_count);
11356 for (size_t i = 0; i < dest->type->data.structure.src_field_count; i += 1) {
11357 copy_const_val(dest->data.x_struct.fields[i], src->data.x_struct.fields[i]);
1136311358 }
1136411359 }
1136511360}
......@@ -11378,13 +11373,11 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInstruction *source_
1137811373 case CastOpErrSet:
1137911374 case CastOpBitCast:
1138011375 zig_panic("TODO");
11381 case CastOpNoop:
11382 {
11383 bool same_global_refs = other_val->special == ConstValSpecialStatic;
11384 copy_const_val(const_val, other_val, same_global_refs);
11385 const_val->type = new_type;
11386 break;
11387 }
11376 case CastOpNoop: {
11377 copy_const_val(const_val, other_val);
11378 const_val->type = new_type;
11379 break;
11380 }
1138811381 case CastOpNumLitToConcrete:
1138911382 if (other_val->type->id == ZigTypeIdComptimeFloat) {
1139011383 assert(new_type->id == ZigTypeIdFloat);
......@@ -12105,7 +12098,7 @@ static IrInstruction *ir_analyze_optional_wrap(IrAnalyze *ira, IrInstruction *so
1210512098 source_instr->scope, source_instr->source_node);
1210612099 const_instruction->base.value->special = ConstValSpecialStatic;
1210712100 if (types_have_same_zig_comptime_repr(ira->codegen, wanted_type, payload_type)) {
12108 copy_const_val(const_instruction->base.value, val, val->data.x_ptr.mut == ConstPtrMutComptimeConst);
12101 copy_const_val(const_instruction->base.value, val);
1210912102 } else {
1211012103 const_instruction->base.value->data.x_optional = val;
1211112104 }
......@@ -13063,7 +13056,7 @@ static IrInstruction *ir_analyze_array_to_vector(IrAnalyze *ira, IrInstruction *
1306313056 if (instr_is_comptime(array)) {
1306413057 // arrays and vectors have the same ZigValue representation
1306513058 IrInstruction *result = ir_const(ira, source_instr, vector_type);
13066 copy_const_val(result->value, array->value, false);
13059 copy_const_val(result->value, array->value);
1306713060 result->value->type = vector_type;
1306813061 return result;
1306913062 }
......@@ -13076,7 +13069,7 @@ static IrInstruction *ir_analyze_vector_to_array(IrAnalyze *ira, IrInstruction *
1307613069 if (instr_is_comptime(vector)) {
1307713070 // arrays and vectors have the same ZigValue representation
1307813071 IrInstruction *result = ir_const(ira, source_instr, array_type);
13079 copy_const_val(result->value, vector->value, false);
13072 copy_const_val(result->value, vector->value);
1308013073 result->value->type = array_type;
1308113074 return result;
1308213075 }
......@@ -13364,7 +13357,7 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst
1336413357 if (wanted_type->id == ZigTypeIdComptimeInt || wanted_type->id == ZigTypeIdInt) {
1336513358 IrInstruction *result = ir_const(ira, source_instr, wanted_type);
1336613359 if (actual_type->id == ZigTypeIdComptimeInt || actual_type->id == ZigTypeIdInt) {
13367 copy_const_val(result->value, value->value, false);
13360 copy_const_val(result->value, value->value);
1336813361 result->value->type = wanted_type;
1336913362 } else {
1337013363 float_init_bigint(&result->value->data.x_bigint, value->value);
......@@ -14224,7 +14217,7 @@ static IrInstruction *ir_analyze_instruction_return(IrAnalyze *ira, IrInstructio
1422414217
1422514218static IrInstruction *ir_analyze_instruction_const(IrAnalyze *ira, IrInstructionConst *instruction) {
1422614219 IrInstruction *result = ir_const(ira, &instruction->base, nullptr);
14227 copy_const_val(result->value, instruction->base.value, true);
14220 copy_const_val(result->value, instruction->base.value);
1422814221 return result;
1422914222}
1423014223
......@@ -14763,7 +14756,7 @@ never_mind_just_calculate_it_normally:
1476314756 &op1_val->data.x_array.data.s_none.elements[i],
1476414757 &op2_val->data.x_array.data.s_none.elements[i],
1476514758 bin_op_instruction, op_id, one_possible_value);
14766 copy_const_val(&result->value->data.x_array.data.s_none.elements[i], cur_res->value, false);
14759 copy_const_val(&result->value->data.x_array.data.s_none.elements[i], cur_res->value);
1476714760 }
1476814761 return result;
1476914762 }
......@@ -15629,21 +15622,21 @@ static IrInstruction *ir_analyze_array_cat(IrAnalyze *ira, IrInstructionBinOp *i
1562915622 size_t next_index = 0;
1563015623 for (size_t i = op1_array_index; i < op1_array_end; i += 1, next_index += 1) {
1563115624 ZigValue *elem_dest_val = &out_array_val->data.x_array.data.s_none.elements[next_index];
15632 copy_const_val(elem_dest_val, &op1_array_val->data.x_array.data.s_none.elements[i], false);
15625 copy_const_val(elem_dest_val, &op1_array_val->data.x_array.data.s_none.elements[i]);
1563315626 elem_dest_val->parent.id = ConstParentIdArray;
1563415627 elem_dest_val->parent.data.p_array.array_val = out_array_val;
1563515628 elem_dest_val->parent.data.p_array.elem_index = next_index;
1563615629 }
1563715630 for (size_t i = op2_array_index; i < op2_array_end; i += 1, next_index += 1) {
1563815631 ZigValue *elem_dest_val = &out_array_val->data.x_array.data.s_none.elements[next_index];
15639 copy_const_val(elem_dest_val, &op2_array_val->data.x_array.data.s_none.elements[i], false);
15632 copy_const_val(elem_dest_val, &op2_array_val->data.x_array.data.s_none.elements[i]);
1564015633 elem_dest_val->parent.id = ConstParentIdArray;
1564115634 elem_dest_val->parent.data.p_array.array_val = out_array_val;
1564215635 elem_dest_val->parent.data.p_array.elem_index = next_index;
1564315636 }
1564415637 if (next_index < full_len) {
1564515638 ZigValue *elem_dest_val = &out_array_val->data.x_array.data.s_none.elements[next_index];
15646 copy_const_val(elem_dest_val, sentinel, false);
15639 copy_const_val(elem_dest_val, sentinel);
1564715640 elem_dest_val->parent.id = ConstParentIdArray;
1564815641 elem_dest_val->parent.data.p_array.array_val = out_array_val;
1564915642 elem_dest_val->parent.data.p_array.elem_index = next_index;
......@@ -15728,7 +15721,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp *
1572815721 for (uint64_t x = 0; x < mult_amt; x += 1) {
1572915722 for (uint64_t y = 0; y < old_array_len; y += 1) {
1573015723 ZigValue *elem_dest_val = &out_val->data.x_array.data.s_none.elements[i];
15731 copy_const_val(elem_dest_val, &array_val->data.x_array.data.s_none.elements[y], false);
15724 copy_const_val(elem_dest_val, &array_val->data.x_array.data.s_none.elements[y]);
1573215725 elem_dest_val->parent.id = ConstParentIdArray;
1573315726 elem_dest_val->parent.data.p_array.array_val = out_val;
1573415727 elem_dest_val->parent.data.p_array.elem_index = i;
......@@ -15739,7 +15732,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp *
1573915732
1574015733 if (array_type->data.array.sentinel != nullptr) {
1574115734 ZigValue *elem_dest_val = &out_val->data.x_array.data.s_none.elements[i];
15742 copy_const_val(elem_dest_val, array_type->data.array.sentinel, false);
15735 copy_const_val(elem_dest_val, array_type->data.array.sentinel);
1574315736 elem_dest_val->parent.id = ConstParentIdArray;
1574415737 elem_dest_val->parent.data.p_array.array_val = out_val;
1574515738 elem_dest_val->parent.data.p_array.elem_index = i;
......@@ -15889,7 +15882,7 @@ static IrInstruction *ir_analyze_instruction_decl_var(IrAnalyze *ira,
1588915882 var->const_value = init_val;
1589015883 } else {
1589115884 var->const_value = create_const_vals(1);
15892 copy_const_val(var->const_value, init_val, false);
15885 copy_const_val(var->const_value, init_val);
1589315886 }
1589415887 }
1589515888 }
......@@ -15999,7 +15992,7 @@ static IrInstruction *ir_analyze_instruction_decl_var(IrAnalyze *ira,
1599915992 if (instr_is_comptime(var_ptr) && var->mem_slot_index != SIZE_MAX) {
1600015993 assert(var->mem_slot_index < ira->exec_context.mem_slot_list.length);
1600115994 ZigValue *mem_slot = ira->exec_context.mem_slot_list.at(var->mem_slot_index);
16002 copy_const_val(mem_slot, init_val, !is_comptime_var || var->gen_is_const);
15995 copy_const_val(mem_slot, init_val);
1600315996 ira_ref(var->owner_exec->analysis);
1600415997
1600515998 if (is_comptime_var || (var_class_requires_const && var->gen_is_const)) {
......@@ -16480,8 +16473,8 @@ static IrInstruction *ir_resolve_result_raw(IrAnalyze *ira, IrInstruction *suspe
1648016473 }
1648116474 IrInstruction *alloca_gen;
1648216475 if (is_comptime && value != nullptr) {
16483 if (align > value->value->global_refs->align) {
16484 value->value->global_refs->align = align;
16476 if (align > value->value->llvm_align) {
16477 value->value->llvm_align = align;
1648516478 }
1648616479 alloca_gen = ir_get_ref(ira, result_loc->source_instruction, value, true, false);
1648716480 } else {
......@@ -17045,7 +17038,7 @@ static bool ir_analyze_fn_call_generic_arg(IrAnalyze *ira, AstNode *fn_proto_nod
1704517038 arg_val = create_const_runtime(casted_arg->value->type);
1704617039 }
1704717040 if (arg_part_of_generic_id) {
17048 copy_const_val(&generic_id->params[generic_id->param_count], arg_val, true);
17041 copy_const_val(&generic_id->params[generic_id->param_count], arg_val);
1704917042 generic_id->param_count += 1;
1705017043 }
1705117044
......@@ -17226,7 +17219,7 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source
1722617219 IrInstruction *casted_ptr;
1722717220 if (instr_is_comptime(ptr)) {
1722817221 casted_ptr = ir_const(ira, source_instr, struct_ptr_type);
17229 copy_const_val(casted_ptr->value, ptr->value, false);
17222 copy_const_val(casted_ptr->value, ptr->value);
1723017223 casted_ptr->value->type = struct_ptr_type;
1723117224 } else {
1723217225 casted_ptr = ir_build_cast(&ira->new_irb, source_instr->scope,
......@@ -17289,14 +17282,7 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source
1728917282 if (dest_val == nullptr)
1729017283 return ira->codegen->invalid_instruction;
1729117284 if (dest_val->special != ConstValSpecialRuntime) {
17292 // TODO this allows a value stored to have the original value modified and then
17293 // have that affect what should be a copy. We need some kind of advanced copy-on-write
17294 // system to make these two tests pass at the same time:
17295 // * "string literal used as comptime slice is memoized"
17296 // * "comptime modification of const struct field" - except modified to avoid
17297 // ConstPtrMutComptimeVar, thus defeating the logic below.
17298 bool same_global_refs = ptr->value->data.x_ptr.mut != ConstPtrMutComptimeVar;
17299 copy_const_val(dest_val, value->value, same_global_refs);
17285 copy_const_val(dest_val, value->value);
1730017286 if (ptr->value->data.x_ptr.mut == ConstPtrMutComptimeVar &&
1730117287 !ira->new_irb.current_basic_block->must_be_comptime_source_instr)
1730217288 {
......@@ -17571,7 +17557,7 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c
1757117557 }
1757217558
1757317559 IrInstruction *new_instruction = ir_const(ira, &call_instruction->base, result->type);
17574 copy_const_val(new_instruction->value, result, true);
17560 copy_const_val(new_instruction->value, result);
1757517561 new_instruction->value->type = return_type;
1757617562 return ir_finish_anal(ira, new_instruction);
1757717563 }
......@@ -17728,7 +17714,7 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c
1772817714 nullptr, UndefBad);
1772917715 IrInstructionConst *const_instruction = ir_create_instruction<IrInstructionConst>(&ira->new_irb,
1773017716 impl_fn->child_scope, fn_proto_node->data.fn_proto.align_expr);
17731 copy_const_val(const_instruction->base.value, align_result, true);
17717 copy_const_val(const_instruction->base.value, align_result);
1773217718
1773317719 uint32_t align_bytes = 0;
1773417720 ir_resolve_align(ira, &const_instruction->base, nullptr, &align_bytes);
......@@ -18058,7 +18044,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source
1805818044
1805918045 if (dst_size <= src_size) {
1806018046 if (src_size == dst_size && types_have_same_zig_comptime_repr(codegen, out_val->type, pointee->type)) {
18061 copy_const_val(out_val, pointee, ptr_val->data.x_ptr.mut != ConstPtrMutComptimeVar);
18047 copy_const_val(out_val, pointee);
1806218048 return ErrorNone;
1806318049 }
1806418050 Buf buf = BUF_INIT;
......@@ -18421,7 +18407,7 @@ static IrInstruction *ir_analyze_instruction_phi(IrAnalyze *ira, IrInstructionPh
1842118407
1842218408 if (value->value->special != ConstValSpecialRuntime) {
1842318409 IrInstruction *result = ir_const(ira, &phi_instruction->base, nullptr);
18424 copy_const_val(result->value, value->value, true);
18410 copy_const_val(result->value, value->value);
1842518411 return result;
1842618412 } else {
1842718413 return value;
......@@ -18814,7 +18800,7 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct
1881418800 if (index == array_len && array_type->data.array.sentinel != nullptr) {
1881518801 ZigType *elem_type = array_type->data.array.child_type;
1881618802 IrInstruction *sentinel_elem = ir_const(ira, &elem_ptr_instruction->base, elem_type);
18817 copy_const_val(sentinel_elem->value, array_type->data.array.sentinel, false);
18803 copy_const_val(sentinel_elem->value, array_type->data.array.sentinel);
1881818804 return ir_get_ref(ira, &elem_ptr_instruction->base, sentinel_elem, true, false);
1881918805 }
1882018806 if (index >= array_len) {
......@@ -19305,7 +19291,7 @@ static IrInstruction *ir_analyze_inferred_field_ptr(IrAnalyze *ira, Buf *field_n
1930519291
1930619292 if (instr_is_comptime(container_ptr)) {
1930719293 IrInstruction *result = ir_const(ira, source_instr, field_ptr_type);
19308 copy_const_val(result->value, container_ptr->value, false);
19294 copy_const_val(result->value, container_ptr->value);
1930919295 result->value->type = field_ptr_type;
1931019296 return result;
1931119297 }
......@@ -20737,7 +20723,7 @@ static IrInstruction *ir_analyze_instruction_switch_target(IrAnalyze *ira,
2073720723 case ZigTypeIdErrorSet: {
2073820724 if (pointee_val) {
2073920725 IrInstruction *result = ir_const(ira, &switch_target_instruction->base, nullptr);
20740 copy_const_val(result->value, pointee_val, true);
20726 copy_const_val(result->value, pointee_val);
2074120727 result->value->type = target_type;
2074220728 return result;
2074320729 }
......@@ -21233,7 +21219,7 @@ static IrInstruction *ir_analyze_container_init_fields(IrAnalyze *ira, IrInstruc
2123321219 return ira->codegen->invalid_instruction;
2123421220
2123521221 IrInstruction *runtime_inst = ir_const(ira, instruction, field->init_val->type);
21236 copy_const_val(runtime_inst->value, field->init_val, true);
21222 copy_const_val(runtime_inst->value, field->init_val);
2123721223
2123821224 IrInstruction *field_ptr = ir_analyze_struct_field_ptr(ira, instruction, field, result_loc,
2123921225 container_type, true);
......@@ -21493,7 +21479,7 @@ static IrInstruction *ir_analyze_instruction_err_name(IrAnalyze *ira, IrInstruct
2149321479 err->cached_error_name_val = create_const_slice(ira->codegen, array_val, 0, buf_len(&err->name), true);
2149421480 }
2149521481 IrInstruction *result = ir_const(ira, &instruction->base, nullptr);
21496 copy_const_val(result->value, err->cached_error_name_val, true);
21482 copy_const_val(result->value, err->cached_error_name_val);
2149721483 result->value->type = str_type;
2149821484 return result;
2149921485 }
......@@ -22978,7 +22964,7 @@ static IrInstruction *ir_analyze_instruction_type_name(IrAnalyze *ira, IrInstruc
2297822964 type_entry->cached_const_name_val = create_const_str_lit(ira->codegen, type_bare_name(type_entry));
2297922965 }
2298022966 IrInstruction *result = ir_const(ira, &instruction->base, nullptr);
22981 copy_const_val(result->value, type_entry->cached_const_name_val, true);
22967 copy_const_val(result->value, type_entry->cached_const_name_val);
2298222968 return result;
2298322969}
2298422970
......@@ -23678,7 +23664,7 @@ static IrInstruction *ir_analyze_instruction_to_bytes(IrAnalyze *ira, IrInstruct
2367823664
2367923665 ZigValue *ptr_val = result->value->data.x_struct.fields[slice_ptr_index];
2368023666 ZigValue *target_ptr_val = target_val->data.x_struct.fields[slice_ptr_index];
23681 copy_const_val(ptr_val, target_ptr_val, false);
23667 copy_const_val(ptr_val, target_ptr_val);
2368223668 ptr_val->type = dest_ptr_type;
2368323669
2368423670 ZigValue *len_val = result->value->data.x_struct.fields[slice_len_index];
......@@ -23971,7 +23957,7 @@ static IrInstruction *ir_analyze_shuffle_vector(IrAnalyze *ira, IrInstruction *s
2397123957 ZigValue *src_elem_val = (v >= 0) ?
2397223958 &a->value->data.x_array.data.s_none.elements[v] :
2397323959 &b->value->data.x_array.data.s_none.elements[~v];
23974 copy_const_val(result_elem_val, src_elem_val, false);
23960 copy_const_val(result_elem_val, src_elem_val);
2397523961
2397623962 ir_assert(result_elem_val->special == ConstValSpecialStatic, source_instr);
2397723963 }
......@@ -24066,7 +24052,7 @@ static IrInstruction *ir_analyze_instruction_splat(IrAnalyze *ira, IrInstruction
2406624052 IrInstruction *result = ir_const(ira, &instruction->base, return_type);
2406724053 result->value->data.x_array.data.s_none.elements = create_const_vals(len_int);
2406824054 for (uint32_t i = 0; i < len_int; i += 1) {
24069 copy_const_val(&result->value->data.x_array.data.s_none.elements[i], scalar_val, false);
24055 copy_const_val(&result->value->data.x_array.data.s_none.elements[i], scalar_val);
2407024056 }
2407124057 return result;
2407224058 }
......@@ -24207,7 +24193,7 @@ static IrInstruction *ir_analyze_instruction_memset(IrAnalyze *ira, IrInstructio
2420724193 }
2420824194
2420924195 for (size_t i = start; i < end; i += 1) {
24210 copy_const_val(&dest_elements[i], byte_val, true);
24196 copy_const_val(&dest_elements[i], byte_val);
2421124197 }
2421224198
2421324199 return ir_const_void(ira, &instruction->base);
......@@ -24386,7 +24372,7 @@ static IrInstruction *ir_analyze_instruction_memcpy(IrAnalyze *ira, IrInstructio
2438624372 // TODO check for noalias violations - this should be generalized to work for any function
2438724373
2438824374 for (size_t i = 0; i < count; i += 1) {
24389 copy_const_val(&dest_elements[dest_start + i], &src_elements[src_start + i], true);
24375 copy_const_val(&dest_elements[dest_start + i], &src_elements[src_start + i]);
2439024376 }
2439124377
2439224378 return ir_const_void(ira, &instruction->base);
......@@ -25828,7 +25814,7 @@ static IrInstruction *ir_align_cast(IrAnalyze *ira, IrInstruction *target, uint3
2582825814 }
2582925815
2583025816 IrInstruction *result = ir_const(ira, target, result_type);
25831 copy_const_val(result->value, val, true);
25817 copy_const_val(result->value, val);
2583225818 result->value->type = result_type;
2583325819 return result;
2583425820 }
......@@ -25910,7 +25896,7 @@ static IrInstruction *ir_analyze_ptr_cast(IrAnalyze *ira, IrInstruction *source_
2591025896 } else {
2591125897 result = ir_const(ira, source_instr, dest_type);
2591225898 }
25913 copy_const_val(result->value, val, true);
25899 copy_const_val(result->value, val);
2591425900 result->value->type = dest_type;
2591525901
2591625902 // Keep the bigger alignment, it can only help-