diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 55bbffb18879fb..728cd094e1ebc1 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -6783,9 +6783,11 @@ static bool SwitchToLookupTable(SwitchInst *SI, IRBuilder<> &Builder, return SwitchLookupTable::WouldFitInRegister( DL, UpperBound, KV.second /* ResultType */); })) { + // There may be some case index lager than the UpperBound (unreachable + // case), so make sure the table size does not get smaller. + TableSize = std::max(UpperBound, TableSize); // The default branch is unreachable after we enlarge the lookup table. // Adjust DefaultIsReachable to reuse code path. - TableSize = UpperBound; DefaultIsReachable = false; } } diff --git a/llvm/test/Transforms/SimplifyCFG/switch_mask.ll b/llvm/test/Transforms/SimplifyCFG/switch_mask.ll index 17f7b583ee840e..51c15774d47628 100644 --- a/llvm/test/Transforms/SimplifyCFG/switch_mask.ll +++ b/llvm/test/Transforms/SimplifyCFG/switch_mask.ll @@ -214,3 +214,28 @@ lor.end: ; preds = %default, %for.end, %retval.0.i.i = phi i32 [ 1, %default ], [ 0, %for.end ], [ 0, %for.end ], [ 0, %for.end ] ret void } + +define i1 @pr88607() { +; CHECK-LABEL: @pr88607( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[COND:%.*]] = select i1 false, i32 4, i32 1 +; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 false, i32 2, i32 [[COND]] +; CHECK-NEXT: ret i1 false +; +entry: + %cond = select i1 false, i32 4, i32 1 + %spec.select = select i1 false, i32 2, i32 %cond + switch i32 %spec.select, label %lor.rhs [ + i32 0, label %exit + i32 5, label %exit ; unreachable large case index + i32 1, label %exit + ] + +lor.rhs: ; preds = %entry + br label %exit + +exit: ; preds = %lor.rhs, %entry, %entry, %entry, %entry + %res.ph = phi i1 [ false, %entry ], [ false, %lor.rhs ], [ false, %entry ], [ false, %entry ] + ret i1 %res.ph +} +