diff --git a/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp b/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp --- a/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp @@ -1269,6 +1269,12 @@ // ... ... // \ / // phi [true] [false] + // and + // switch (cond) + // case v1: / \ case v2: + // ... ... + // \ / + // phi [v1] [v2] // Make sure all inputs are constants. if (!all_of(PN.operands(), [](Value *V) { return isa(V); })) return nullptr; @@ -1296,6 +1302,10 @@ AddSucc(ConstantInt::getTrue(Context), BI->getSuccessor(0)); AddSucc(ConstantInt::getFalse(Context), BI->getSuccessor(1)); } else if (auto *SI = dyn_cast(IDom->getTerminator())) { + // Can't generally replace Phi with Cond if we can get there from default + // case. + if (SI->getDefaultDest() == PN.getParent()) + return nullptr; Cond = SI->getCondition(); for (auto Case : SI->cases()) AddSucc(Case.getCaseValue(), Case.getCaseSuccessor()); diff --git a/llvm/test/Transforms/InstCombine/simple_phi_condition.ll b/llvm/test/Transforms/InstCombine/simple_phi_condition.ll --- a/llvm/test/Transforms/InstCombine/simple_phi_condition.ll +++ b/llvm/test/Transforms/InstCombine/simple_phi_condition.ll @@ -585,3 +585,34 @@ %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %sw.19 ], [ 42, %entry ] ret i8 %ret } + +define i8 @test_switch_default_edge_direct(i8 %cond) { +; CHECK-LABEL: @test_switch_default_edge_direct( +; CHECK-NEXT: entry: +; CHECK-NEXT: switch i8 [[COND:%.*]], label [[MERGE:%.*]] [ +; CHECK-NEXT: i8 1, label [[SW_1:%.*]] +; CHECK-NEXT: i8 7, label [[SW_7:%.*]] +; CHECK-NEXT: i8 19, label [[MERGE]] +; CHECK-NEXT: ] +; CHECK: sw.1: +; CHECK-NEXT: br label [[MERGE]] +; CHECK: sw.7: +; CHECK-NEXT: br label [[MERGE]] +; CHECK: merge: +; CHECK-NEXT: [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 19, [[ENTRY:%.*]] ], [ 19, [[ENTRY]] ] +; CHECK-NEXT: ret i8 [[RET]] +; +entry: + switch i8 %cond, label %merge [ + i8 1, label %sw.1 + i8 7, label %sw.7 + i8 19, label %merge + ] +sw.1: + br label %merge +sw.7: + br label %merge +merge: + %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %entry ], [ 19, %entry ] + ret i8 %ret +}