| ... | @@ -478,8 +478,8 @@ static LLVMValueRef gen_bool_and_expr(CodeGen *g, AstNode *node) { | ... | @@ -478,8 +478,8 @@ static LLVMValueRef gen_bool_and_expr(CodeGen *g, AstNode *node) { |
| 478 | assert(node->type == NodeTypeBinOpExpr); | 478 | assert(node->type == NodeTypeBinOpExpr); |
| 479 | | 479 | |
| 480 | LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1); | 480 | LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1); |
| | 481 | LLVMBasicBlockRef post_val1_block = LLVMGetInsertBlock(g->builder); |
| 481 | | 482 | |
| 482 | LLVMBasicBlockRef orig_block = LLVMGetInsertBlock(g->builder); | | |
| 483 | // block for when val1 == true | 483 | // block for when val1 == true |
| 484 | LLVMBasicBlockRef true_block = LLVMAppendBasicBlock(g->cur_fn->fn_value, "BoolAndTrue"); | 484 | LLVMBasicBlockRef true_block = LLVMAppendBasicBlock(g->cur_fn->fn_value, "BoolAndTrue"); |
| 485 | // block for when val1 == false (don't even evaluate the second part) | 485 | // 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) { | ... | @@ -490,6 +490,8 @@ static LLVMValueRef gen_bool_and_expr(CodeGen *g, AstNode *node) { |
| 490 | | 490 | |
| 491 | LLVMPositionBuilderAtEnd(g->builder, true_block); | 491 | LLVMPositionBuilderAtEnd(g->builder, true_block); |
| 492 | LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2); | 492 | LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2); |
| | 493 | LLVMBasicBlockRef post_val2_block = LLVMGetInsertBlock(g->builder); |
| | 494 | |
| 493 | add_debug_source_node(g, node); | 495 | add_debug_source_node(g, node); |
| 494 | LLVMBuildBr(g->builder, false_block); | 496 | LLVMBuildBr(g->builder, false_block); |
| 495 | | 497 | |
| ... | @@ -497,7 +499,7 @@ static LLVMValueRef gen_bool_and_expr(CodeGen *g, AstNode *node) { | ... | @@ -497,7 +499,7 @@ static LLVMValueRef gen_bool_and_expr(CodeGen *g, AstNode *node) { |
| 497 | add_debug_source_node(g, node); | 499 | add_debug_source_node(g, node); |
| 498 | LLVMValueRef phi = LLVMBuildPhi(g->builder, LLVMInt1Type(), ""); | 500 | LLVMValueRef phi = LLVMBuildPhi(g->builder, LLVMInt1Type(), ""); |
| 499 | LLVMValueRef incoming_values[2] = {val1, val2}; | 501 | LLVMValueRef incoming_values[2] = {val1, val2}; |
| 500 | LLVMBasicBlockRef incoming_blocks[2] = {orig_block, true_block}; | 502 | LLVMBasicBlockRef incoming_blocks[2] = {post_val1_block, post_val2_block}; |
| 501 | LLVMAddIncoming(phi, incoming_values, incoming_blocks, 2); | 503 | LLVMAddIncoming(phi, incoming_values, incoming_blocks, 2); |
| 502 | | 504 | |
| 503 | return phi; | 505 | return phi; |
| ... | @@ -507,8 +509,7 @@ static LLVMValueRef gen_bool_or_expr(CodeGen *g, AstNode *expr_node) { | ... | @@ -507,8 +509,7 @@ static LLVMValueRef gen_bool_or_expr(CodeGen *g, AstNode *expr_node) { |
| 507 | assert(expr_node->type == NodeTypeBinOpExpr); | 509 | assert(expr_node->type == NodeTypeBinOpExpr); |
| 508 | | 510 | |
| 509 | LLVMValueRef val1 = gen_expr(g, expr_node->data.bin_op_expr.op1); | 511 | LLVMValueRef val1 = gen_expr(g, expr_node->data.bin_op_expr.op1); |
| 510 | | 512 | LLVMBasicBlockRef post_val1_block = LLVMGetInsertBlock(g->builder); |
| 511 | LLVMBasicBlockRef orig_block = LLVMGetInsertBlock(g->builder); | | |
| 512 | | 513 | |
| 513 | // block for when val1 == false | 514 | // block for when val1 == false |
| 514 | LLVMBasicBlockRef false_block = LLVMAppendBasicBlock(g->cur_fn->fn_value, "BoolOrFalse"); | 515 | 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) { | ... | @@ -520,6 +521,9 @@ static LLVMValueRef gen_bool_or_expr(CodeGen *g, AstNode *expr_node) { |
| 520 | | 521 | |
| 521 | LLVMPositionBuilderAtEnd(g->builder, false_block); | 522 | LLVMPositionBuilderAtEnd(g->builder, false_block); |
| 522 | LLVMValueRef val2 = gen_expr(g, expr_node->data.bin_op_expr.op2); | 523 | LLVMValueRef val2 = gen_expr(g, expr_node->data.bin_op_expr.op2); |
| | 524 | |
| | 525 | LLVMBasicBlockRef post_val2_block = LLVMGetInsertBlock(g->builder); |
| | 526 | |
| 523 | add_debug_source_node(g, expr_node); | 527 | add_debug_source_node(g, expr_node); |
| 524 | LLVMBuildBr(g->builder, true_block); | 528 | LLVMBuildBr(g->builder, true_block); |
| 525 | | 529 | |
| ... | @@ -527,7 +531,7 @@ static LLVMValueRef gen_bool_or_expr(CodeGen *g, AstNode *expr_node) { | ... | @@ -527,7 +531,7 @@ static LLVMValueRef gen_bool_or_expr(CodeGen *g, AstNode *expr_node) { |
| 527 | add_debug_source_node(g, expr_node); | 531 | add_debug_source_node(g, expr_node); |
| 528 | LLVMValueRef phi = LLVMBuildPhi(g->builder, LLVMInt1Type(), ""); | 532 | LLVMValueRef phi = LLVMBuildPhi(g->builder, LLVMInt1Type(), ""); |
| 529 | LLVMValueRef incoming_values[2] = {val1, val2}; | 533 | LLVMValueRef incoming_values[2] = {val1, val2}; |
| 530 | LLVMBasicBlockRef incoming_blocks[2] = {orig_block, false_block}; | 534 | LLVMBasicBlockRef incoming_blocks[2] = {post_val1_block, post_val2_block}; |
| 531 | LLVMAddIncoming(phi, incoming_values, incoming_blocks, 2); | 535 | LLVMAddIncoming(phi, incoming_values, incoming_blocks, 2); |
| 532 | | 536 | |
| 533 | return phi; | 537 | return phi; |