authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-05-30 17:05:06-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-05-30 23:16:11-04:00
loga4aca787229e3b0b3dc992b747cc72a561c2078c
treeae7d210ad1ed2ab92c1147afdd88c8a3765c36f8
parent5e1003bc81466b8ca0e3a3adb613bac8f34f2712
signaturelock-open Commit is signed but in an unrecognized format.

no-copy semantics for if expr

```zig export fn entry() void { var c = true; var x = if (c) u8(4) else u32(10); } ``` ```llvm define void @entry() #2 !dbg !35 { Entry: %c = alloca i1, align 1 %x = alloca i32, align 4 store i1 true, i1* %c, align 1, !dbg !44 call void @llvm.dbg.declare(metadata i1* %c, metadata !39, metadata !DIExpression()), !dbg !45 %0 = load i1, i1* %c, align 1, !dbg !46 br i1 %0, label %Then, label %Else, !dbg !46 Then: ; preds = %Entry br label %EndIf, !dbg !47 Else: ; preds = %Entry br label %EndIf, !dbg !47 EndIf: ; preds = %Else, %Then %1 = phi i32 [ 4, %Then ], [ 10, %Else ], !dbg !47 store i32 %1, i32* %x, align 4, !dbg !47 call void @llvm.dbg.declare(metadata i32* %x, metadata !42, metadata !DIExpression()), !dbg !48 ret void, !dbg !49 } ```

5 files changed, 404 insertions(+), 172 deletions(-)

