authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-03 21:53:32-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-03 21:53:32-04:00
loga32abcd365f0a019d3f858c4ee769a8348f0f4a2
tree02dac2de864ba1d4f37bf32e01ecb8ca09130098
parent143d6ada8f93872b94a8f20927e11cae243028d9
signaturelock-open Commit is signed but in an unrecognized format.

no-copy semantics for if optional and if error union

if expressions no longer introduce a stack allocation. ```zig export fn entry() void { var x: anyerror!i32 = 1234; if (x) |i| {} else |e| {} } ``` ```llvm define void @entry() #2 !dbg !39 { Entry: %x = alloca { i16, i32 }, align 4 %0 = bitcast { i16, i32 }* %x to i8*, !dbg !52 call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 bitcast ({ i16, i32 }* @0 to i8*), i64 8, i1 false), !dbg !52 call void @llvm.dbg.declare(metadata { i16, i32 }* %x, metadata !43, metadata !DIExpression()), !dbg !52 %1 = getelementptr inbounds { i16, i32 }, { i16, i32 }* %x, i32 0, i32 0, !dbg !53 %2 = load i16, i16* %1, align 2, !dbg !53 %3 = icmp ne i16 %2, 0, !dbg !53 br i1 %3, label %TryElse, label %TryOk, !dbg !53 TryOk: ; preds = %Entry %4 = getelementptr inbounds { i16, i32 }, { i16, i32 }* %x, i32 0, i32 1, !dbg !53 call void @llvm.dbg.declare(metadata i32* %4, metadata !50, metadata !DIExpression()), !dbg !53 br label %TryEnd, !dbg !53 TryElse: ; preds = %Entry %5 = getelementptr inbounds { i16, i32 }, { i16, i32 }* %x, i32 0, i32 0, !dbg !53 call void @llvm.dbg.declare(metadata i16* %5, metadata !51, metadata !DIExpression()), !dbg !53 br label %TryEnd, !dbg !53 TryEnd: ; preds = %TryElse, %TryOk ret void, !dbg !54 } ```

1 files changed, 7 insertions(+), 6 deletions(-)

src/ir.cpp+7-6
...@@ -6373,9 +6373,9 @@ static IrInstruction *ir_gen_if_optional_expr(IrBuilder *irb, Scope *scope, AstN...@@ -6373,9 +6373,9 @@ static IrInstruction *ir_gen_if_optional_expr(IrBuilder *irb, Scope *scope, AstN
6373 ZigVar *var = ir_create_var(irb, node, subexpr_scope,6373 ZigVar *var = ir_create_var(irb, node, subexpr_scope,
6374 var_symbol, is_const, is_const, is_shadowable, is_comptime);6374 var_symbol, is_const, is_const, is_shadowable, is_comptime);
63756375
6376 IrInstruction *var_ptr_value = ir_build_optional_unwrap_ptr(irb, subexpr_scope, node, maybe_val_ptr, false);6376 IrInstruction *payload_ptr = ir_build_optional_unwrap_ptr(irb, subexpr_scope, node, maybe_val_ptr, false);
6377 IrInstruction *var_value = var_is_ptr ? var_ptr_value : ir_build_load_ptr(irb, subexpr_scope, node, var_ptr_value);6377 IrInstruction *var_ptr = var_is_ptr ? ir_build_ref(irb, subexpr_scope, node, payload_ptr, true, false) : payload_ptr;
6378 ir_build_var_decl_src(irb, subexpr_scope, node, var, nullptr, var_value);6378 ir_build_var_decl_src(irb, subexpr_scope, node, var, nullptr, var_ptr);
6379 var_scope = var->child_scope;6379 var_scope = var->child_scope;
6380 } else {6380 } else {
6381 var_scope = subexpr_scope;6381 var_scope = subexpr_scope;
...@@ -6447,9 +6447,10 @@ static IrInstruction *ir_gen_if_err_expr(IrBuilder *irb, Scope *scope, AstNode *...@@ -6447,9 +6447,10 @@ static IrInstruction *ir_gen_if_err_expr(IrBuilder *irb, Scope *scope, AstNode *
6447 ZigVar *var = ir_create_var(irb, node, subexpr_scope,6447 ZigVar *var = ir_create_var(irb, node, subexpr_scope,
6448 var_symbol, var_is_const, var_is_const, is_shadowable, var_is_comptime);6448 var_symbol, var_is_const, var_is_const, is_shadowable, var_is_comptime);
64496449
6450 IrInstruction *var_ptr_value = ir_build_unwrap_err_payload(irb, subexpr_scope, node, err_val_ptr, false);6450 IrInstruction *payload_ptr = ir_build_unwrap_err_payload(irb, subexpr_scope, node, err_val_ptr, false);
6451 IrInstruction *var_value = var_is_ptr ? var_ptr_value : ir_build_load_ptr(irb, subexpr_scope, node, var_ptr_value);6451 IrInstruction *var_ptr = var_is_ptr ?
6452 ir_build_var_decl_src(irb, subexpr_scope, node, var, nullptr, var_value);6452 ir_build_ref(irb, subexpr_scope, node, payload_ptr, true, false) : payload_ptr;
6453 ir_build_var_decl_src(irb, subexpr_scope, node, var, nullptr, var_ptr);
6453 var_scope = var->child_scope;6454 var_scope = var->child_scope;
6454 } else {6455 } else {
6455 var_scope = subexpr_scope;6456 var_scope = subexpr_scope;