| ... | @@ -223,7 +223,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source | ... | @@ -223,7 +223,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source |
| 223 | static IrInstruction *ir_analyze_ptr_cast(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *ptr, | 223 | static IrInstruction *ir_analyze_ptr_cast(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *ptr, |
| 224 | ZigType *dest_type, IrInstruction *dest_type_src, bool safety_check_on); | 224 | ZigType *dest_type, IrInstruction *dest_type_src, bool safety_check_on); |
| 225 | static ZigValue *ir_resolve_const(IrAnalyze *ira, IrInstruction *value, UndefAllowed undef_allowed); | 225 | static ZigValue *ir_resolve_const(IrAnalyze *ira, IrInstruction *value, UndefAllowed undef_allowed); |
| 226 | static void copy_const_val(ZigValue *dest, ZigValue *src, bool same_global_refs); | 226 | static void copy_const_val(ZigValue *dest, ZigValue *src); |
| 227 | static Error resolve_ptr_align(IrAnalyze *ira, ZigType *ty, uint32_t *result_align); | 227 | static Error resolve_ptr_align(IrAnalyze *ira, ZigType *ty, uint32_t *result_align); |
| 228 | static IrInstruction *ir_analyze_int_to_ptr(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *target, | 228 | static IrInstruction *ir_analyze_int_to_ptr(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *target, |
| 229 | ZigType *ptr_type); | 229 | ZigType *ptr_type); |
| ... | @@ -1545,7 +1545,6 @@ static T *ir_create_instruction(IrBuilder *irb, Scope *scope, AstNode *source_no | ... | @@ -1545,7 +1545,6 @@ static T *ir_create_instruction(IrBuilder *irb, Scope *scope, AstNode *source_no |
| 1545 | special_instruction->base.debug_id = exec_next_debug_id(irb->exec); | 1545 | special_instruction->base.debug_id = exec_next_debug_id(irb->exec); |
| 1546 | special_instruction->base.owner_bb = irb->current_basic_block; | 1546 | special_instruction->base.owner_bb = irb->current_basic_block; |
| 1547 | special_instruction->base.value = allocate<ZigValue>(1, "ZigValue"); | 1547 | special_instruction->base.value = allocate<ZigValue>(1, "ZigValue"); |
| 1548 | special_instruction->base.value->global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs"); | | |
| 1549 | return special_instruction; | 1548 | return special_instruction; |
| 1550 | } | 1549 | } |
| 1551 | | 1550 | |
| ... | @@ -9122,7 +9121,7 @@ static Error eval_comptime_ptr_reinterpret(IrAnalyze *ira, CodeGen *codegen, Ast | ... | @@ -9122,7 +9121,7 @@ static Error eval_comptime_ptr_reinterpret(IrAnalyze *ira, CodeGen *codegen, Ast |
| 9122 | if ((err = ir_read_const_ptr(ira, codegen, source_node, &tmp, ptr_val))) | 9121 | if ((err = ir_read_const_ptr(ira, codegen, source_node, &tmp, ptr_val))) |
| 9123 | return err; | 9122 | return err; |
| 9124 | ZigValue *child_val = const_ptr_pointee_unchecked(codegen, ptr_val); | 9123 | 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); |
| 9126 | return ErrorNone; | 9125 | return ErrorNone; |
| 9127 | } | 9126 | } |
| 9128 | | 9127 | |
| ... | @@ -11348,18 +11347,14 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT | ... | @@ -11348,18 +11347,14 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT |
| 11348 | } | 11347 | } |
| 11349 | } | 11348 | } |
| 11350 | | 11349 | |
| 11351 | static void copy_const_val(ZigValue *dest, ZigValue *src, bool same_global_refs) { | 11350 | static void copy_const_val(ZigValue *dest, ZigValue *src) { |
| 11352 | ConstGlobalRefs *global_refs = dest->global_refs; | | |
| 11353 | memcpy(dest, src, sizeof(ZigValue)); | 11351 | memcpy(dest, src, sizeof(ZigValue)); |
| 11354 | if (!same_global_refs) { | 11352 | if (src->special != ConstValSpecialStatic) |
| 11355 | dest->global_refs = global_refs; | 11353 | return; |
| 11356 | if (src->special != ConstValSpecialStatic) | 11354 | if (dest->type->id == ZigTypeIdStruct) { |
| 11357 | return; | 11355 | dest->data.x_struct.fields = alloc_const_vals_ptrs(dest->type->data.structure.src_field_count); |
| 11358 | if (dest->type->id == ZigTypeIdStruct) { | 11356 | for (size_t i = 0; i < dest->type->data.structure.src_field_count; i += 1) { |
| 11359 | dest->data.x_struct.fields = alloc_const_vals_ptrs(dest->type->data.structure.src_field_count); | 11357 | copy_const_val(dest->data.x_struct.fields[i], src->data.x_struct.fields[i]); |
| 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 | } | | |
| 11363 | } | 11358 | } |
| 11364 | } | 11359 | } |
| 11365 | } | 11360 | } |
| ... | @@ -11378,13 +11373,11 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInstruction *source_ | ... | @@ -11378,13 +11373,11 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, IrInstruction *source_ |
| 11378 | case CastOpErrSet: | 11373 | case CastOpErrSet: |
| 11379 | case CastOpBitCast: | 11374 | case CastOpBitCast: |
| 11380 | zig_panic("TODO"); | 11375 | zig_panic("TODO"); |
| 11381 | case CastOpNoop: | 11376 | case CastOpNoop: { |
| 11382 | { | 11377 | copy_const_val(const_val, other_val); |
| 11383 | bool same_global_refs = other_val->special == ConstValSpecialStatic; | 11378 | const_val->type = new_type; |
| 11384 | copy_const_val(const_val, other_val, same_global_refs); | 11379 | break; |
| 11385 | const_val->type = new_type; | 11380 | } |
| 11386 | break; | | |
| 11387 | } | | |
| 11388 | case CastOpNumLitToConcrete: | 11381 | case CastOpNumLitToConcrete: |
| 11389 | if (other_val->type->id == ZigTypeIdComptimeFloat) { | 11382 | if (other_val->type->id == ZigTypeIdComptimeFloat) { |
| 11390 | assert(new_type->id == ZigTypeIdFloat); | 11383 | assert(new_type->id == ZigTypeIdFloat); |
| ... | @@ -12105,7 +12098,7 @@ static IrInstruction *ir_analyze_optional_wrap(IrAnalyze *ira, IrInstruction *so | ... | @@ -12105,7 +12098,7 @@ static IrInstruction *ir_analyze_optional_wrap(IrAnalyze *ira, IrInstruction *so |
| 12105 | source_instr->scope, source_instr->source_node); | 12098 | source_instr->scope, source_instr->source_node); |
| 12106 | const_instruction->base.value->special = ConstValSpecialStatic; | 12099 | const_instruction->base.value->special = ConstValSpecialStatic; |
| 12107 | if (types_have_same_zig_comptime_repr(ira->codegen, wanted_type, payload_type)) { | 12100 | 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); |
| 12109 | } else { | 12102 | } else { |
| 12110 | const_instruction->base.value->data.x_optional = val; | 12103 | const_instruction->base.value->data.x_optional = val; |
| 12111 | } | 12104 | } |
| ... | @@ -13063,7 +13056,7 @@ static IrInstruction *ir_analyze_array_to_vector(IrAnalyze *ira, IrInstruction * | ... | @@ -13063,7 +13056,7 @@ static IrInstruction *ir_analyze_array_to_vector(IrAnalyze *ira, IrInstruction * |
| 13063 | if (instr_is_comptime(array)) { | 13056 | if (instr_is_comptime(array)) { |
| 13064 | // arrays and vectors have the same ZigValue representation | 13057 | // arrays and vectors have the same ZigValue representation |
| 13065 | IrInstruction *result = ir_const(ira, source_instr, vector_type); | 13058 | 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); |
| 13067 | result->value->type = vector_type; | 13060 | result->value->type = vector_type; |
| 13068 | return result; | 13061 | return result; |
| 13069 | } | 13062 | } |
| ... | @@ -13076,7 +13069,7 @@ static IrInstruction *ir_analyze_vector_to_array(IrAnalyze *ira, IrInstruction * | ... | @@ -13076,7 +13069,7 @@ static IrInstruction *ir_analyze_vector_to_array(IrAnalyze *ira, IrInstruction * |
| 13076 | if (instr_is_comptime(vector)) { | 13069 | if (instr_is_comptime(vector)) { |
| 13077 | // arrays and vectors have the same ZigValue representation | 13070 | // arrays and vectors have the same ZigValue representation |
| 13078 | IrInstruction *result = ir_const(ira, source_instr, array_type); | 13071 | 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); |
| 13080 | result->value->type = array_type; | 13073 | result->value->type = array_type; |
| 13081 | return result; | 13074 | return result; |
| 13082 | } | 13075 | } |
| ... | @@ -13364,7 +13357,7 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst | ... | @@ -13364,7 +13357,7 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst |
| 13364 | if (wanted_type->id == ZigTypeIdComptimeInt || wanted_type->id == ZigTypeIdInt) { | 13357 | if (wanted_type->id == ZigTypeIdComptimeInt || wanted_type->id == ZigTypeIdInt) { |
| 13365 | IrInstruction *result = ir_const(ira, source_instr, wanted_type); | 13358 | IrInstruction *result = ir_const(ira, source_instr, wanted_type); |
| 13366 | if (actual_type->id == ZigTypeIdComptimeInt || actual_type->id == ZigTypeIdInt) { | 13359 | 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); |
| 13368 | result->value->type = wanted_type; | 13361 | result->value->type = wanted_type; |
| 13369 | } else { | 13362 | } else { |
| 13370 | float_init_bigint(&result->value->data.x_bigint, value->value); | 13363 | float_init_bigint(&result->value->data.x_bigint, value->value); |
| ... | @@ -14224,7 +14217,7 @@ static IrInstruction *ir_analyze_instruction_return(IrAnalyze *ira, IrInstructio | ... | @@ -14224,7 +14217,7 @@ static IrInstruction *ir_analyze_instruction_return(IrAnalyze *ira, IrInstructio |
| 14224 | | 14217 | |
| 14225 | static IrInstruction *ir_analyze_instruction_const(IrAnalyze *ira, IrInstructionConst *instruction) { | 14218 | static IrInstruction *ir_analyze_instruction_const(IrAnalyze *ira, IrInstructionConst *instruction) { |
| 14226 | IrInstruction *result = ir_const(ira, &instruction->base, nullptr); | 14219 | 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); |
| 14228 | return result; | 14221 | return result; |
| 14229 | } | 14222 | } |
| 14230 | | 14223 | |
| ... | @@ -14763,7 +14756,7 @@ never_mind_just_calculate_it_normally: | ... | @@ -14763,7 +14756,7 @@ never_mind_just_calculate_it_normally: |
| 14763 | &op1_val->data.x_array.data.s_none.elements[i], | 14756 | &op1_val->data.x_array.data.s_none.elements[i], |
| 14764 | &op2_val->data.x_array.data.s_none.elements[i], | 14757 | &op2_val->data.x_array.data.s_none.elements[i], |
| 14765 | bin_op_instruction, op_id, one_possible_value); | 14758 | 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); |
| 14767 | } | 14760 | } |
| 14768 | return result; | 14761 | return result; |
| 14769 | } | 14762 | } |
| ... | @@ -15629,21 +15622,21 @@ static IrInstruction *ir_analyze_array_cat(IrAnalyze *ira, IrInstructionBinOp *i | ... | @@ -15629,21 +15622,21 @@ static IrInstruction *ir_analyze_array_cat(IrAnalyze *ira, IrInstructionBinOp *i |
| 15629 | size_t next_index = 0; | 15622 | size_t next_index = 0; |
| 15630 | for (size_t i = op1_array_index; i < op1_array_end; i += 1, next_index += 1) { | 15623 | for (size_t i = op1_array_index; i < op1_array_end; i += 1, next_index += 1) { |
| 15631 | ZigValue *elem_dest_val = &out_array_val->data.x_array.data.s_none.elements[next_index]; | 15624 | 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]); |
| 15633 | elem_dest_val->parent.id = ConstParentIdArray; | 15626 | elem_dest_val->parent.id = ConstParentIdArray; |
| 15634 | elem_dest_val->parent.data.p_array.array_val = out_array_val; | 15627 | elem_dest_val->parent.data.p_array.array_val = out_array_val; |
| 15635 | elem_dest_val->parent.data.p_array.elem_index = next_index; | 15628 | elem_dest_val->parent.data.p_array.elem_index = next_index; |
| 15636 | } | 15629 | } |
| 15637 | for (size_t i = op2_array_index; i < op2_array_end; i += 1, next_index += 1) { | 15630 | for (size_t i = op2_array_index; i < op2_array_end; i += 1, next_index += 1) { |
| 15638 | ZigValue *elem_dest_val = &out_array_val->data.x_array.data.s_none.elements[next_index]; | 15631 | 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]); |
| 15640 | elem_dest_val->parent.id = ConstParentIdArray; | 15633 | elem_dest_val->parent.id = ConstParentIdArray; |
| 15641 | elem_dest_val->parent.data.p_array.array_val = out_array_val; | 15634 | elem_dest_val->parent.data.p_array.array_val = out_array_val; |
| 15642 | elem_dest_val->parent.data.p_array.elem_index = next_index; | 15635 | elem_dest_val->parent.data.p_array.elem_index = next_index; |
| 15643 | } | 15636 | } |
| 15644 | if (next_index < full_len) { | 15637 | if (next_index < full_len) { |
| 15645 | ZigValue *elem_dest_val = &out_array_val->data.x_array.data.s_none.elements[next_index]; | 15638 | 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); |
| 15647 | elem_dest_val->parent.id = ConstParentIdArray; | 15640 | elem_dest_val->parent.id = ConstParentIdArray; |
| 15648 | elem_dest_val->parent.data.p_array.array_val = out_array_val; | 15641 | elem_dest_val->parent.data.p_array.array_val = out_array_val; |
| 15649 | elem_dest_val->parent.data.p_array.elem_index = next_index; | 15642 | elem_dest_val->parent.data.p_array.elem_index = next_index; |
| ... | @@ -15728,7 +15721,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp * | ... | @@ -15728,7 +15721,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp * |
| 15728 | for (uint64_t x = 0; x < mult_amt; x += 1) { | 15721 | for (uint64_t x = 0; x < mult_amt; x += 1) { |
| 15729 | for (uint64_t y = 0; y < old_array_len; y += 1) { | 15722 | for (uint64_t y = 0; y < old_array_len; y += 1) { |
| 15730 | ZigValue *elem_dest_val = &out_val->data.x_array.data.s_none.elements[i]; | 15723 | 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]); |
| 15732 | elem_dest_val->parent.id = ConstParentIdArray; | 15725 | elem_dest_val->parent.id = ConstParentIdArray; |
| 15733 | elem_dest_val->parent.data.p_array.array_val = out_val; | 15726 | elem_dest_val->parent.data.p_array.array_val = out_val; |
| 15734 | elem_dest_val->parent.data.p_array.elem_index = i; | 15727 | elem_dest_val->parent.data.p_array.elem_index = i; |
| ... | @@ -15739,7 +15732,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp * | ... | @@ -15739,7 +15732,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp * |
| 15739 | | 15732 | |
| 15740 | if (array_type->data.array.sentinel != nullptr) { | 15733 | if (array_type->data.array.sentinel != nullptr) { |
| 15741 | ZigValue *elem_dest_val = &out_val->data.x_array.data.s_none.elements[i]; | 15734 | 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); |
| 15743 | elem_dest_val->parent.id = ConstParentIdArray; | 15736 | elem_dest_val->parent.id = ConstParentIdArray; |
| 15744 | elem_dest_val->parent.data.p_array.array_val = out_val; | 15737 | elem_dest_val->parent.data.p_array.array_val = out_val; |
| 15745 | elem_dest_val->parent.data.p_array.elem_index = i; | 15738 | elem_dest_val->parent.data.p_array.elem_index = i; |
| ... | @@ -15889,7 +15882,7 @@ static IrInstruction *ir_analyze_instruction_decl_var(IrAnalyze *ira, | ... | @@ -15889,7 +15882,7 @@ static IrInstruction *ir_analyze_instruction_decl_var(IrAnalyze *ira, |
| 15889 | var->const_value = init_val; | 15882 | var->const_value = init_val; |
| 15890 | } else { | 15883 | } else { |
| 15891 | var->const_value = create_const_vals(1); | 15884 | 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); |
| 15893 | } | 15886 | } |
| 15894 | } | 15887 | } |
| 15895 | } | 15888 | } |
| ... | @@ -15999,7 +15992,7 @@ static IrInstruction *ir_analyze_instruction_decl_var(IrAnalyze *ira, | ... | @@ -15999,7 +15992,7 @@ static IrInstruction *ir_analyze_instruction_decl_var(IrAnalyze *ira, |
| 15999 | if (instr_is_comptime(var_ptr) && var->mem_slot_index != SIZE_MAX) { | 15992 | if (instr_is_comptime(var_ptr) && var->mem_slot_index != SIZE_MAX) { |
| 16000 | assert(var->mem_slot_index < ira->exec_context.mem_slot_list.length); | 15993 | assert(var->mem_slot_index < ira->exec_context.mem_slot_list.length); |
| 16001 | ZigValue *mem_slot = ira->exec_context.mem_slot_list.at(var->mem_slot_index); | 15994 | 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); |
| 16003 | ira_ref(var->owner_exec->analysis); | 15996 | ira_ref(var->owner_exec->analysis); |
| 16004 | | 15997 | |
| 16005 | if (is_comptime_var || (var_class_requires_const && var->gen_is_const)) { | 15998 | 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 | ... | @@ -16480,8 +16473,8 @@ static IrInstruction *ir_resolve_result_raw(IrAnalyze *ira, IrInstruction *suspe |
| 16480 | } | 16473 | } |
| 16481 | IrInstruction *alloca_gen; | 16474 | IrInstruction *alloca_gen; |
| 16482 | if (is_comptime && value != nullptr) { | 16475 | if (is_comptime && value != nullptr) { |
| 16483 | if (align > value->value->global_refs->align) { | 16476 | if (align > value->value->llvm_align) { |
| 16484 | value->value->global_refs->align = align; | 16477 | value->value->llvm_align = align; |
| 16485 | } | 16478 | } |
| 16486 | alloca_gen = ir_get_ref(ira, result_loc->source_instruction, value, true, false); | 16479 | alloca_gen = ir_get_ref(ira, result_loc->source_instruction, value, true, false); |
| 16487 | } else { | 16480 | } else { |
| ... | @@ -17045,7 +17038,7 @@ static bool ir_analyze_fn_call_generic_arg(IrAnalyze *ira, AstNode *fn_proto_nod | ... | @@ -17045,7 +17038,7 @@ static bool ir_analyze_fn_call_generic_arg(IrAnalyze *ira, AstNode *fn_proto_nod |
| 17045 | arg_val = create_const_runtime(casted_arg->value->type); | 17038 | arg_val = create_const_runtime(casted_arg->value->type); |
| 17046 | } | 17039 | } |
| 17047 | if (arg_part_of_generic_id) { | 17040 | 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); |
| 17049 | generic_id->param_count += 1; | 17042 | generic_id->param_count += 1; |
| 17050 | } | 17043 | } |
| 17051 | | 17044 | |
| ... | @@ -17226,7 +17219,7 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source | ... | @@ -17226,7 +17219,7 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source |
| 17226 | IrInstruction *casted_ptr; | 17219 | IrInstruction *casted_ptr; |
| 17227 | if (instr_is_comptime(ptr)) { | 17220 | if (instr_is_comptime(ptr)) { |
| 17228 | casted_ptr = ir_const(ira, source_instr, struct_ptr_type); | 17221 | 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); |
| 17230 | casted_ptr->value->type = struct_ptr_type; | 17223 | casted_ptr->value->type = struct_ptr_type; |
| 17231 | } else { | 17224 | } else { |
| 17232 | casted_ptr = ir_build_cast(&ira->new_irb, source_instr->scope, | 17225 | 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 | ... | @@ -17289,14 +17282,7 @@ static IrInstruction *ir_analyze_store_ptr(IrAnalyze *ira, IrInstruction *source |
| 17289 | if (dest_val == nullptr) | 17282 | if (dest_val == nullptr) |
| 17290 | return ira->codegen->invalid_instruction; | 17283 | return ira->codegen->invalid_instruction; |
| 17291 | if (dest_val->special != ConstValSpecialRuntime) { | 17284 | if (dest_val->special != ConstValSpecialRuntime) { |
| 17292 | // TODO this allows a value stored to have the original value modified and then | 17285 | copy_const_val(dest_val, value->value); |
| 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); | | |
| 17300 | if (ptr->value->data.x_ptr.mut == ConstPtrMutComptimeVar && | 17286 | if (ptr->value->data.x_ptr.mut == ConstPtrMutComptimeVar && |
| 17301 | !ira->new_irb.current_basic_block->must_be_comptime_source_instr) | 17287 | !ira->new_irb.current_basic_block->must_be_comptime_source_instr) |
| 17302 | { | 17288 | { |
| ... | @@ -17571,7 +17557,7 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c | ... | @@ -17571,7 +17557,7 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c |
| 17571 | } | 17557 | } |
| 17572 | | 17558 | |
| 17573 | IrInstruction *new_instruction = ir_const(ira, &call_instruction->base, result->type); | 17559 | 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); |
| 17575 | new_instruction->value->type = return_type; | 17561 | new_instruction->value->type = return_type; |
| 17576 | return ir_finish_anal(ira, new_instruction); | 17562 | return ir_finish_anal(ira, new_instruction); |
| 17577 | } | 17563 | } |
| ... | @@ -17728,7 +17714,7 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c | ... | @@ -17728,7 +17714,7 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c |
| 17728 | nullptr, UndefBad); | 17714 | nullptr, UndefBad); |
| 17729 | IrInstructionConst *const_instruction = ir_create_instruction<IrInstructionConst>(&ira->new_irb, | 17715 | IrInstructionConst *const_instruction = ir_create_instruction<IrInstructionConst>(&ira->new_irb, |
| 17730 | impl_fn->child_scope, fn_proto_node->data.fn_proto.align_expr); | 17716 | 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); |
| 17732 | | 17718 | |
| 17733 | uint32_t align_bytes = 0; | 17719 | uint32_t align_bytes = 0; |
| 17734 | ir_resolve_align(ira, &const_instruction->base, nullptr, &align_bytes); | 17720 | 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 | ... | @@ -18058,7 +18044,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source |
| 18058 | | 18044 | |
| 18059 | if (dst_size <= src_size) { | 18045 | if (dst_size <= src_size) { |
| 18060 | if (src_size == dst_size && types_have_same_zig_comptime_repr(codegen, out_val->type, pointee->type)) { | 18046 | 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); |
| 18062 | return ErrorNone; | 18048 | return ErrorNone; |
| 18063 | } | 18049 | } |
| 18064 | Buf buf = BUF_INIT; | 18050 | Buf buf = BUF_INIT; |
| ... | @@ -18421,7 +18407,7 @@ static IrInstruction *ir_analyze_instruction_phi(IrAnalyze *ira, IrInstructionPh | ... | @@ -18421,7 +18407,7 @@ static IrInstruction *ir_analyze_instruction_phi(IrAnalyze *ira, IrInstructionPh |
| 18421 | | 18407 | |
| 18422 | if (value->value->special != ConstValSpecialRuntime) { | 18408 | if (value->value->special != ConstValSpecialRuntime) { |
| 18423 | IrInstruction *result = ir_const(ira, &phi_instruction->base, nullptr); | 18409 | 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); |
| 18425 | return result; | 18411 | return result; |
| 18426 | } else { | 18412 | } else { |
| 18427 | return value; | 18413 | return value; |
| ... | @@ -18814,7 +18800,7 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct | ... | @@ -18814,7 +18800,7 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct |
| 18814 | if (index == array_len && array_type->data.array.sentinel != nullptr) { | 18800 | if (index == array_len && array_type->data.array.sentinel != nullptr) { |
| 18815 | ZigType *elem_type = array_type->data.array.child_type; | 18801 | ZigType *elem_type = array_type->data.array.child_type; |
| 18816 | IrInstruction *sentinel_elem = ir_const(ira, &elem_ptr_instruction->base, elem_type); | 18802 | 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); |
| 18818 | return ir_get_ref(ira, &elem_ptr_instruction->base, sentinel_elem, true, false); | 18804 | return ir_get_ref(ira, &elem_ptr_instruction->base, sentinel_elem, true, false); |
| 18819 | } | 18805 | } |
| 18820 | if (index >= array_len) { | 18806 | if (index >= array_len) { |
| ... | @@ -19305,7 +19291,7 @@ static IrInstruction *ir_analyze_inferred_field_ptr(IrAnalyze *ira, Buf *field_n | ... | @@ -19305,7 +19291,7 @@ static IrInstruction *ir_analyze_inferred_field_ptr(IrAnalyze *ira, Buf *field_n |
| 19305 | | 19291 | |
| 19306 | if (instr_is_comptime(container_ptr)) { | 19292 | if (instr_is_comptime(container_ptr)) { |
| 19307 | IrInstruction *result = ir_const(ira, source_instr, field_ptr_type); | 19293 | 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); |
| 19309 | result->value->type = field_ptr_type; | 19295 | result->value->type = field_ptr_type; |
| 19310 | return result; | 19296 | return result; |
| 19311 | } | 19297 | } |
| ... | @@ -20737,7 +20723,7 @@ static IrInstruction *ir_analyze_instruction_switch_target(IrAnalyze *ira, | ... | @@ -20737,7 +20723,7 @@ static IrInstruction *ir_analyze_instruction_switch_target(IrAnalyze *ira, |
| 20737 | case ZigTypeIdErrorSet: { | 20723 | case ZigTypeIdErrorSet: { |
| 20738 | if (pointee_val) { | 20724 | if (pointee_val) { |
| 20739 | IrInstruction *result = ir_const(ira, &switch_target_instruction->base, nullptr); | 20725 | 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); |
| 20741 | result->value->type = target_type; | 20727 | result->value->type = target_type; |
| 20742 | return result; | 20728 | return result; |
| 20743 | } | 20729 | } |
| ... | @@ -21233,7 +21219,7 @@ static IrInstruction *ir_analyze_container_init_fields(IrAnalyze *ira, IrInstruc | ... | @@ -21233,7 +21219,7 @@ static IrInstruction *ir_analyze_container_init_fields(IrAnalyze *ira, IrInstruc |
| 21233 | return ira->codegen->invalid_instruction; | 21219 | return ira->codegen->invalid_instruction; |
| 21234 | | 21220 | |
| 21235 | IrInstruction *runtime_inst = ir_const(ira, instruction, field->init_val->type); | 21221 | 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); |
| 21237 | | 21223 | |
| 21238 | IrInstruction *field_ptr = ir_analyze_struct_field_ptr(ira, instruction, field, result_loc, | 21224 | IrInstruction *field_ptr = ir_analyze_struct_field_ptr(ira, instruction, field, result_loc, |
| 21239 | container_type, true); | 21225 | container_type, true); |
| ... | @@ -21493,7 +21479,7 @@ static IrInstruction *ir_analyze_instruction_err_name(IrAnalyze *ira, IrInstruct | ... | @@ -21493,7 +21479,7 @@ static IrInstruction *ir_analyze_instruction_err_name(IrAnalyze *ira, IrInstruct |
| 21493 | err->cached_error_name_val = create_const_slice(ira->codegen, array_val, 0, buf_len(&err->name), true); | 21479 | err->cached_error_name_val = create_const_slice(ira->codegen, array_val, 0, buf_len(&err->name), true); |
| 21494 | } | 21480 | } |
| 21495 | IrInstruction *result = ir_const(ira, &instruction->base, nullptr); | 21481 | 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); |
| 21497 | result->value->type = str_type; | 21483 | result->value->type = str_type; |
| 21498 | return result; | 21484 | return result; |
| 21499 | } | 21485 | } |
| ... | @@ -22978,7 +22964,7 @@ static IrInstruction *ir_analyze_instruction_type_name(IrAnalyze *ira, IrInstruc | ... | @@ -22978,7 +22964,7 @@ static IrInstruction *ir_analyze_instruction_type_name(IrAnalyze *ira, IrInstruc |
| 22978 | type_entry->cached_const_name_val = create_const_str_lit(ira->codegen, type_bare_name(type_entry)); | 22964 | type_entry->cached_const_name_val = create_const_str_lit(ira->codegen, type_bare_name(type_entry)); |
| 22979 | } | 22965 | } |
| 22980 | IrInstruction *result = ir_const(ira, &instruction->base, nullptr); | 22966 | 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); |
| 22982 | return result; | 22968 | return result; |
| 22983 | } | 22969 | } |
| 22984 | | 22970 | |
| ... | @@ -23678,7 +23664,7 @@ static IrInstruction *ir_analyze_instruction_to_bytes(IrAnalyze *ira, IrInstruct | ... | @@ -23678,7 +23664,7 @@ static IrInstruction *ir_analyze_instruction_to_bytes(IrAnalyze *ira, IrInstruct |
| 23678 | | 23664 | |
| 23679 | ZigValue *ptr_val = result->value->data.x_struct.fields[slice_ptr_index]; | 23665 | ZigValue *ptr_val = result->value->data.x_struct.fields[slice_ptr_index]; |
| 23680 | ZigValue *target_ptr_val = target_val->data.x_struct.fields[slice_ptr_index]; | 23666 | 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); |
| 23682 | ptr_val->type = dest_ptr_type; | 23668 | ptr_val->type = dest_ptr_type; |
| 23683 | | 23669 | |
| 23684 | ZigValue *len_val = result->value->data.x_struct.fields[slice_len_index]; | 23670 | 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 | ... | @@ -23971,7 +23957,7 @@ static IrInstruction *ir_analyze_shuffle_vector(IrAnalyze *ira, IrInstruction *s |
| 23971 | ZigValue *src_elem_val = (v >= 0) ? | 23957 | ZigValue *src_elem_val = (v >= 0) ? |
| 23972 | &a->value->data.x_array.data.s_none.elements[v] : | 23958 | &a->value->data.x_array.data.s_none.elements[v] : |
| 23973 | &b->value->data.x_array.data.s_none.elements[~v]; | 23959 | &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); |
| 23975 | | 23961 | |
| 23976 | ir_assert(result_elem_val->special == ConstValSpecialStatic, source_instr); | 23962 | ir_assert(result_elem_val->special == ConstValSpecialStatic, source_instr); |
| 23977 | } | 23963 | } |
| ... | @@ -24066,7 +24052,7 @@ static IrInstruction *ir_analyze_instruction_splat(IrAnalyze *ira, IrInstruction | ... | @@ -24066,7 +24052,7 @@ static IrInstruction *ir_analyze_instruction_splat(IrAnalyze *ira, IrInstruction |
| 24066 | IrInstruction *result = ir_const(ira, &instruction->base, return_type); | 24052 | IrInstruction *result = ir_const(ira, &instruction->base, return_type); |
| 24067 | result->value->data.x_array.data.s_none.elements = create_const_vals(len_int); | 24053 | result->value->data.x_array.data.s_none.elements = create_const_vals(len_int); |
| 24068 | for (uint32_t i = 0; i < len_int; i += 1) { | 24054 | 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); |
| 24070 | } | 24056 | } |
| 24071 | return result; | 24057 | return result; |
| 24072 | } | 24058 | } |
| ... | @@ -24207,7 +24193,7 @@ static IrInstruction *ir_analyze_instruction_memset(IrAnalyze *ira, IrInstructio | ... | @@ -24207,7 +24193,7 @@ static IrInstruction *ir_analyze_instruction_memset(IrAnalyze *ira, IrInstructio |
| 24207 | } | 24193 | } |
| 24208 | | 24194 | |
| 24209 | for (size_t i = start; i < end; i += 1) { | 24195 | 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); |
| 24211 | } | 24197 | } |
| 24212 | | 24198 | |
| 24213 | return ir_const_void(ira, &instruction->base); | 24199 | return ir_const_void(ira, &instruction->base); |
| ... | @@ -24386,7 +24372,7 @@ static IrInstruction *ir_analyze_instruction_memcpy(IrAnalyze *ira, IrInstructio | ... | @@ -24386,7 +24372,7 @@ static IrInstruction *ir_analyze_instruction_memcpy(IrAnalyze *ira, IrInstructio |
| 24386 | // TODO check for noalias violations - this should be generalized to work for any function | 24372 | // TODO check for noalias violations - this should be generalized to work for any function |
| 24387 | | 24373 | |
| 24388 | for (size_t i = 0; i < count; i += 1) { | 24374 | 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]); |
| 24390 | } | 24376 | } |
| 24391 | | 24377 | |
| 24392 | return ir_const_void(ira, &instruction->base); | 24378 | return ir_const_void(ira, &instruction->base); |
| ... | @@ -25828,7 +25814,7 @@ static IrInstruction *ir_align_cast(IrAnalyze *ira, IrInstruction *target, uint3 | ... | @@ -25828,7 +25814,7 @@ static IrInstruction *ir_align_cast(IrAnalyze *ira, IrInstruction *target, uint3 |
| 25828 | } | 25814 | } |
| 25829 | | 25815 | |
| 25830 | IrInstruction *result = ir_const(ira, target, result_type); | 25816 | IrInstruction *result = ir_const(ira, target, result_type); |
| 25831 | copy_const_val(result->value, val, true); | 25817 | copy_const_val(result->value, val); |
| 25832 | result->value->type = result_type; | 25818 | result->value->type = result_type; |
| 25833 | return result; | 25819 | return result; |
| 25834 | } | 25820 | } |
| ... | @@ -25910,7 +25896,7 @@ static IrInstruction *ir_analyze_ptr_cast(IrAnalyze *ira, IrInstruction *source_ | ... | @@ -25910,7 +25896,7 @@ static IrInstruction *ir_analyze_ptr_cast(IrAnalyze *ira, IrInstruction *source_ |
| 25910 | } else { | 25896 | } else { |
| 25911 | result = ir_const(ira, source_instr, dest_type); | 25897 | result = ir_const(ira, source_instr, dest_type); |
| 25912 | } | 25898 | } |
| 25913 | copy_const_val(result->value, val, true); | 25899 | copy_const_val(result->value, val); |
| 25914 | result->value->type = dest_type; | 25900 | result->value->type = dest_type; |
| 25915 | | 25901 | |
| 25916 | // Keep the bigger alignment, it can only help- | 25902 | // Keep the bigger alignment, it can only help- |