BRANCH_TODO+18
......@@ -8,3 +8,21 @@ migrate all the alloca_list to alloca_gen_list
88migrate ir_build_var_decl_src to use ir_build_alloca_src and explicitly initialize
99
1010inferred comptime
11
12
13 if (lval == LValNone) {
14 if (result_loc->id == ResultLocIdNone)
15 return value;
16 }
17
18 assert(lval == LValPtr);
19
20 // We needed a pointer to a value, but we got a value. So we create
21 // an instruction which just makes a pointer of it.
22 return ir_build_ref(irb, scope, value->source_node, value, false, false);
23
24handle if with no else
25
26handle comptime if condition
27
28handle mixed runtime and comptime peers
src/all_types.hpp+41-2
......@@ -42,6 +42,7 @@ struct Tld;
4242struct TldExport;
4343struct IrAnalyze;
4444struct ResultLoc;
45struct ResultLocPeer;
4546
4647enum X64CABIClass {
4748 X64CABIClass_Unknown,
......@@ -2127,6 +2128,8 @@ struct IrBasicBlock {
21272128 const char *name_hint;
21282129 size_t debug_id;
21292130 size_t ref_count;
2131 // index into the basic block list
2132 size_t index;
21302133 LLVMBasicBlockRef llvm_block;
21312134 LLVMBasicBlockRef llvm_exit_block;
21322135 // The instruction that referenced this basic block and caused us to
......@@ -2315,10 +2318,14 @@ enum IrInstructionId {
23152318 IrInstructionIdUndeclaredIdent,
23162319 IrInstructionIdAllocaSrc,
23172320 IrInstructionIdAllocaGen,
2321 IrInstructionIdEndExpr,
23182322};
23192323
23202324struct IrInstruction {
23212325 IrInstructionId id;
2326 // true if this instruction was generated by zig and not from user code
2327 bool is_gen;
2328
23222329 Scope *scope;
23232330 AstNode *source_node;
23242331 ConstExprValue value;
......@@ -2332,8 +2339,6 @@ struct IrInstruction {
23322339 // with this child field.
23332340 IrInstruction *child;
23342341 IrBasicBlock *owner_bb;
2335 // true if this instruction was generated by zig and not from user code
2336 bool is_gen;
23372342};
23382343
23392344struct IrInstructionDeclVarSrc {
......@@ -3571,16 +3576,28 @@ struct IrInstructionAllocaGen {
35713576 const char *name_hint;
35723577};
35733578
3579struct IrInstructionEndExpr {
3580 IrInstruction base;
3581
3582 IrInstruction *value;
3583 ResultLoc *result_loc;
3584 LVal lval;
3585};
3586
35743587enum ResultLocId {
35753588 ResultLocIdInvalid,
35763589 ResultLocIdNone,
35773590 ResultLocIdVar,
35783591 ResultLocIdReturn,
3592 ResultLocIdPeer,
3593 ResultLocIdPeerParent,
35793594};
35803595
35813596struct ResultLoc {
35823597 ResultLocId id;
35833598 IrInstruction *source_instruction;
3599 IrInstruction *gen_instruction;
3600 ZigType *implicit_elem_type;
35843601};
35853602
35863603struct ResultLocNone {
......@@ -3597,6 +3614,28 @@ struct ResultLocReturn {
35973614 ResultLoc base;
35983615};
35993616
3617struct ResultLocPeerParent {
3618 ResultLoc base;
3619
3620 ResultLoc *parent;
3621 ResultLocPeer *peers;
3622 size_t peer_count;
3623 ZigType *resolved_type;
3624};
3625
3626struct IrSuspendPosition {
3627 size_t basic_block_index;
3628 size_t instruction_index;
3629};
3630
3631struct ResultLocPeer {
3632 ResultLoc base;
3633
3634 ResultLocPeerParent *parent;
3635 IrBasicBlock *next_bb;
3636 IrSuspendPosition suspend_pos;
3637};
3638
36003639static const size_t slice_ptr_index = 0;
36013640static const size_t slice_len_index = 1;
36023641
src/codegen.cpp+2-3
......@@ -5606,10 +5606,9 @@ static LLVMValueRef ir_render_instruction(CodeGen *g, IrExecutable *executable,
56065606 case IrInstructionIdUndeclaredIdent:
56075607 case IrInstructionIdCallSrc:
56085608 case IrInstructionIdAllocaSrc:
5609 zig_unreachable();
5610
5609 case IrInstructionIdEndExpr:
56115610 case IrInstructionIdAllocaGen:
5612 return nullptr;
5611 zig_unreachable();
56135612
56145613 case IrInstructionIdDeclVarGen:
56155614 return ir_render_decl_var(g, executable, (IrInstructionDeclVarGen *)instruction);
src/ir.cpp+316-167
......@@ -38,6 +38,7 @@ struct IrAnalyze {
3838 ZigType *explicit_return_type;
3939 AstNode *explicit_return_type_source_node;
4040 ZigList<IrInstruction *> src_implicit_return_type_list;
41 ZigList<IrSuspendPosition> resume_stack;
4142 IrBasicBlock *const_predecessor_bb;
4243};
4344
......@@ -159,7 +160,6 @@ enum UndefAllowed {
159160static IrInstruction *ir_gen_node(IrBuilder *irb, AstNode *node, Scope *scope);
160161static IrInstruction *ir_gen_node_extra(IrBuilder *irb, AstNode *node, Scope *scope, LVal lval,
161162 ResultLoc *result_loc);
162static IrInstruction *ir_analyze_instruction(IrAnalyze *ira, IrInstruction *instruction);
163163static IrInstruction *ir_implicit_cast(IrAnalyze *ira, IrInstruction *value, ZigType *expected_type);
164164static IrInstruction *ir_get_deref(IrAnalyze *ira, IrInstruction *source_instruction, IrInstruction *ptr);
165165static ErrorMsg *exec_add_error_node(CodeGen *codegen, IrExecutable *exec, AstNode *source_node, Buf *msg);
......@@ -167,7 +167,7 @@ static IrInstruction *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field_
167167 IrInstruction *source_instr, IrInstruction *container_ptr, ZigType *container_type);
168168static IrInstruction *ir_get_var_ptr(IrAnalyze *ira, IrInstruction *instruction, ZigVar *var);
169169static ZigType *ir_resolve_atomic_operand_type(IrAnalyze *ira, IrInstruction *op);
170static IrInstruction *ir_lval_wrap(IrBuilder *irb, Scope *scope, IrInstruction *value, LVal lval);
170static IrInstruction *ir_lval_wrap(IrBuilder *irb, Scope *scope, IrInstruction *value, LVal lval, ResultLoc *result_loc);
171171static ZigType *adjust_ptr_align(CodeGen *g, ZigType *ptr_type, uint32_t new_align);
172172static ZigType *adjust_slice_align(CodeGen *g, ZigType *slice_type, uint32_t new_align);
173173static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *source_node, uint8_t *buf, ConstExprValue *val);
......@@ -184,6 +184,7 @@ static IrInstruction *ir_analyze_int_to_ptr(IrAnalyze *ira, IrInstruction *sourc
184184 ZigType *ptr_type);
185185static IrInstruction *ir_analyze_bit_cast(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *value,
186186 ZigType *dest_type);
187static IrInstruction *ir_resolve_result_runtime(IrAnalyze *ira, ResultLoc *result_loc, ZigType *elem_type);
187188
188189static ConstExprValue *const_ptr_pointee_unchecked(CodeGen *g, ConstExprValue *const_val) {
189190 assert(get_src_ptr_type(const_val->type) != nullptr);
......@@ -387,6 +388,7 @@ static IrBasicBlock *ir_create_basic_block(IrBuilder *irb, Scope *scope, const c
387388 result->scope = scope;
388389 result->name_hint = name_hint;
389390 result->debug_id = exec_next_debug_id(irb->exec);
391 result->index = SIZE_MAX; // set later
390392 return result;
391393}
392394
......@@ -1036,6 +1038,10 @@ static constexpr IrInstructionId ir_instruction_id(IrInstructionAllocaGen *) {
10361038 return IrInstructionIdAllocaGen;
10371039}
10381040
1041static constexpr IrInstructionId ir_instruction_id(IrInstructionEndExpr *) {
1042 return IrInstructionIdEndExpr;
1043}
1044
10391045template<typename T>
10401046static T *ir_create_instruction(IrBuilder *irb, Scope *scope, AstNode *source_node) {
10411047 T *special_instruction = allocate<T>(1);
......@@ -1373,10 +1379,11 @@ static IrInstruction *ir_build_call_src(IrBuilder *irb, Scope *scope, AstNode *s
13731379static IrInstruction *ir_build_call_gen(IrAnalyze *ira, IrInstruction *source_instruction,
13741380 ZigFn *fn_entry, IrInstruction *fn_ref, size_t arg_count, IrInstruction **args,
13751381 FnInline fn_inline, bool is_async, IrInstruction *async_allocator, IrInstruction *new_stack,
1376 IrInstruction *result_loc)
1382 ResultLoc *result_loc, ZigType *return_type)
13771383{
13781384 IrInstructionCallGen *call_instruction = ir_build_instruction<IrInstructionCallGen>(&ira->new_irb,
13791385 source_instruction->scope, source_instruction->source_node);
1386 call_instruction->base.value.type = return_type;
13801387 call_instruction->fn_entry = fn_entry;
13811388 call_instruction->fn_ref = fn_ref;
13821389 call_instruction->fn_inline = fn_inline;
......@@ -1385,14 +1392,14 @@ static IrInstruction *ir_build_call_gen(IrAnalyze *ira, IrInstruction *source_in
13851392 call_instruction->is_async = is_async;
13861393 call_instruction->async_allocator = async_allocator;
13871394 call_instruction->new_stack = new_stack;
1388 call_instruction->result_loc = result_loc;
1395 call_instruction->result_loc = ir_resolve_result_runtime(ira, result_loc, return_type);
13891396
13901397 if (fn_ref != nullptr) ir_ref_instruction(fn_ref, ira->new_irb.current_basic_block);
13911398 for (size_t i = 0; i < arg_count; i += 1)
13921399 ir_ref_instruction(args[i], ira->new_irb.current_basic_block);
13931400 if (async_allocator != nullptr) ir_ref_instruction(async_allocator, ira->new_irb.current_basic_block);
13941401 if (new_stack != nullptr) ir_ref_instruction(new_stack, ira->new_irb.current_basic_block);
1395 if (result_loc != nullptr) ir_ref_instruction(result_loc, ira->new_irb.current_basic_block);
1402 if (call_instruction->result_loc != nullptr) ir_ref_instruction(call_instruction->result_loc, ira->new_irb.current_basic_block);
13961403
13971404 return &call_instruction->base;
13981405}
......@@ -3187,6 +3194,19 @@ static IrInstructionAllocaGen *ir_create_alloca_gen(IrAnalyze *ira, IrInstructio
31873194 return instruction;
31883195}
31893196
3197static IrInstruction *ir_build_end_expr(IrBuilder *irb, Scope *scope, AstNode *source_node,
3198 IrInstruction *value, LVal lval, ResultLoc *result_loc)
3199{
3200 IrInstructionEndExpr *instruction = ir_build_instruction<IrInstructionEndExpr>(irb, scope, source_node);
3201 instruction->value = value;
3202 instruction->lval = lval;
3203 instruction->result_loc = result_loc;
3204
3205 ir_ref_instruction(value, irb->current_basic_block);
3206
3207 return &instruction->base;
3208}
3209
31903210static void ir_count_defers(IrBuilder *irb, Scope *inner_scope, Scope *outer_scope, size_t *results) {
31913211 results[ReturnKindUnconditional] = 0;
31923212 results[ReturnKindError] = 0;
......@@ -3287,6 +3307,7 @@ static void ir_set_cursor_at_end(IrBuilder *irb, IrBasicBlock *basic_block) {
32873307}
32883308
32893309static void ir_set_cursor_at_end_and_append_block(IrBuilder *irb, IrBasicBlock *basic_block) {
3310 basic_block->index = irb->exec->basic_block_list.length;
32903311 irb->exec->basic_block_list.append(basic_block);
32913312 ir_set_cursor_at_end(irb, basic_block);
32923313}
......@@ -3623,6 +3644,8 @@ static IrInstruction *ir_gen_block(IrBuilder *irb, Scope *parent_scope, AstNode
36233644 // keep the last noreturn statement value around in case we need to return it
36243645 noreturn_return_value = statement_value;
36253646 }
3647 // This logic must be kept in sync with
3648 // [STMT_EXPR_TEST_THING] <--- (search this token)
36263649 if (statement_node->type == NodeTypeDefer && statement_value != irb->codegen->invalid_instruction) {
36273650 // defer starts a new scope
36283651 child_scope = statement_node->data.defer.child_scope;
......@@ -4164,7 +4187,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
41644187 return arg;
41654188
41664189 IrInstruction *type_of = ir_build_typeof(irb, scope, node, arg);
4167 return ir_lval_wrap(irb, scope, type_of, lval);
4190 return ir_lval_wrap(irb, scope, type_of, lval, result_loc);
41684191 }
41694192 case BuiltinFnIdSetCold:
41704193 {
......@@ -4174,7 +4197,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
41744197 return arg0_value;
41754198
41764199 IrInstruction *set_cold = ir_build_set_cold(irb, scope, node, arg0_value);
4177 return ir_lval_wrap(irb, scope, set_cold, lval);
4200 return ir_lval_wrap(irb, scope, set_cold, lval, result_loc);
41784201 }
41794202 case BuiltinFnIdSetRuntimeSafety:
41804203 {
......@@ -4184,7 +4207,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
41844207 return arg0_value;
41854208
41864209 IrInstruction *set_safety = ir_build_set_runtime_safety(irb, scope, node, arg0_value);
4187 return ir_lval_wrap(irb, scope, set_safety, lval);
4210 return ir_lval_wrap(irb, scope, set_safety, lval, result_loc);
41884211 }
41894212 case BuiltinFnIdSetFloatMode:
41904213 {
......@@ -4194,7 +4217,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
41944217 return arg0_value;
41954218
41964219 IrInstruction *set_float_mode = ir_build_set_float_mode(irb, scope, node, arg0_value);
4197 return ir_lval_wrap(irb, scope, set_float_mode, lval);
4220 return ir_lval_wrap(irb, scope, set_float_mode, lval, result_loc);
41984221 }
41994222 case BuiltinFnIdSizeof:
42004223 {
......@@ -4204,7 +4227,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
42044227 return arg0_value;
42054228
42064229 IrInstruction *size_of = ir_build_size_of(irb, scope, node, arg0_value);
4207 return ir_lval_wrap(irb, scope, size_of, lval);
4230 return ir_lval_wrap(irb, scope, size_of, lval, result_loc);
42084231 }
42094232 case BuiltinFnIdImport:
42104233 {
......@@ -4214,12 +4237,12 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
42144237 return arg0_value;
42154238
42164239 IrInstruction *import = ir_build_import(irb, scope, node, arg0_value);
4217 return ir_lval_wrap(irb, scope, import, lval);
4240 return ir_lval_wrap(irb, scope, import, lval, result_loc);
42184241 }
42194242 case BuiltinFnIdCImport:
42204243 {
42214244 IrInstruction *c_import = ir_build_c_import(irb, scope, node);
4222 return ir_lval_wrap(irb, scope, c_import, lval);
4245 return ir_lval_wrap(irb, scope, c_import, lval, result_loc);
42234246 }
42244247 case BuiltinFnIdCInclude:
42254248 {
......@@ -4234,7 +4257,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
42344257 }
42354258
42364259 IrInstruction *c_include = ir_build_c_include(irb, scope, node, arg0_value);
4237 return ir_lval_wrap(irb, scope, c_include, lval);
4260 return ir_lval_wrap(irb, scope, c_include, lval, result_loc);
42384261 }
42394262 case BuiltinFnIdCDefine:
42404263 {
......@@ -4254,7 +4277,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
42544277 }
42554278
42564279 IrInstruction *c_define = ir_build_c_define(irb, scope, node, arg0_value, arg1_value);
4257 return ir_lval_wrap(irb, scope, c_define, lval);
4280 return ir_lval_wrap(irb, scope, c_define, lval, result_loc);
42584281 }
42594282 case BuiltinFnIdCUndef:
42604283 {
......@@ -4269,7 +4292,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
42694292 }
42704293
42714294 IrInstruction *c_undef = ir_build_c_undef(irb, scope, node, arg0_value);
4272 return ir_lval_wrap(irb, scope, c_undef, lval);
4295 return ir_lval_wrap(irb, scope, c_undef, lval, result_loc);
42734296 }
42744297 case BuiltinFnIdCompileErr:
42754298 {
......@@ -4279,7 +4302,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
42794302 return arg0_value;
42804303
42814304 IrInstruction *compile_err = ir_build_compile_err(irb, scope, node, arg0_value);
4282 return ir_lval_wrap(irb, scope, compile_err, lval);
4305 return ir_lval_wrap(irb, scope, compile_err, lval, result_loc);
42834306 }
42844307 case BuiltinFnIdCompileLog:
42854308 {
......@@ -4293,7 +4316,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
42934316 }
42944317
42954318 IrInstruction *compile_log = ir_build_compile_log(irb, scope, node, actual_param_count, args);
4296 return ir_lval_wrap(irb, scope, compile_log, lval);
4319 return ir_lval_wrap(irb, scope, compile_log, lval, result_loc);
42974320 }
42984321 case BuiltinFnIdErrName:
42994322 {
......@@ -4303,7 +4326,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
43034326 return arg0_value;
43044327
43054328 IrInstruction *err_name = ir_build_err_name(irb, scope, node, arg0_value);
4306 return ir_lval_wrap(irb, scope, err_name, lval);
4329 return ir_lval_wrap(irb, scope, err_name, lval, result_loc);
43074330 }
43084331 case BuiltinFnIdEmbedFile:
43094332 {
......@@ -4313,7 +4336,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
43134336 return arg0_value;
43144337
43154338 IrInstruction *embed_file = ir_build_embed_file(irb, scope, node, arg0_value);
4316 return ir_lval_wrap(irb, scope, embed_file, lval);
4339 return ir_lval_wrap(irb, scope, embed_file, lval, result_loc);
43174340 }
43184341 case BuiltinFnIdCmpxchgWeak:
43194342 case BuiltinFnIdCmpxchgStrong:
......@@ -4350,7 +4373,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
43504373
43514374 IrInstruction *cmpxchg = ir_build_cmpxchg_src(irb, scope, node, arg0_value, arg1_value,
43524375 arg2_value, arg3_value, arg4_value, arg5_value, (builtin_fn->id == BuiltinFnIdCmpxchgWeak));
4353 return ir_lval_wrap(irb, scope, cmpxchg, lval);
4376 return ir_lval_wrap(irb, scope, cmpxchg, lval, result_loc);
43544377 }
43554378 case BuiltinFnIdFence:
43564379 {
......@@ -4360,7 +4383,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
43604383 return arg0_value;
43614384
43624385 IrInstruction *fence = ir_build_fence(irb, scope, node, arg0_value, AtomicOrderUnordered);
4363 return ir_lval_wrap(irb, scope, fence, lval);
4386 return ir_lval_wrap(irb, scope, fence, lval, result_loc);
43644387 }
43654388 case BuiltinFnIdDivExact:
43664389 {
......@@ -4375,7 +4398,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
43754398 return arg1_value;
43764399
43774400 IrInstruction *bin_op = ir_build_bin_op(irb, scope, node, IrBinOpDivExact, arg0_value, arg1_value, true);
4378 return ir_lval_wrap(irb, scope, bin_op, lval);
4401 return ir_lval_wrap(irb, scope, bin_op, lval, result_loc);
43794402 }
43804403 case BuiltinFnIdDivTrunc:
43814404 {
......@@ -4390,7 +4413,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
43904413 return arg1_value;
43914414
43924415 IrInstruction *bin_op = ir_build_bin_op(irb, scope, node, IrBinOpDivTrunc, arg0_value, arg1_value, true);
4393 return ir_lval_wrap(irb, scope, bin_op, lval);
4416 return ir_lval_wrap(irb, scope, bin_op, lval, result_loc);
43944417 }
43954418 case BuiltinFnIdDivFloor:
43964419 {
......@@ -4405,7 +4428,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
44054428 return arg1_value;
44064429
44074430 IrInstruction *bin_op = ir_build_bin_op(irb, scope, node, IrBinOpDivFloor, arg0_value, arg1_value, true);
4408 return ir_lval_wrap(irb, scope, bin_op, lval);
4431 return ir_lval_wrap(irb, scope, bin_op, lval, result_loc);
44094432 }
44104433 case BuiltinFnIdRem:
44114434 {
......@@ -4420,7 +4443,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
44204443 return arg1_value;
44214444
44224445 IrInstruction *bin_op = ir_build_bin_op(irb, scope, node, IrBinOpRemRem, arg0_value, arg1_value, true);
4423 return ir_lval_wrap(irb, scope, bin_op, lval);
4446 return ir_lval_wrap(irb, scope, bin_op, lval, result_loc);
44244447 }
44254448 case BuiltinFnIdMod:
44264449 {
......@@ -4435,7 +4458,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
44354458 return arg1_value;
44364459
44374460 IrInstruction *bin_op = ir_build_bin_op(irb, scope, node, IrBinOpRemMod, arg0_value, arg1_value, true);
4438 return ir_lval_wrap(irb, scope, bin_op, lval);
4461 return ir_lval_wrap(irb, scope, bin_op, lval, result_loc);
44394462 }
44404463 case BuiltinFnIdSqrt:
44414464 {
......@@ -4450,7 +4473,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
44504473 return arg1_value;
44514474
44524475 IrInstruction *ir_sqrt = ir_build_sqrt(irb, scope, node, arg0_value, arg1_value);
4453 return ir_lval_wrap(irb, scope, ir_sqrt, lval);
4476 return ir_lval_wrap(irb, scope, ir_sqrt, lval, result_loc);
44544477 }
44554478 case BuiltinFnIdTruncate:
44564479 {
......@@ -4465,7 +4488,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
44654488 return arg1_value;
44664489
44674490 IrInstruction *truncate = ir_build_truncate(irb, scope, node, arg0_value, arg1_value);
4468 return ir_lval_wrap(irb, scope, truncate, lval);
4491 return ir_lval_wrap(irb, scope, truncate, lval, result_loc);
44694492 }
44704493 case BuiltinFnIdIntCast:
44714494 {
......@@ -4480,7 +4503,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
44804503 return arg1_value;
44814504
44824505 IrInstruction *result = ir_build_int_cast(irb, scope, node, arg0_value, arg1_value);
4483 return ir_lval_wrap(irb, scope, result, lval);
4506 return ir_lval_wrap(irb, scope, result, lval, result_loc);
44844507 }
44854508 case BuiltinFnIdFloatCast:
44864509 {
......@@ -4495,7 +4518,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
44954518 return arg1_value;
44964519
44974520 IrInstruction *result = ir_build_float_cast(irb, scope, node, arg0_value, arg1_value);
4498 return ir_lval_wrap(irb, scope, result, lval);
4521 return ir_lval_wrap(irb, scope, result, lval, result_loc);
44994522 }
45004523 case BuiltinFnIdErrSetCast:
45014524 {
......@@ -4510,7 +4533,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
45104533 return arg1_value;
45114534
45124535 IrInstruction *result = ir_build_err_set_cast(irb, scope, node, arg0_value, arg1_value);
4513 return ir_lval_wrap(irb, scope, result, lval);
4536 return ir_lval_wrap(irb, scope, result, lval, result_loc);
45144537 }
45154538 case BuiltinFnIdFromBytes:
45164539 {
......@@ -4525,7 +4548,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
45254548 return arg1_value;
45264549
45274550 IrInstruction *result = ir_build_from_bytes(irb, scope, node, arg0_value, arg1_value);
4528 return ir_lval_wrap(irb, scope, result, lval);
4551 return ir_lval_wrap(irb, scope, result, lval, result_loc);
45294552 }
45304553 case BuiltinFnIdToBytes:
45314554 {
......@@ -4535,7 +4558,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
45354558 return arg0_value;
45364559
45374560 IrInstruction *result = ir_build_to_bytes(irb, scope, node, arg0_value);
4538 return ir_lval_wrap(irb, scope, result, lval);
4561 return ir_lval_wrap(irb, scope, result, lval, result_loc);
45394562 }
45404563 case BuiltinFnIdIntToFloat:
45414564 {
......@@ -4550,7 +4573,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
45504573 return arg1_value;
45514574
45524575 IrInstruction *result = ir_build_int_to_float(irb, scope, node, arg0_value, arg1_value);
4553 return ir_lval_wrap(irb, scope, result, lval);
4576 return ir_lval_wrap(irb, scope, result, lval, result_loc);
45544577 }
45554578 case BuiltinFnIdFloatToInt:
45564579 {
......@@ -4565,7 +4588,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
45654588 return arg1_value;
45664589
45674590 IrInstruction *result = ir_build_float_to_int(irb, scope, node, arg0_value, arg1_value);
4568 return ir_lval_wrap(irb, scope, result, lval);
4591 return ir_lval_wrap(irb, scope, result, lval, result_loc);
45694592 }
45704593 case BuiltinFnIdErrToInt:
45714594 {
......@@ -4575,7 +4598,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
45754598 return arg0_value;
45764599
45774600 IrInstruction *result = ir_build_err_to_int(irb, scope, node, arg0_value);
4578 return ir_lval_wrap(irb, scope, result, lval);
4601 return ir_lval_wrap(irb, scope, result, lval, result_loc);
45794602 }
45804603 case BuiltinFnIdIntToErr:
45814604 {
......@@ -4585,7 +4608,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
45854608 return arg0_value;
45864609
45874610 IrInstruction *result = ir_build_int_to_err(irb, scope, node, arg0_value);
4588 return ir_lval_wrap(irb, scope, result, lval);
4611 return ir_lval_wrap(irb, scope, result, lval, result_loc);
45894612 }
45904613 case BuiltinFnIdBoolToInt:
45914614 {
......@@ -4595,7 +4618,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
45954618 return arg0_value;
45964619
45974620 IrInstruction *result = ir_build_bool_to_int(irb, scope, node, arg0_value);
4598 return ir_lval_wrap(irb, scope, result, lval);
4621 return ir_lval_wrap(irb, scope, result, lval, result_loc);
45994622 }
46004623 case BuiltinFnIdIntType:
46014624 {
......@@ -4610,7 +4633,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
46104633 return arg1_value;
46114634
46124635 IrInstruction *int_type = ir_build_int_type(irb, scope, node, arg0_value, arg1_value);
4613 return ir_lval_wrap(irb, scope, int_type, lval);
4636 return ir_lval_wrap(irb, scope, int_type, lval, result_loc);
46144637 }
46154638 case BuiltinFnIdVectorType:
46164639 {
......@@ -4625,7 +4648,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
46254648 return arg1_value;
46264649
46274650 IrInstruction *vector_type = ir_build_vector_type(irb, scope, node, arg0_value, arg1_value);
4628 return ir_lval_wrap(irb, scope, vector_type, lval);
4651 return ir_lval_wrap(irb, scope, vector_type, lval, result_loc);
46294652 }
46304653 case BuiltinFnIdMemcpy:
46314654 {
......@@ -4645,7 +4668,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
46454668 return arg2_value;
46464669
46474670 IrInstruction *ir_memcpy = ir_build_memcpy(irb, scope, node, arg0_value, arg1_value, arg2_value);
4648 return ir_lval_wrap(irb, scope, ir_memcpy, lval);
4671 return ir_lval_wrap(irb, scope, ir_memcpy, lval, result_loc);
46494672 }
46504673 case BuiltinFnIdMemset:
46514674 {
......@@ -4665,7 +4688,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
46654688 return arg2_value;
46664689
46674690 IrInstruction *ir_memset = ir_build_memset(irb, scope, node, arg0_value, arg1_value, arg2_value);
4668 return ir_lval_wrap(irb, scope, ir_memset, lval);
4691 return ir_lval_wrap(irb, scope, ir_memset, lval, result_loc);
46694692 }
46704693 case BuiltinFnIdMemberCount:
46714694 {
......@@ -4675,7 +4698,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
46754698 return arg0_value;
46764699
46774700 IrInstruction *member_count = ir_build_member_count(irb, scope, node, arg0_value);
4678 return ir_lval_wrap(irb, scope, member_count, lval);
4701 return ir_lval_wrap(irb, scope, member_count, lval, result_loc);
46794702 }
46804703 case BuiltinFnIdMemberType:
46814704 {
......@@ -4691,7 +4714,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
46914714
46924715
46934716 IrInstruction *member_type = ir_build_member_type(irb, scope, node, arg0_value, arg1_value);
4694 return ir_lval_wrap(irb, scope, member_type, lval);
4717 return ir_lval_wrap(irb, scope, member_type, lval, result_loc);
46954718 }
46964719 case BuiltinFnIdMemberName:
46974720 {
......@@ -4707,7 +4730,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
47074730
47084731
47094732 IrInstruction *member_name = ir_build_member_name(irb, scope, node, arg0_value, arg1_value);
4710 return ir_lval_wrap(irb, scope, member_name, lval);
4733 return ir_lval_wrap(irb, scope, member_name, lval, result_loc);
47114734 }
47124735 case BuiltinFnIdField:
47134736 {
......@@ -4736,14 +4759,14 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
47364759 return arg0_value;
47374760
47384761 IrInstruction *type_info = ir_build_type_info(irb, scope, node, arg0_value);
4739 return ir_lval_wrap(irb, scope, type_info, lval);
4762 return ir_lval_wrap(irb, scope, type_info, lval, result_loc);
47404763 }
47414764 case BuiltinFnIdBreakpoint:
4742 return ir_lval_wrap(irb, scope, ir_build_breakpoint(irb, scope, node), lval);
4765 return ir_lval_wrap(irb, scope, ir_build_breakpoint(irb, scope, node), lval, result_loc);
47434766 case BuiltinFnIdReturnAddress:
4744 return ir_lval_wrap(irb, scope, ir_build_return_address(irb, scope, node), lval);
4767 return ir_lval_wrap(irb, scope, ir_build_return_address(irb, scope, node), lval, result_loc);
47454768 case BuiltinFnIdFrameAddress:
4746 return ir_lval_wrap(irb, scope, ir_build_frame_address(irb, scope, node), lval);
4769 return ir_lval_wrap(irb, scope, ir_build_frame_address(irb, scope, node), lval, result_loc);
47474770 case BuiltinFnIdHandle:
47484771 if (!irb->exec->fn_entry) {
47494772 add_node_error(irb->codegen, node, buf_sprintf("@handle() called outside of function definition"));
......@@ -4753,7 +4776,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
47534776 add_node_error(irb->codegen, node, buf_sprintf("@handle() in non-async function"));
47544777 return irb->codegen->invalid_instruction;
47554778 }
4756 return ir_lval_wrap(irb, scope, ir_build_handle(irb, scope, node), lval);
4779 return ir_lval_wrap(irb, scope, ir_build_handle(irb, scope, node), lval, result_loc);
47574780 case BuiltinFnIdAlignOf:
47584781 {
47594782 AstNode *arg0_node = node->data.fn_call_expr.params.at(0);
......@@ -4762,16 +4785,16 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
47624785 return arg0_value;
47634786
47644787 IrInstruction *align_of = ir_build_align_of(irb, scope, node, arg0_value);
4765 return ir_lval_wrap(irb, scope, align_of, lval);
4788 return ir_lval_wrap(irb, scope, align_of, lval, result_loc);
47664789 }
47674790 case BuiltinFnIdAddWithOverflow:
4768 return ir_lval_wrap(irb, scope, ir_gen_overflow_op(irb, scope, node, IrOverflowOpAdd), lval);
4791 return ir_lval_wrap(irb, scope, ir_gen_overflow_op(irb, scope, node, IrOverflowOpAdd), lval, result_loc);
47694792 case BuiltinFnIdSubWithOverflow:
4770 return ir_lval_wrap(irb, scope, ir_gen_overflow_op(irb, scope, node, IrOverflowOpSub), lval);
4793 return ir_lval_wrap(irb, scope, ir_gen_overflow_op(irb, scope, node, IrOverflowOpSub), lval, result_loc);
47714794 case BuiltinFnIdMulWithOverflow:
4772 return ir_lval_wrap(irb, scope, ir_gen_overflow_op(irb, scope, node, IrOverflowOpMul), lval);
4795 return ir_lval_wrap(irb, scope, ir_gen_overflow_op(irb, scope, node, IrOverflowOpMul), lval, result_loc);
47734796 case BuiltinFnIdShlWithOverflow:
4774 return ir_lval_wrap(irb, scope, ir_gen_overflow_op(irb, scope, node, IrOverflowOpShl), lval);
4797 return ir_lval_wrap(irb, scope, ir_gen_overflow_op(irb, scope, node, IrOverflowOpShl), lval, result_loc);
47754798 case BuiltinFnIdTypeName:
47764799 {
47774800 AstNode *arg0_node = node->data.fn_call_expr.params.at(0);
......@@ -4780,7 +4803,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
47804803 return arg0_value;
47814804
47824805 IrInstruction *type_name = ir_build_type_name(irb, scope, node, arg0_value);
4783 return ir_lval_wrap(irb, scope, type_name, lval);
4806 return ir_lval_wrap(irb, scope, type_name, lval, result_loc);
47844807 }
47854808 case BuiltinFnIdPanic:
47864809 {
......@@ -4790,7 +4813,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
47904813 return arg0_value;
47914814
47924815 IrInstruction *panic = ir_build_panic(irb, scope, node, arg0_value);
4793 return ir_lval_wrap(irb, scope, panic, lval);
4816 return ir_lval_wrap(irb, scope, panic, lval, result_loc);
47944817 }
47954818 case BuiltinFnIdPtrCast:
47964819 {
......@@ -4805,7 +4828,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
48054828 return arg1_value;
48064829
48074830 IrInstruction *ptr_cast = ir_build_ptr_cast_src(irb, scope, node, arg0_value, arg1_value, true);
4808 return ir_lval_wrap(irb, scope, ptr_cast, lval);
4831 return ir_lval_wrap(irb, scope, ptr_cast, lval, result_loc);
48094832 }
48104833 case BuiltinFnIdBitCast:
48114834 {
......@@ -4820,7 +4843,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
48204843 return arg1_value;
48214844
48224845 IrInstruction *bit_cast = ir_build_bit_cast(irb, scope, node, arg0_value, arg1_value);
4823 return ir_lval_wrap(irb, scope, bit_cast, lval);
4846 return ir_lval_wrap(irb, scope, bit_cast, lval, result_loc);
48244847 }
48254848 case BuiltinFnIdIntToPtr:
48264849 {
......@@ -4835,7 +4858,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
48354858 return arg1_value;
48364859
48374860 IrInstruction *int_to_ptr = ir_build_int_to_ptr(irb, scope, node, arg0_value, arg1_value);
4838 return ir_lval_wrap(irb, scope, int_to_ptr, lval);
4861 return ir_lval_wrap(irb, scope, int_to_ptr, lval, result_loc);
48394862 }
48404863 case BuiltinFnIdPtrToInt:
48414864 {
......@@ -4845,7 +4868,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
48454868 return arg0_value;
48464869
48474870 IrInstruction *ptr_to_int = ir_build_ptr_to_int(irb, scope, node, arg0_value);
4848 return ir_lval_wrap(irb, scope, ptr_to_int, lval);
4871 return ir_lval_wrap(irb, scope, ptr_to_int, lval, result_loc);
48494872 }
48504873 case BuiltinFnIdTagName:
48514874 {
......@@ -4856,7 +4879,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
48564879
48574880 IrInstruction *actual_tag = ir_build_union_tag(irb, scope, node, arg0_value);
48584881 IrInstruction *tag_name = ir_build_tag_name(irb, scope, node, actual_tag);
4859 return ir_lval_wrap(irb, scope, tag_name, lval);
4882 return ir_lval_wrap(irb, scope, tag_name, lval, result_loc);
48604883 }
48614884 case BuiltinFnIdTagType:
48624885 {
......@@ -4866,7 +4889,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
48664889 return arg0_value;
48674890
48684891 IrInstruction *tag_type = ir_build_tag_type(irb, scope, node, arg0_value);
4869 return ir_lval_wrap(irb, scope, tag_type, lval);
4892 return ir_lval_wrap(irb, scope, tag_type, lval, result_loc);
48704893 }
48714894 case BuiltinFnIdFieldParentPtr:
48724895 {
......@@ -4886,7 +4909,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
48864909 return arg2_value;
48874910
48884911 IrInstruction *field_parent_ptr = ir_build_field_parent_ptr(irb, scope, node, arg0_value, arg1_value, arg2_value, nullptr);
4889 return ir_lval_wrap(irb, scope, field_parent_ptr, lval);
4912 return ir_lval_wrap(irb, scope, field_parent_ptr, lval, result_loc);
48904913 }
48914914 case BuiltinFnIdByteOffsetOf:
48924915 {
......@@ -4901,7 +4924,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
49014924 return arg1_value;
49024925
49034926 IrInstruction *offset_of = ir_build_byte_offset_of(irb, scope, node, arg0_value, arg1_value);
4904 return ir_lval_wrap(irb, scope, offset_of, lval);
4927 return ir_lval_wrap(irb, scope, offset_of, lval, result_loc);
49054928 }
49064929 case BuiltinFnIdBitOffsetOf:
49074930 {
......@@ -4916,7 +4939,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
49164939 return arg1_value;
49174940
49184941 IrInstruction *offset_of = ir_build_bit_offset_of(irb, scope, node, arg0_value, arg1_value);
4919 return ir_lval_wrap(irb, scope, offset_of, lval);
4942 return ir_lval_wrap(irb, scope, offset_of, lval, result_loc);
49204943 }
49214944 case BuiltinFnIdInlineCall:
49224945 case BuiltinFnIdNoInlineCall:
......@@ -4944,7 +4967,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
49444967
49454968 IrInstruction *call = ir_build_call_src(irb, scope, node, nullptr, fn_ref, arg_count, args, false,
49464969 fn_inline, false, nullptr, nullptr, result_loc);
4947 return ir_lval_wrap(irb, scope, call, lval);
4970 return ir_lval_wrap(irb, scope, call, lval, result_loc);
49484971 }
49494972 case BuiltinFnIdNewStackCall:
49504973 {
......@@ -4975,7 +4998,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
49754998
49764999 IrInstruction *call = ir_build_call_src(irb, scope, node, nullptr, fn_ref, arg_count, args, false,
49775000 FnInlineAuto, false, nullptr, new_stack, result_loc);
4978 return ir_lval_wrap(irb, scope, call, lval);
5001 return ir_lval_wrap(irb, scope, call, lval, result_loc);
49795002 }
49805003 case BuiltinFnIdTypeId:
49815004 {
......@@ -4985,7 +5008,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
49855008 return arg0_value;
49865009
49875010 IrInstruction *type_id = ir_build_type_id(irb, scope, node, arg0_value);
4988 return ir_lval_wrap(irb, scope, type_id, lval);
5011 return ir_lval_wrap(irb, scope, type_id, lval, result_loc);
49895012 }
49905013 case BuiltinFnIdShlExact:
49915014 {
......@@ -5000,7 +5023,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
50005023 return arg1_value;
50015024
50025025 IrInstruction *bin_op = ir_build_bin_op(irb, scope, node, IrBinOpBitShiftLeftExact, arg0_value, arg1_value, true);
5003 return ir_lval_wrap(irb, scope, bin_op, lval);
5026 return ir_lval_wrap(irb, scope, bin_op, lval, result_loc);
50045027 }
50055028 case BuiltinFnIdShrExact:
50065029 {
......@@ -5015,7 +5038,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
50155038 return arg1_value;
50165039
50175040 IrInstruction *bin_op = ir_build_bin_op(irb, scope, node, IrBinOpBitShiftRightExact, arg0_value, arg1_value, true);
5018 return ir_lval_wrap(irb, scope, bin_op, lval);
5041 return ir_lval_wrap(irb, scope, bin_op, lval, result_loc);
50195042 }
50205043 case BuiltinFnIdSetEvalBranchQuota:
50215044 {
......@@ -5025,7 +5048,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
50255048 return arg0_value;
50265049
50275050 IrInstruction *set_eval_branch_quota = ir_build_set_eval_branch_quota(irb, scope, node, arg0_value);
5028 return ir_lval_wrap(irb, scope, set_eval_branch_quota, lval);
5051 return ir_lval_wrap(irb, scope, set_eval_branch_quota, lval, result_loc);
50295052 }
50305053 case BuiltinFnIdAlignCast:
50315054 {
......@@ -5040,17 +5063,17 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
50405063 return arg1_value;
50415064
50425065 IrInstruction *align_cast = ir_build_align_cast(irb, scope, node, arg0_value, arg1_value);
5043 return ir_lval_wrap(irb, scope, align_cast, lval);
5066 return ir_lval_wrap(irb, scope, align_cast, lval, result_loc);
50445067 }
50455068 case BuiltinFnIdOpaqueType:
50465069 {
50475070 IrInstruction *opaque_type = ir_build_opaque_type(irb, scope, node);
5048 return ir_lval_wrap(irb, scope, opaque_type, lval);
5071 return ir_lval_wrap(irb, scope, opaque_type, lval, result_loc);
50495072 }
50505073 case BuiltinFnIdThis:
50515074 {
50525075 IrInstruction *this_inst = ir_gen_this(irb, scope, node);
5053 return ir_lval_wrap(irb, scope, this_inst, lval);
5076 return ir_lval_wrap(irb, scope, this_inst, lval, result_loc);
50545077 }
50555078 case BuiltinFnIdSetAlignStack:
50565079 {
......@@ -5060,7 +5083,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
50605083 return arg0_value;
50615084
50625085 IrInstruction *set_align_stack = ir_build_set_align_stack(irb, scope, node, arg0_value);
5063 return ir_lval_wrap(irb, scope, set_align_stack, lval);
5086 return ir_lval_wrap(irb, scope, set_align_stack, lval, result_loc);
50645087 }
50655088 case BuiltinFnIdArgType:
50665089 {
......@@ -5075,7 +5098,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
50755098 return arg1_value;
50765099
50775100 IrInstruction *arg_type = ir_build_arg_type(irb, scope, node, arg0_value, arg1_value);
5078 return ir_lval_wrap(irb, scope, arg_type, lval);
5101 return ir_lval_wrap(irb, scope, arg_type, lval, result_loc);
50795102 }
50805103 case BuiltinFnIdExport:
50815104 {
......@@ -5095,12 +5118,12 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
50955118 return arg2_value;
50965119
50975120 IrInstruction *ir_export = ir_build_export(irb, scope, node, arg0_value, arg1_value, arg2_value);
5098 return ir_lval_wrap(irb, scope, ir_export, lval);
5121 return ir_lval_wrap(irb, scope, ir_export, lval, result_loc);
50995122 }
51005123 case BuiltinFnIdErrorReturnTrace:
51015124 {
51025125 IrInstruction *error_return_trace = ir_build_error_return_trace(irb, scope, node, IrInstructionErrorReturnTrace::Null);
5103 return ir_lval_wrap(irb, scope, error_return_trace, lval);
5126 return ir_lval_wrap(irb, scope, error_return_trace, lval, result_loc);
51045127 }
51055128 case BuiltinFnIdAtomicRmw:
51065129 {
......@@ -5168,7 +5191,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
51685191 return arg1_value;
51695192
51705193 IrInstruction *result = ir_build_int_to_enum(irb, scope, node, arg0_value, arg1_value);
5171 return ir_lval_wrap(irb, scope, result, lval);
5194 return ir_lval_wrap(irb, scope, result, lval, result_loc);
51725195 }
51735196 case BuiltinFnIdEnumToInt:
51745197 {
......@@ -5178,7 +5201,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
51785201 return arg0_value;
51795202
51805203 IrInstruction *result = ir_build_enum_to_int(irb, scope, node, arg0_value);
5181 return ir_lval_wrap(irb, scope, result, lval);
5204 return ir_lval_wrap(irb, scope, result, lval, result_loc);
51825205 }
51835206 case BuiltinFnIdCtz:
51845207 case BuiltinFnIdPopCount:
......@@ -5216,7 +5239,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
52165239 default:
52175240 zig_unreachable();
52185241 }
5219 return ir_lval_wrap(irb, scope, result, lval);
5242 return ir_lval_wrap(irb, scope, result, lval, result_loc);
52205243 }
52215244 case BuiltinFnIdHasDecl:
52225245 {
......@@ -5231,7 +5254,7 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
52315254 return arg1_value;
52325255
52335256 IrInstruction *has_decl = ir_build_has_decl(irb, scope, node, arg0_value, arg1_value);
5234 return ir_lval_wrap(irb, scope, has_decl, lval);
5257 return ir_lval_wrap(irb, scope, has_decl, lval, result_loc);
52355258 }
52365259 }
52375260 zig_unreachable();
......@@ -5271,10 +5294,12 @@ static IrInstruction *ir_gen_fn_call(IrBuilder *irb, Scope *scope, AstNode *node
52715294
52725295 IrInstruction *fn_call = ir_build_call_src(irb, scope, node, nullptr, fn_ref, arg_count, args, false, FnInlineAuto,
52735296 is_async, async_allocator, nullptr, result_loc);
5274 return ir_lval_wrap(irb, scope, fn_call, lval);
5297 return ir_lval_wrap(irb, scope, fn_call, lval, result_loc);
52755298}
52765299
5277static IrInstruction *ir_gen_if_bool_expr(IrBuilder *irb, Scope *scope, AstNode *node) {
5300static IrInstruction *ir_gen_if_bool_expr(IrBuilder *irb, Scope *scope, AstNode *node, LVal lval,
5301 ResultLoc *result_loc)
5302{
52785303 assert(node->type == NodeTypeIfBoolExpr);
52795304
52805305 IrInstruction *condition = ir_gen_node(irb, node->data.if_bool_expr.condition, scope);
......@@ -5295,12 +5320,29 @@ static IrInstruction *ir_gen_if_bool_expr(IrBuilder *irb, Scope *scope, AstNode
52955320 IrBasicBlock *else_block = ir_create_basic_block(irb, scope, "Else");
52965321 IrBasicBlock *endif_block = ir_create_basic_block(irb, scope, "EndIf");
52975322
5298 ir_build_cond_br(irb, scope, condition->source_node, condition, then_block, else_block, is_comptime);
5323 IrInstruction *cond_br_inst = ir_build_cond_br(irb, scope, condition->source_node, condition,
5324 then_block, else_block, is_comptime);
5325
5326 ResultLocPeerParent *peer_parent = allocate<ResultLocPeerParent>(1);
5327 peer_parent->base.id = ResultLocIdPeerParent;
5328 peer_parent->base.source_instruction = cond_br_inst;
5329 peer_parent->parent = result_loc;
5330 peer_parent->peer_count = 2;
5331 peer_parent->peers = allocate<ResultLocPeer>(2);
5332 peer_parent->peers[0].base.id = ResultLocIdPeer;
5333 peer_parent->peers[0].base.source_instruction = cond_br_inst;
5334 peer_parent->peers[0].parent = peer_parent;
5335 peer_parent->peers[0].next_bb = else_block;
5336 peer_parent->peers[1].base.id = ResultLocIdPeer;
5337 peer_parent->peers[1].base.source_instruction = cond_br_inst;
5338 peer_parent->peers[1].parent = peer_parent;
5339 peer_parent->peers[1].next_bb = endif_block;
52995340
53005341 ir_set_cursor_at_end_and_append_block(irb, then_block);
53015342
53025343 Scope *subexpr_scope = create_runtime_scope(irb->codegen, node, scope, is_comptime);
5303 IrInstruction *then_expr_result = ir_gen_node(irb, then_node, subexpr_scope);
5344 IrInstruction *then_expr_result = ir_gen_node_extra(irb, then_node, subexpr_scope, lval,
5345 &peer_parent->peers[0].base);
53045346 if (then_expr_result == irb->codegen->invalid_instruction)
53055347 return irb->codegen->invalid_instruction;
53065348 IrBasicBlock *after_then_block = irb->current_basic_block;
......@@ -5310,7 +5352,7 @@ static IrInstruction *ir_gen_if_bool_expr(IrBuilder *irb, Scope *scope, AstNode
53105352 ir_set_cursor_at_end_and_append_block(irb, else_block);
53115353 IrInstruction *else_expr_result;
53125354 if (else_node) {
5313 else_expr_result = ir_gen_node(irb, else_node, subexpr_scope);
5355 else_expr_result = ir_gen_node_extra(irb, else_node, subexpr_scope, lval, &peer_parent->peers[1].base);
53145356 if (else_expr_result == irb->codegen->invalid_instruction)
53155357 return irb->codegen->invalid_instruction;
53165358 } else {
......@@ -5328,7 +5370,8 @@ static IrInstruction *ir_gen_if_bool_expr(IrBuilder *irb, Scope *scope, AstNode
53285370 incoming_blocks[0] = after_then_block;
53295371 incoming_blocks[1] = after_else_block;
53305372
5331 return ir_build_phi(irb, scope, node, 2, incoming_blocks, incoming_values);
5373 IrInstruction *phi = ir_build_phi(irb, scope, node, 2, incoming_blocks, incoming_values);
5374 return ir_lval_wrap(irb, scope, phi, lval, result_loc);
53325375}
53335376
53345377static IrInstruction *ir_gen_prefix_op_id_lval(IrBuilder *irb, Scope *scope, AstNode *node, IrUnOp op_id, LVal lval) {
......@@ -5346,15 +5389,28 @@ static IrInstruction *ir_gen_prefix_op_id(IrBuilder *irb, Scope *scope, AstNode
53465389 return ir_gen_prefix_op_id_lval(irb, scope, node, op_id, LValNone);
53475390}
53485391
5349static IrInstruction *ir_lval_wrap(IrBuilder *irb, Scope *scope, IrInstruction *value, LVal lval) {
5350 if (lval != LValPtr)
5351 return value;
5352 if (value == irb->codegen->invalid_instruction)
5392static IrInstruction *ir_lval_wrap(IrBuilder *irb, Scope *scope, IrInstruction *value, LVal lval,
5393 ResultLoc *result_loc)
5394{
5395 // This logic must be kept in sync with
5396 // [STMT_EXPR_TEST_THING] <--- (search this token)
5397 if (value == irb->codegen->invalid_instruction ||
5398 instr_is_unreachable(value) ||
5399 value->source_node->type == NodeTypeDefer ||
5400 value->id == IrInstructionIdDeclVarSrc)
5401 {
53535402 return value;
5403 }
5404
5405 if (lval == LValPtr) {
5406 // We needed a pointer to a value, but we got a value. So we create
5407 // an instruction which just makes a pointer of it.
5408 return ir_build_ref(irb, scope, value->source_node, value, false, false);
5409 }
53545410
5355 // We needed a pointer to a value, but we got a value. So we create
5356 // an instruction which just makes a const pointer of it.
5357 return ir_build_ref(irb, scope, value->source_node, value, false, false);
5411 // TODO remove the lval parameter here
5412 ir_build_end_expr(irb, scope, value->source_node, value, lval, result_loc);
5413 return value;
53585414}
53595415
53605416static PtrLen star_token_to_ptr_len(TokenId token_id) {
......@@ -5455,7 +5511,9 @@ static IrInstruction *ir_gen_bool_not(IrBuilder *irb, Scope *scope, AstNode *nod
54555511 return ir_build_bool_not(irb, scope, node, value);
54565512}
54575513
5458static IrInstruction *ir_gen_prefix_op_expr(IrBuilder *irb, Scope *scope, AstNode *node, LVal lval) {
5514static IrInstruction *ir_gen_prefix_op_expr(IrBuilder *irb, Scope *scope, AstNode *node, LVal lval,
5515 ResultLoc *result_loc)
5516{
54595517 assert(node->type == NodeTypePrefixOpExpr);
54605518
54615519 PrefixOp prefix_op = node->data.prefix_op_expr.prefix_op;
......@@ -5464,18 +5522,18 @@ static IrInstruction *ir_gen_prefix_op_expr(IrBuilder *irb, Scope *scope, AstNod
54645522 case PrefixOpInvalid:
54655523 zig_unreachable();
54665524 case PrefixOpBoolNot:
5467 return ir_lval_wrap(irb, scope, ir_gen_bool_not(irb, scope, node), lval);
5525 return ir_lval_wrap(irb, scope, ir_gen_bool_not(irb, scope, node), lval, result_loc);
54685526 case PrefixOpBinNot:
5469 return ir_lval_wrap(irb, scope, ir_gen_prefix_op_id(irb, scope, node, IrUnOpBinNot), lval);
5527 return ir_lval_wrap(irb, scope, ir_gen_prefix_op_id(irb, scope, node, IrUnOpBinNot), lval, result_loc);
54705528 case PrefixOpNegation:
5471 return ir_lval_wrap(irb, scope, ir_gen_prefix_op_id(irb, scope, node, IrUnOpNegation), lval);
5529 return ir_lval_wrap(irb, scope, ir_gen_prefix_op_id(irb, scope, node, IrUnOpNegation), lval, result_loc);
54725530 case PrefixOpNegationWrap:
5473 return ir_lval_wrap(irb, scope, ir_gen_prefix_op_id(irb, scope, node, IrUnOpNegationWrap), lval);
5531 return ir_lval_wrap(irb, scope, ir_gen_prefix_op_id(irb, scope, node, IrUnOpNegationWrap), lval, result_loc);
54745532 case PrefixOpOptional:
5475 return ir_lval_wrap(irb, scope, ir_gen_prefix_op_id(irb, scope, node, IrUnOpOptional), lval);
5533 return ir_lval_wrap(irb, scope, ir_gen_prefix_op_id(irb, scope, node, IrUnOpOptional), lval, result_loc);
54765534 case PrefixOpAddrOf: {
54775535 AstNode *expr_node = node->data.prefix_op_expr.primary_expr;
5478 return ir_lval_wrap(irb, scope, ir_gen_node_extra(irb, expr_node, scope, LValPtr, nullptr), lval);
5536 return ir_lval_wrap(irb, scope, ir_gen_node_extra(irb, expr_node, scope, LValPtr, nullptr), lval, result_loc);
54795537 }
54805538 }
54815539 zig_unreachable();
......@@ -7677,33 +7735,33 @@ static IrInstruction *ir_gen_node_raw(IrBuilder *irb, AstNode *node, Scope *scop
76777735 case NodeTypeTestDecl:
76787736 zig_unreachable();
76797737 case NodeTypeBlock:
7680 return ir_lval_wrap(irb, scope, ir_gen_block(irb, scope, node), lval);
7738 return ir_lval_wrap(irb, scope, ir_gen_block(irb, scope, node), lval, result_loc);
76817739 case NodeTypeGroupedExpr:
76827740 return ir_gen_node_raw(irb, node->data.grouped_expr, scope, lval, result_loc);
76837741 case NodeTypeBinOpExpr:
7684 return ir_lval_wrap(irb, scope, ir_gen_bin_op(irb, scope, node), lval);
7742 return ir_lval_wrap(irb, scope, ir_gen_bin_op(irb, scope, node), lval, result_loc);
76857743 case NodeTypeIntLiteral:
7686 return ir_lval_wrap(irb, scope, ir_gen_int_lit(irb, scope, node), lval);
7744 return ir_lval_wrap(irb, scope, ir_gen_int_lit(irb, scope, node), lval, result_loc);
76877745 case NodeTypeFloatLiteral:
7688 return ir_lval_wrap(irb, scope, ir_gen_float_lit(irb, scope, node), lval);
7746 return ir_lval_wrap(irb, scope, ir_gen_float_lit(irb, scope, node), lval, result_loc);
76897747 case NodeTypeCharLiteral:
7690 return ir_lval_wrap(irb, scope, ir_gen_char_lit(irb, scope, node), lval);
7748 return ir_lval_wrap(irb, scope, ir_gen_char_lit(irb, scope, node), lval, result_loc);
76917749 case NodeTypeSymbol:
76927750 return ir_gen_symbol(irb, scope, node, lval);
76937751 case NodeTypeFnCallExpr:
76947752 return ir_gen_fn_call(irb, scope, node, lval, result_loc);
76957753 case NodeTypeIfBoolExpr:
7696 return ir_lval_wrap(irb, scope, ir_gen_if_bool_expr(irb, scope, node), lval);
7754 return ir_gen_if_bool_expr(irb, scope, node, lval, result_loc);
76977755 case NodeTypePrefixOpExpr:
7698 return ir_gen_prefix_op_expr(irb, scope, node, lval);
7756 return ir_gen_prefix_op_expr(irb, scope, node, lval, result_loc);
76997757 case NodeTypeContainerInitExpr:
7700 return ir_lval_wrap(irb, scope, ir_gen_container_init_expr(irb, scope, node), lval);
7758 return ir_lval_wrap(irb, scope, ir_gen_container_init_expr(irb, scope, node), lval, result_loc);
77017759 case NodeTypeVariableDeclaration:
7702 return ir_lval_wrap(irb, scope, ir_gen_var_decl(irb, scope, node), lval);
7760 return ir_lval_wrap(irb, scope, ir_gen_var_decl(irb, scope, node), lval, result_loc);
77037761 case NodeTypeWhileExpr:
7704 return ir_lval_wrap(irb, scope, ir_gen_while_expr(irb, scope, node), lval);
7762 return ir_lval_wrap(irb, scope, ir_gen_while_expr(irb, scope, node), lval, result_loc);
77057763 case NodeTypeForExpr:
7706 return ir_lval_wrap(irb, scope, ir_gen_for_expr(irb, scope, node), lval);
7764 return ir_lval_wrap(irb, scope, ir_gen_for_expr(irb, scope, node), lval, result_loc);
77077765 case NodeTypeArrayAccessExpr:
77087766 return ir_gen_array_access(irb, scope, node, lval);
77097767 case NodeTypeReturnExpr:
......@@ -7743,59 +7801,59 @@ static IrInstruction *ir_gen_node_raw(IrBuilder *irb, AstNode *node, Scope *scop
77437801 return ir_build_load_ptr(irb, scope, node, unwrapped_ptr);
77447802 }
77457803 case NodeTypeBoolLiteral:
7746 return ir_lval_wrap(irb, scope, ir_gen_bool_literal(irb, scope, node), lval);
7804 return ir_lval_wrap(irb, scope, ir_gen_bool_literal(irb, scope, node), lval, result_loc);
77477805 case NodeTypeArrayType:
7748 return ir_lval_wrap(irb, scope, ir_gen_array_type(irb, scope, node), lval);
7806 return ir_lval_wrap(irb, scope, ir_gen_array_type(irb, scope, node), lval, result_loc);
77497807 case NodeTypePointerType:
7750 return ir_lval_wrap(irb, scope, ir_gen_pointer_type(irb, scope, node), lval);
7808 return ir_lval_wrap(irb, scope, ir_gen_pointer_type(irb, scope, node), lval, result_loc);
77517809 case NodeTypePromiseType:
7752 return ir_lval_wrap(irb, scope, ir_gen_promise_type(irb, scope, node), lval);
7810 return ir_lval_wrap(irb, scope, ir_gen_promise_type(irb, scope, node), lval, result_loc);
77537811 case NodeTypeStringLiteral:
7754 return ir_lval_wrap(irb, scope, ir_gen_string_literal(irb, scope, node), lval);
7812 return ir_lval_wrap(irb, scope, ir_gen_string_literal(irb, scope, node), lval, result_loc);
77557813 case NodeTypeUndefinedLiteral:
7756 return ir_lval_wrap(irb, scope, ir_gen_undefined_literal(irb, scope, node), lval);
7814 return ir_lval_wrap(irb, scope, ir_gen_undefined_literal(irb, scope, node), lval, result_loc);
77577815 case NodeTypeAsmExpr:
7758 return ir_lval_wrap(irb, scope, ir_gen_asm_expr(irb, scope, node), lval);
7816 return ir_lval_wrap(irb, scope, ir_gen_asm_expr(irb, scope, node), lval, result_loc);
77597817 case NodeTypeNullLiteral:
7760 return ir_lval_wrap(irb, scope, ir_gen_null_literal(irb, scope, node), lval);
7818 return ir_lval_wrap(irb, scope, ir_gen_null_literal(irb, scope, node), lval, result_loc);
77617819 case NodeTypeIfErrorExpr:
7762 return ir_lval_wrap(irb, scope, ir_gen_if_err_expr(irb, scope, node), lval);
7820 return ir_lval_wrap(irb, scope, ir_gen_if_err_expr(irb, scope, node), lval, result_loc);
77637821 case NodeTypeIfOptional:
7764 return ir_lval_wrap(irb, scope, ir_gen_if_optional_expr(irb, scope, node), lval);
7822 return ir_lval_wrap(irb, scope, ir_gen_if_optional_expr(irb, scope, node), lval, result_loc);
77657823 case NodeTypeSwitchExpr:
7766 return ir_lval_wrap(irb, scope, ir_gen_switch_expr(irb, scope, node), lval);
7824 return ir_lval_wrap(irb, scope, ir_gen_switch_expr(irb, scope, node), lval, result_loc);
77677825 case NodeTypeCompTime:
77687826 return ir_gen_comptime(irb, scope, node, lval);
77697827 case NodeTypeErrorType:
7770 return ir_lval_wrap(irb, scope, ir_gen_error_type(irb, scope, node), lval);
7828 return ir_lval_wrap(irb, scope, ir_gen_error_type(irb, scope, node), lval, result_loc);
77717829 case NodeTypeBreak:
7772 return ir_lval_wrap(irb, scope, ir_gen_break(irb, scope, node), lval);
7830 return ir_lval_wrap(irb, scope, ir_gen_break(irb, scope, node), lval, result_loc);
77737831 case NodeTypeContinue:
7774 return ir_lval_wrap(irb, scope, ir_gen_continue(irb, scope, node), lval);
7832 return ir_lval_wrap(irb, scope, ir_gen_continue(irb, scope, node), lval, result_loc);
77757833 case NodeTypeUnreachable:
7776 return ir_lval_wrap(irb, scope, ir_build_unreachable(irb, scope, node), lval);
7834 return ir_lval_wrap(irb, scope, ir_build_unreachable(irb, scope, node), lval, result_loc);
77777835 case NodeTypeDefer:
7778 return ir_lval_wrap(irb, scope, ir_gen_defer(irb, scope, node), lval);
7836 return ir_lval_wrap(irb, scope, ir_gen_defer(irb, scope, node), lval, result_loc);
77797837 case NodeTypeSliceExpr:
7780 return ir_lval_wrap(irb, scope, ir_gen_slice(irb, scope, node), lval);
7838 return ir_lval_wrap(irb, scope, ir_gen_slice(irb, scope, node), lval, result_loc);
77817839 case NodeTypeUnwrapErrorExpr:
7782 return ir_lval_wrap(irb, scope, ir_gen_catch(irb, scope, node), lval);
7840 return ir_lval_wrap(irb, scope, ir_gen_catch(irb, scope, node), lval, result_loc);
77837841 case NodeTypeContainerDecl:
7784 return ir_lval_wrap(irb, scope, ir_gen_container_decl(irb, scope, node), lval);
7842 return ir_lval_wrap(irb, scope, ir_gen_container_decl(irb, scope, node), lval, result_loc);
77857843 case NodeTypeFnProto:
7786 return ir_lval_wrap(irb, scope, ir_gen_fn_proto(irb, scope, node), lval);
7844 return ir_lval_wrap(irb, scope, ir_gen_fn_proto(irb, scope, node), lval, result_loc);
77877845 case NodeTypeErrorSetDecl:
7788 return ir_lval_wrap(irb, scope, ir_gen_err_set_decl(irb, scope, node), lval);
7846 return ir_lval_wrap(irb, scope, ir_gen_err_set_decl(irb, scope, node), lval, result_loc);
77897847 case NodeTypeCancel:
7790 return ir_lval_wrap(irb, scope, ir_gen_cancel(irb, scope, node), lval);
7848 return ir_lval_wrap(irb, scope, ir_gen_cancel(irb, scope, node), lval, result_loc);
77917849 case NodeTypeResume:
7792 return ir_lval_wrap(irb, scope, ir_gen_resume(irb, scope, node), lval);
7850 return ir_lval_wrap(irb, scope, ir_gen_resume(irb, scope, node), lval, result_loc);
77937851 case NodeTypeAwaitExpr:
7794 return ir_lval_wrap(irb, scope, ir_gen_await_expr(irb, scope, node), lval);
7852 return ir_lval_wrap(irb, scope, ir_gen_await_expr(irb, scope, node), lval, result_loc);
77957853 case NodeTypeSuspend:
7796 return ir_lval_wrap(irb, scope, ir_gen_suspend(irb, scope, node), lval);
7854 return ir_lval_wrap(irb, scope, ir_gen_suspend(irb, scope, node), lval, result_loc);
77977855 case NodeTypeEnumLiteral:
7798 return ir_lval_wrap(irb, scope, ir_gen_enum_literal(irb, scope, node), lval);
7856 return ir_lval_wrap(irb, scope, ir_gen_enum_literal(irb, scope, node), lval, result_loc);
77997857 }
78007858 zig_unreachable();
78017859}
......@@ -10415,6 +10473,33 @@ static void ir_start_bb(IrAnalyze *ira, IrBasicBlock *old_bb, IrBasicBlock *cons
1041510473 ira->const_predecessor_bb = const_predecessor_bb;
1041610474}
1041710475
10476static IrInstruction *ira_suspend(IrAnalyze *ira, IrInstruction *old_instruction, IrBasicBlock *next_bb,
10477 IrSuspendPosition *suspend_pos)
10478{
10479 suspend_pos->basic_block_index = ira->old_bb_index;
10480 suspend_pos->instruction_index = ira->instruction_index;
10481
10482 ira->old_bb_index = next_bb->index;
10483 ira->old_irb.current_basic_block = ira->old_irb.exec->basic_block_list.at(ira->old_bb_index);
10484 assert(ira->old_irb.current_basic_block == next_bb);
10485 ira->instruction_index = 0;
10486 ira->const_predecessor_bb = nullptr;
10487 next_bb->other = ir_get_new_bb_runtime(ira, next_bb, old_instruction);
10488 ira->new_irb.current_basic_block = next_bb->other;
10489 return ira->codegen->unreach_instruction;
10490}
10491
10492static IrInstruction *ira_resume(IrAnalyze *ira) {
10493 IrSuspendPosition pos = ira->resume_stack.pop();
10494 ira->old_bb_index = pos.basic_block_index;
10495 ira->old_irb.current_basic_block = ira->old_irb.exec->basic_block_list.at(ira->old_bb_index);
10496 ira->instruction_index = pos.instruction_index;
10497 ira->const_predecessor_bb = nullptr;
10498 ira->new_irb.current_basic_block = ira->old_irb.current_basic_block->other;
10499 assert(ira->new_irb.current_basic_block != nullptr);
10500 return ira->codegen->unreach_instruction;
10501}
10502
1041810503static void ir_finish_bb(IrAnalyze *ira) {
1041910504 ira->new_irb.exec->basic_block_list.append(ira->new_irb.current_basic_block);
1042010505 ira->instruction_index += 1;
......@@ -10442,8 +10527,15 @@ static void ir_finish_bb(IrAnalyze *ira) {
1044210527 ira->old_bb_index += 1;
1044310528 continue;
1044410529 }
10445 ira->new_irb.current_basic_block = old_bb->other;
10530 // if there is a resume_stack, pop one from there rather than moving on.
10531 // the last item of the resume stack will be a basic block that will
10532 // move on to the next one below
10533 if (ira->resume_stack.length != 0) {
10534 ira_resume(ira);
10535 return;
10536 }
1044610537
10538 ira->new_irb.current_basic_block = old_bb->other;
1044710539 ir_start_bb(ira, old_bb, nullptr);
1044810540 return;
1044910541 }
......@@ -14232,9 +14324,26 @@ static IrInstruction *ir_analyze_alloca(IrAnalyze *ira, IrInstruction *source_in
1423214324 return &result->base;
1423314325}
1423414326
14235static IrInstruction *ir_resolve_result_loc(IrAnalyze *ira, ResultLoc *result_loc, ZigType *elem_type) {
14327static ZigType *ir_result_loc_expected_type(IrAnalyze *ira, ResultLoc *result_loc) {
14328 switch (result_loc->id) {
14329 case ResultLocIdInvalid:
14330 case ResultLocIdPeerParent:
14331 case ResultLocIdPeer:
14332 zig_unreachable();
14333 case ResultLocIdNone:
14334 case ResultLocIdVar:
14335 return nullptr;
14336 case ResultLocIdReturn:
14337 return ira->explicit_return_type;
14338 }
14339 zig_unreachable();
14340}
14341
14342static IrInstruction *ir_resolve_result_runtime(IrAnalyze *ira, ResultLoc *result_loc, ZigType *elem_type) {
14343 result_loc->implicit_elem_type = elem_type;
1423614344 switch (result_loc->id) {
1423714345 case ResultLocIdInvalid:
14346 case ResultLocIdPeerParent:
1423814347 zig_unreachable();
1423914348 case ResultLocIdNone:
1424014349 return nullptr;
......@@ -14254,14 +14363,21 @@ static IrInstruction *ir_resolve_result_loc(IrAnalyze *ira, ResultLoc *result_lo
1425414363 return alloca_src->base.child;
1425514364 }
1425614365 case ResultLocIdReturn: {
14257 //ResultLocReturn *result_loc_ret = reinterpret_cast<ResultLocReturn *>(result_loc);
14258 // TODO implicit cast?
14259 return ir_build_return_ptr(ira, result_loc->source_instruction, elem_type);
14366 ZigType *ptr_return_type = get_pointer_to_type(ira->codegen, ira->explicit_return_type, false);
14367 return ir_build_return_ptr(ira, result_loc->source_instruction, ptr_return_type);
1426014368 }
14369 case ResultLocIdPeer:
14370 return nullptr;
1426114371 }
1426214372 zig_unreachable();
1426314373}
1426414374
14375static IrInstruction *ir_resolve_result(IrAnalyze *ira, ResultLoc *result_loc, IrInstruction *value) {
14376 IrInstruction *result_inst = ir_resolve_result_runtime(ira, result_loc, value->value.type);
14377 result_loc->gen_instruction = value;
14378 return result_inst;
14379}
14380
1426514381static IrInstruction *ir_analyze_async_call(IrAnalyze *ira, IrInstructionCallSrc *call_instruction, ZigFn *fn_entry,
1426614382 ZigType *fn_type, IrInstruction *fn_ref, IrInstruction **casted_args, size_t arg_count,
1426714383 IrInstruction *async_allocator_inst)
......@@ -14295,12 +14411,9 @@ static IrInstruction *ir_analyze_async_call(IrAnalyze *ira, IrInstructionCallSrc
1429514411 ZigType *promise_type = get_promise_type(ira->codegen, return_type);
1429614412 ZigType *async_return_type = get_error_union_type(ira->codegen, alloc_fn_error_set_type, promise_type);
1429714413
14298 IrInstruction *result_loc = ir_resolve_result_loc(ira, call_instruction->result_loc, async_return_type);
14299
14300 IrInstruction *result = ir_build_call_gen(ira, &call_instruction->base, fn_entry, fn_ref, arg_count,
14301 casted_args, FnInlineAuto, true, async_allocator_inst, nullptr, result_loc);
14302 result->value.type = async_return_type;
14303 return result;
14414 return ir_build_call_gen(ira, &call_instruction->base, fn_entry, fn_ref, arg_count,
14415 casted_args, FnInlineAuto, true, async_allocator_inst, nullptr, call_instruction->result_loc,
14416 async_return_type);
1430414417}
1430514418
1430614419static bool ir_analyze_fn_call_inline_arg(IrAnalyze *ira, AstNode *fn_proto_node,
......@@ -15053,12 +15166,10 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c
1505315166 }
1505415167
1505515168 assert(async_allocator_inst == nullptr);
15056 IrInstruction *result_loc = ir_resolve_result_loc(ira, call_instruction->result_loc,
15057 impl_fn_type_id->return_type);
1505815169 IrInstruction *new_call_instruction = ir_build_call_gen(ira, &call_instruction->base,
1505915170 impl_fn, nullptr, impl_param_count, casted_args, fn_inline,
15060 call_instruction->is_async, nullptr, casted_new_stack, result_loc);
15061 new_call_instruction->value.type = impl_fn_type_id->return_type;
15171 call_instruction->is_async, nullptr, casted_new_stack, call_instruction->result_loc,
15172 impl_fn_type_id->return_type);
1506215173
1506315174 return ir_finish_anal(ira, new_call_instruction);
1506415175 }
......@@ -15152,10 +15263,9 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c
1515215263 return ira->codegen->invalid_instruction;
1515315264 }
1515415265
15155 IrInstruction *result_loc = ir_resolve_result_loc(ira, call_instruction->result_loc, return_type);
1515615266 IrInstruction *new_call_instruction = ir_build_call_gen(ira, &call_instruction->base, fn_entry, fn_ref,
15157 call_param_count, casted_args, fn_inline, false, nullptr, casted_new_stack, result_loc);
15158 new_call_instruction->value.type = return_type;
15267 call_param_count, casted_args, fn_inline, false, nullptr, casted_new_stack,
15268 call_instruction->result_loc, return_type);
1515915269 return ir_finish_anal(ira, new_call_instruction);
1516015270}
1516115271
......@@ -23466,7 +23576,47 @@ static IrInstruction *ir_analyze_instruction_undeclared_ident(IrAnalyze *ira, Ir
2346623576 return ira->codegen->invalid_instruction;
2346723577}
2346823578
23469static IrInstruction *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstruction *instruction) {
23579static IrInstruction *ir_analyze_instruction_end_expr(IrAnalyze *ira, IrInstructionEndExpr *instruction) {
23580 IrInstruction *value = instruction->value->child;
23581 if (type_is_invalid(value->value.type))
23582 return ira->codegen->invalid_instruction;
23583
23584 assert(instruction->lval == LValNone);
23585
23586 if (instruction->result_loc->id == ResultLocIdPeer) {
23587 ResultLocPeer *result_peer = reinterpret_cast<ResultLocPeer *>(instruction->result_loc);
23588 ResultLocPeerParent *peer_parent = result_peer->parent;
23589
23590 if (peer_parent->resolved_type == nullptr && !ira->const_predecessor_bb) {
23591 instruction->result_loc->implicit_elem_type = value->value.type;
23592 instruction->result_loc->gen_instruction = value;
23593 IrInstruction *suspended_inst = ira_suspend(ira, &instruction->base, result_peer->next_bb,
23594 &result_peer->suspend_pos);
23595 bool last_one = (result_peer == &peer_parent->peers[peer_parent->peer_count - 1]);
23596 if (!last_one) {
23597 return suspended_inst;
23598 }
23599 IrInstruction **instructions = allocate<IrInstruction *>(peer_parent->peer_count);
23600 for (size_t i = 0; i < peer_parent->peer_count; i += 1) {
23601 instructions[i] = peer_parent->peers[i].base.gen_instruction;
23602 ira->resume_stack.append(peer_parent->peers[peer_parent->peer_count - i - 1].suspend_pos);
23603 }
23604 ZigType *expected_type = ir_result_loc_expected_type(ira, peer_parent->parent);
23605 peer_parent->resolved_type = ir_resolve_peer_types(ira,
23606 peer_parent->base.source_instruction->source_node, expected_type, instructions,
23607 peer_parent->peer_count);
23608 return ira_resume(ira);
23609 }
23610 }
23611 IrInstruction *result_loc = ir_resolve_result(ira, instruction->result_loc, value);
23612 if (result_loc != nullptr) {
23613 ir_analyze_store_ptr(ira, &instruction->base, result_loc, value);
23614 }
23615
23616 return ir_const_void(ira, &instruction->base);
23617}
23618
23619static IrInstruction *ir_analyze_instruction_base(IrAnalyze *ira, IrInstruction *instruction) {
2347023620 switch (instruction->id) {
2347123621 case IrInstructionIdInvalid:
2347223622 case IrInstructionIdWidenOrShorten:
......@@ -23769,17 +23919,12 @@ static IrInstruction *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstructio
2376923919 return ir_analyze_instruction_undeclared_ident(ira, (IrInstructionUndeclaredIdent *)instruction);
2377023920 case IrInstructionIdAllocaSrc:
2377123921 return nullptr;
23922 case IrInstructionIdEndExpr:
23923 return ir_analyze_instruction_end_expr(ira, (IrInstructionEndExpr *)instruction);
2377223924 }
2377323925 zig_unreachable();
2377423926}
2377523927
23776static IrInstruction *ir_analyze_instruction(IrAnalyze *ira, IrInstruction *old_instruction) {
23777 IrInstruction *new_instruction = ir_analyze_instruction_nocast(ira, old_instruction);
23778 ir_assert(new_instruction->value.type != nullptr || new_instruction->value.type != nullptr, old_instruction);
23779 old_instruction->child = new_instruction;
23780 return new_instruction;
23781}
23782
2378323928// This function attempts to evaluate IR code while doing type checking and other analysis.
2378423929// It emits a new IrExecutable which is partially evaluated IR code.
2378523930ZigType *ir_analyze(CodeGen *codegen, IrExecutable *old_exec, IrExecutable *new_exec,
......@@ -23825,8 +23970,11 @@ ZigType *ir_analyze(CodeGen *codegen, IrExecutable *old_exec, IrExecutable *new_
2382523970 continue;
2382623971 }
2382723972
23828 IrInstruction *new_instruction = ir_analyze_instruction(ira, old_instruction);
23973 IrInstruction *new_instruction = ir_analyze_instruction_base(ira, old_instruction);
2382923974 if (new_instruction != nullptr) {
23975 ir_assert(new_instruction->value.type != nullptr || new_instruction->value.type != nullptr, old_instruction);
23976 old_instruction->child = new_instruction;
23977
2383023978 if (type_is_invalid(new_instruction->value.type) && ir_should_inline(new_exec, old_instruction->scope)) {
2383123979 return ira->codegen->builtin_types.entry_invalid;
2383223980 }
......@@ -23907,6 +24055,7 @@ bool ir_has_side_effects(IrInstruction *instruction) {
2390724055 case IrInstructionIdResizeSlice:
2390824056 case IrInstructionIdGlobalAsm:
2390924057 case IrInstructionIdUndeclaredIdent:
24058 case IrInstructionIdEndExpr:
2391024059 return true;
2391124060
2391224061 case IrInstructionIdPhi:
src/ir_print.cpp+27
......@@ -158,6 +158,16 @@ static const char *ir_un_op_id_str(IrUnOp op_id) {
158158 zig_unreachable();
159159}
160160
161static const char *ir_lval_str(LVal lval) {
162 switch (lval) {
163 case LValNone:
164 return "None";
165 case LValPtr:
166 return "Ptr";
167 }
168 zig_unreachable();
169}
170
161171static void ir_print_un_op(IrPrint *irp, IrInstructionUnOp *un_op_instruction) {
162172 fprintf(irp->f, "%s ", ir_un_op_id_str(un_op_instruction->op_id));
163173 ir_print_other_instruction(irp, un_op_instruction->value);
......@@ -219,6 +229,12 @@ static void ir_print_result_loc(IrPrint *irp, ResultLoc *result_loc) {
219229 return;
220230 case ResultLocIdVar:
221231 return ir_print_result_loc_var(irp, (ResultLocVar *)result_loc);
232 case ResultLocIdPeer:
233 fprintf(irp->f, "peer");
234 return;
235 case ResultLocIdPeerParent:
236 fprintf(irp->f, "peer_parent");
237 return;
222238 }
223239 zig_unreachable();
224240}
......@@ -1128,6 +1144,14 @@ static void ir_print_alloca_gen(IrPrint *irp, IrInstructionAllocaGen *instructio
11281144 fprintf(irp->f, "Alloca(align=%" PRIu32 ",name=%s)", instruction->align, instruction->name_hint);
11291145}
11301146
1147static void ir_print_end_expr(IrPrint *irp, IrInstructionEndExpr *instruction) {
1148 fprintf(irp->f, "EndExpr(result=");
1149 ir_print_result_loc(irp, instruction->result_loc);
1150 fprintf(irp->f, ",value=");
1151 ir_print_other_instruction(irp, instruction->value);
1152 fprintf(irp->f, ",lval=%s)", ir_lval_str(instruction->lval));
1153}
1154
11311155static void ir_print_int_to_err(IrPrint *irp, IrInstructionIntToErr *instruction) {
11321156 fprintf(irp->f, "inttoerr ");
11331157 ir_print_other_instruction(irp, instruction->target);
......@@ -2014,6 +2038,9 @@ static void ir_print_instruction(IrPrint *irp, IrInstruction *instruction) {
20142038 case IrInstructionIdAllocaGen:
20152039 ir_print_alloca_gen(irp, (IrInstructionAllocaGen *)instruction);
20162040 break;
2041 case IrInstructionIdEndExpr:
2042 ir_print_end_expr(irp, (IrInstructionEndExpr *)instruction);
2043 break;
20172044 }
20182045 fprintf(irp->f, "\n");
20192046}