Skip to content

Commit 37b7207

Browse files
authored
[SimplifyCFG] Fix crash when there is unreachable large index (#88616)
The large case index out of scope is dead code, but it is still be created for TableContents in SwitchLookupTable::SwitchLookupTable, so make sure the table size after growing should not get smaller. Fix #88607
1 parent 9c3475a commit 37b7207

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6783,9 +6783,11 @@ static bool SwitchToLookupTable(SwitchInst *SI, IRBuilder<> &Builder,
67836783
return SwitchLookupTable::WouldFitInRegister(
67846784
DL, UpperBound, KV.second /* ResultType */);
67856785
})) {
6786+
// There may be some case index larger than the UpperBound (unreachable
6787+
// case), so make sure the table size does not get smaller.
6788+
TableSize = std::max(UpperBound, TableSize);
67866789
// The default branch is unreachable after we enlarge the lookup table.
67876790
// Adjust DefaultIsReachable to reuse code path.
6788-
TableSize = UpperBound;
67896791
DefaultIsReachable = false;
67906792
}
67916793
}

llvm/test/Transforms/SimplifyCFG/switch_mask.ll

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,28 @@ lor.end: ; preds = %default, %for.end,
214214
%retval.0.i.i = phi i32 [ 1, %default ], [ 0, %for.end ], [ 0, %for.end ], [ 0, %for.end ]
215215
ret void
216216
}
217+
218+
define i1 @pr88607() {
219+
; CHECK-LABEL: @pr88607(
220+
; CHECK-NEXT: entry:
221+
; CHECK-NEXT: [[COND:%.*]] = select i1 false, i32 4, i32 1
222+
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 false, i32 2, i32 [[COND]]
223+
; CHECK-NEXT: ret i1 false
224+
;
225+
entry:
226+
%cond = select i1 false, i32 4, i32 1
227+
%spec.select = select i1 false, i32 2, i32 %cond
228+
switch i32 %spec.select, label %lor.rhs [
229+
i32 0, label %exit
230+
i32 5, label %exit ; unreachable large case index
231+
i32 1, label %exit
232+
]
233+
234+
lor.rhs: ; preds = %entry
235+
br label %exit
236+
237+
exit: ; preds = %lor.rhs, %entry, %entry, %entry, %entry
238+
%res.ph = phi i1 [ false, %entry ], [ false, %lor.rhs ], [ false, %entry ], [ false, %entry ]
239+
ret i1 %res.ph
240+
}
241+

0 commit comments

Comments
 (0)