authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-05-31 00:22:12-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-05-31 00:22:12-04:00
log3702c278e3b2073bdf7aadb8bcdf1cd4156bec28
tree9099b3bee74226ccaa846747b12d6a17179ec473
parent95d9835898052835ce767be2fcc0e4344a704b96
signature Commit is signed but in an unrecognized format.

local consts with comptime init exprs

```zig export fn entry() void { const x = if (true) u8(4) else u32(8); } ``` ```llvm define void @entry() #2 !dbg !35 { Entry: call void @llvm.dbg.declare(metadata i8* @0, metadata !39, metadata !DIExpression()), !dbg !41 ret void, !dbg !42 } ```

1 files changed, 20 insertions(+), 14 deletions(-)

src/ir.cpp+20-14
......@@ -184,7 +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);
187static IrInstruction *ir_resolve_result(IrAnalyze *ira, ResultLoc *result_loc, ZigType *value_type, IrInstruction *value);
188188
189189static ConstExprValue *const_ptr_pointee_unchecked(CodeGen *g, ConstExprValue *const_val) {
190190 assert(get_src_ptr_type(const_val->type) != nullptr);
......@@ -1392,7 +1392,7 @@ static IrInstruction *ir_build_call_gen(IrAnalyze *ira, IrInstruction *source_in
13921392 call_instruction->is_async = is_async;
13931393 call_instruction->async_allocator = async_allocator;
13941394 call_instruction->new_stack = new_stack;
1395 call_instruction->result_loc = ir_resolve_result_runtime(ira, result_loc, return_type);
1395 call_instruction->result_loc = ir_resolve_result(ira, result_loc, return_type, nullptr);
13961396
13971397 if (fn_ref != nullptr) ir_ref_instruction(fn_ref, ira->new_irb.current_basic_block);
13981398 for (size_t i = 0; i < arg_count; i += 1)
......@@ -14340,8 +14340,15 @@ static ZigType *ir_result_loc_expected_type(IrAnalyze *ira, ResultLoc *result_lo
1434014340 zig_unreachable();
1434114341}
1434214342
14343static IrInstruction *ir_resolve_result_runtime(IrAnalyze *ira, ResultLoc *result_loc, ZigType *elem_type) {
14344 result_loc->implicit_elem_type = elem_type;
14343// give nullptr for value to resolve it at runtime
14344// returns a result location, or nullptr if the result location was already taken care of by this function
14345static IrInstruction *ir_resolve_result(IrAnalyze *ira, ResultLoc *result_loc, ZigType *value_type,
14346 IrInstruction *value)
14347{
14348 bool is_comptime = value != nullptr && value->value.special != ConstValSpecialRuntime;
14349
14350 result_loc->gen_instruction = value;
14351 result_loc->implicit_elem_type = value_type;
1434514352 switch (result_loc->id) {
1434614353 case ResultLocIdInvalid:
1434714354 case ResultLocIdPeerParent:
......@@ -14357,11 +14364,16 @@ static IrInstruction *ir_resolve_result_runtime(IrAnalyze *ira, ResultLoc *resul
1435714364 if (alloca_src->base.child == nullptr) {
1435814365 uint32_t align = 0; // TODO
1435914366 bool force_comptime = false; // TODO
14360 IrInstruction *alloca_gen = ir_analyze_alloca(ira, result_loc->source_instruction, elem_type, align,
14361 alloca_src->name_hint, force_comptime);
14367 IrInstruction *alloca_gen;
14368 if (is_comptime) {
14369 alloca_gen = ir_get_ref(ira, result_loc->source_instruction, value, true, false);
14370 } else {
14371 alloca_gen = ir_analyze_alloca(ira, result_loc->source_instruction, value_type, align,
14372 alloca_src->name_hint, force_comptime);
14373 }
1436214374 alloca_src->base.child = alloca_gen;
1436314375 }
14364 return alloca_src->base.child;
14376 return is_comptime ? nullptr : alloca_src->base.child;
1436514377 }
1436614378 case ResultLocIdReturn: {
1436714379 ZigType *ptr_return_type = get_pointer_to_type(ira->codegen, ira->explicit_return_type, false);
......@@ -14373,12 +14385,6 @@ static IrInstruction *ir_resolve_result_runtime(IrAnalyze *ira, ResultLoc *resul
1437314385 zig_unreachable();
1437414386}
1437514387
14376static IrInstruction *ir_resolve_result(IrAnalyze *ira, ResultLoc *result_loc, IrInstruction *value) {
14377 IrInstruction *result_inst = ir_resolve_result_runtime(ira, result_loc, value->value.type);
14378 result_loc->gen_instruction = value;
14379 return result_inst;
14380}
14381
1438214388static IrInstruction *ir_analyze_async_call(IrAnalyze *ira, IrInstructionCallSrc *call_instruction, ZigFn *fn_entry,
1438314389 ZigType *fn_type, IrInstruction *fn_ref, IrInstruction **casted_args, size_t arg_count,
1438414390 IrInstruction *async_allocator_inst)
......@@ -23609,7 +23615,7 @@ static IrInstruction *ir_analyze_instruction_end_expr(IrAnalyze *ira, IrInstruct
2360923615 return ira_resume(ira);
2361023616 }
2361123617 }
23612 IrInstruction *result_loc = ir_resolve_result(ira, instruction->result_loc, value);
23618 IrInstruction *result_loc = ir_resolve_result(ira, instruction->result_loc, value->value.type, value);
2361323619 if (result_loc != nullptr) {
2361423620 ir_analyze_store_ptr(ira, &instruction->base, result_loc, value);
2361523621 }