Index: lib/Transforms/Utils/SimplifyCFG.cpp =================================================================== --- lib/Transforms/Utils/SimplifyCFG.cpp +++ lib/Transforms/Utils/SimplifyCFG.cpp @@ -5174,7 +5174,7 @@ for (auto ValuePair : Values) { Constant *CaseConst = ConstantExpr::getICmp(CmpInst->getPredicate(), ValuePair.second, CmpOp1, true); - if (!CaseConst || CaseConst == DefaultConst) + if (!CaseConst || CaseConst == DefaultConst || isa(CaseConst)) return; assert((CaseConst == TrueConst || CaseConst == FalseConst) && "Expect true or false as compare result."); Index: test/Transforms/SimplifyCFG/switch_undef.ll =================================================================== --- /dev/null +++ test/Transforms/SimplifyCFG/switch_undef.ll @@ -0,0 +1,23 @@ +; RUN: opt %s -keep-loops=false -switch-to-lookup=true -simplifycfg -S | FileCheck %s + +define void @f6() #0 { +; CHECK-LABEL: entry: + +entry: + br label %for.cond.i + +for.cond.i: ; preds = %f1.exit.i, %entry + switch i16 undef, label %f1.exit.i [ + i16 -1, label %cond.false.i3.i + i16 1, label %cond.false.i3.i + i16 0, label %cond.false.i3.i + ] + +cond.false.i3.i: ; preds = %for.cond.i, %for.cond.i, %for.cond.i + br label %f1.exit.i + +f1.exit.i: ; preds = %cond.false.i3.i, %for.cond.i + %cond.i4.i = phi i16 [ undef, %cond.false.i3.i ], [ 1, %for.cond.i ] + %tobool7.i = icmp ne i16 %cond.i4.i, 0 + br label %for.cond.i +}