From 50d820a9f7400e47694b6da5b01f949ee2ef7bfb Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Tue, 9 Aug 2011 21:39:34 +0200 Subject: [PATCH] LLVM requires two PHI entries if a previous bblock branches to the current bblock using a conditional branch whose two targets are the same. Fixes #171. --- mono/mini/iltests.il.in | 21 ++++++++++++++++++++- mono/mini/mini-llvm.c | 11 ++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/mono/mini/iltests.il.in b/mono/mini/iltests.il.in index 1f0765d4f36..7deb8983ddb 100644 --- a/mono/mini/iltests.il.in +++ b/mono/mini/iltests.il.in @@ -2667,6 +2667,25 @@ END: call int32 class Tests::regress_693905_inner(int32, int32) ret } - + + .method public static + default int32 test_0_llvm_regress_171 () cil managed + { + .locals init ( + int32 i + ) + + call int32 Tests::return_1_noinline () + ldc.i4.0 + beq L1 + ldc.i4.1 + stloc.s 0 + call int32 Tests::return_1_noinline () + ldc.i4.0 + beq L1 + L1: + ldloc.s 0 + ret + } } diff --git a/mono/mini/mini-llvm.c b/mono/mini/mini-llvm.c index 8e9a758a77b..ac5adf9f15a 100644 --- a/mono/mini/mini-llvm.c +++ b/mono/mini/mini-llvm.c @@ -2468,7 +2468,16 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], lhs, rhs, ""); if (MONO_IS_COND_BRANCH_OP (ins->next)) { - LLVMBuildCondBr (builder, cmp, get_bb (ctx, ins->next->inst_true_bb), get_bb (ctx, ins->next->inst_false_bb)); + if (ins->next->inst_true_bb == ins->next->inst_false_bb) { + /* + * If the target bb contains PHI instructions, LLVM requires + * two PHI entries for this bblock, while we only generate one. + * So convert this to an unconditional bblock. (bxc #171). + */ + LLVMBuildBr (builder, get_bb (ctx, ins->next->inst_true_bb)); + } else { + LLVMBuildCondBr (builder, cmp, get_bb (ctx, ins->next->inst_true_bb), get_bb (ctx, ins->next->inst_false_bb)); + } has_terminator = TRUE; } else if (MONO_IS_SETCC (ins->next)) { sprintf (dname_buf, "t%d", ins->next->dreg); -- 2.11.4.GIT