diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index 2d98c8bce..a76b9c078 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -1271,6 +1271,8 @@ static inline void llvm_emit_access_addr(GenContext *c, BEValue *be_value, Expr void llvm_set_phi(LLVMValueRef phi, LLVMValueRef val1, LLVMBasicBlockRef block1, LLVMValueRef val2, LLVMBasicBlockRef block2) { + ASSERT(!llvm_basic_block_is_unused(block1)); + ASSERT(!llvm_basic_block_is_unused(block2)); LLVMValueRef vals[2] = { val1, val2 }; LLVMBasicBlockRef blocks[2] = { block1, block2 }; LLVMAddIncoming(phi, vals, blocks, 2); @@ -1292,6 +1294,21 @@ void llvm_new_phi(GenContext *c, BEValue *value, const char *name, Type *type, L val2 = LLVMBuildZExt(c->builder, val2, ret_type, ""); } } + if (llvm_basic_block_is_unused(block1)) + { + if (llvm_basic_block_is_unused(block2)) + { + llvm_value_set(value, llvm_get_zero_raw(ret_type), type); + return; + } + llvm_value_set(value, val2, type); + return; + } + if (llvm_basic_block_is_unused(block2)) + { + llvm_value_set(value, val1, type); + return; + } LLVMValueRef phi = LLVMBuildPhi(c->builder, ret_type, name); llvm_set_phi(phi, val1, block1, val2, block2); llvm_value_set(value, phi, type); @@ -3429,6 +3446,10 @@ static void llvm_emit_slice_comp(GenContext *c, BEValue *be_value, BEValue *lhs, LLVMValueRef failure = LLVMConstInt(c->bool_type, want_match ? 0 : 1, false); LLVMValueRef logic_values[3] = { success, failure, failure }; LLVMBasicBlockRef blocks[3] = { all_match_block, no_match_block, match_fail_block }; + for (int i = 0; i < 3; i++) + { + ASSERT(!llvm_basic_block_is_unused(blocks[i])); + } LLVMAddIncoming(phi, logic_values, blocks, 3); llvm_value_set(be_value, phi, type_bool); @@ -6666,9 +6687,9 @@ static inline void llvm_emit_builtin_access(GenContext *c, BEValue *be_value, Ex LLVMValueRef fault_data = LLVMBuildIntToPtr(c->builder, be_value->value, c->ptr_type, ""); llvm_emit_br(c, exit_block); llvm_emit_block(c, exit_block); - LLVMValueRef phi = LLVMBuildPhi(c->builder, c->ptr_type, "faultname"); - llvm_set_phi(phi, zero.value, zero_block, fault_data, ok_block); - llvm_value_set_address_abi_aligned(c, be_value, phi, type_chars); + + llvm_new_phi(c, be_value, "faultname.phi", type_chars, zero.value, zero_block, fault_data, ok_block); + llvm_value_set_address_abi_aligned(c, be_value, be_value->value, type_chars); return; } case ACCESS_ENUMNAME: diff --git a/test/test_suite/errors/printing_errors.c3t b/test/test_suite/errors/printing_errors.c3t index 742f63637..9eb3a027d 100644 --- a/test/test_suite/errors/printing_errors.c3t +++ b/test/test_suite/errors/printing_errors.c3t @@ -36,8 +36,8 @@ faultname_ok: ; preds = %entry br label %faultname_exit faultname_exit: ; preds = %faultname_ok, %faultname_no - %faultname = phi ptr [ %faultname_zero, %faultname_no ], [ %3, %faultname_ok ] - %4 = insertvalue %any undef, ptr %faultname, 0 + %faultname.phi = phi ptr [ %faultname_zero, %faultname_no ], [ %3, %faultname_ok ] + %4 = insertvalue %any undef, ptr %faultname.phi, 0 %5 = insertvalue %any %4, i64 ptrtoint (ptr @"$ct.String" to i64), 1 %ptradd = getelementptr inbounds i8, ptr %varargslots, i64 16 store %any %5, ptr %ptradd, align 16