diff options
| author | Josh Wolfe <thejoshwolfe@gmail.com> | 2015-12-12 17:33:45 -0700 |
|---|---|---|
| committer | Josh Wolfe <thejoshwolfe@gmail.com> | 2015-12-12 17:33:45 -0700 |
| commit | 208258820108b1e921d456e99d48844ebbe91040 (patch) | |
| tree | 5d5f0da845b80920933d56396c6506c3d63017fa /src/codegen.cpp | |
| parent | 64dd0b8d9535672484512a4a9957a63c08a32f3f (diff) | |
| download | zig-208258820108b1e921d456e99d48844ebbe91040.tar.gz zig-208258820108b1e921d456e99d48844ebbe91040.zip | |
fix short circuit expressions
Diffstat (limited to 'src/codegen.cpp')
| -rw-r--r-- | src/codegen.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp index e5f938a52c..881ef2be18 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -478,8 +478,8 @@ static LLVMValueRef gen_bool_and_expr(CodeGen *g, AstNode *node) { assert(node->type == NodeTypeBinOpExpr); LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1); + LLVMBasicBlockRef post_val1_block = LLVMGetInsertBlock(g->builder); - LLVMBasicBlockRef orig_block = LLVMGetInsertBlock(g->builder); // block for when val1 == true LLVMBasicBlockRef true_block = LLVMAppendBasicBlock(g->cur_fn->fn_value, "BoolAndTrue"); // block for when val1 == false (don't even evaluate the second part) @@ -490,6 +490,8 @@ static LLVMValueRef gen_bool_and_expr(CodeGen *g, AstNode *node) { LLVMPositionBuilderAtEnd(g->builder, true_block); LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2); + LLVMBasicBlockRef post_val2_block = LLVMGetInsertBlock(g->builder); + add_debug_source_node(g, node); LLVMBuildBr(g->builder, false_block); @@ -497,7 +499,7 @@ static LLVMValueRef gen_bool_and_expr(CodeGen *g, AstNode *node) { add_debug_source_node(g, node); LLVMValueRef phi = LLVMBuildPhi(g->builder, LLVMInt1Type(), ""); LLVMValueRef incoming_values[2] = {val1, val2}; - LLVMBasicBlockRef incoming_blocks[2] = {orig_block, true_block}; + LLVMBasicBlockRef incoming_blocks[2] = {post_val1_block, post_val2_block}; LLVMAddIncoming(phi, incoming_values, incoming_blocks, 2); return phi; @@ -507,8 +509,7 @@ static LLVMValueRef gen_bool_or_expr(CodeGen *g, AstNode *expr_node) { assert(expr_node->type == NodeTypeBinOpExpr); LLVMValueRef val1 = gen_expr(g, expr_node->data.bin_op_expr.op1); - - LLVMBasicBlockRef orig_block = LLVMGetInsertBlock(g->builder); + LLVMBasicBlockRef post_val1_block = LLVMGetInsertBlock(g->builder); // block for when val1 == false LLVMBasicBlockRef false_block = LLVMAppendBasicBlock(g->cur_fn->fn_value, "BoolOrFalse"); @@ -520,6 +521,9 @@ static LLVMValueRef gen_bool_or_expr(CodeGen *g, AstNode *expr_node) { LLVMPositionBuilderAtEnd(g->builder, false_block); LLVMValueRef val2 = gen_expr(g, expr_node->data.bin_op_expr.op2); + + LLVMBasicBlockRef post_val2_block = LLVMGetInsertBlock(g->builder); + add_debug_source_node(g, expr_node); LLVMBuildBr(g->builder, true_block); @@ -527,7 +531,7 @@ static LLVMValueRef gen_bool_or_expr(CodeGen *g, AstNode *expr_node) { add_debug_source_node(g, expr_node); LLVMValueRef phi = LLVMBuildPhi(g->builder, LLVMInt1Type(), ""); LLVMValueRef incoming_values[2] = {val1, val2}; - LLVMBasicBlockRef incoming_blocks[2] = {orig_block, false_block}; + LLVMBasicBlockRef incoming_blocks[2] = {post_val1_block, post_val2_block}; LLVMAddIncoming(phi, incoming_values, incoming_blocks, 2); return phi; |
