Skip to content

Commit

Permalink
[SimplifyCFG] Fix crash when there is unreachable large index
Browse files Browse the repository at this point in the history
The large case index out of scope is dead code, but it is still
be created in TableContents in SwitchLookupTable::SwitchLookupTable
so make sure the table size after growing should not get smaller.

Fix llvm#88607
  • Loading branch information
vfdff committed Apr 13, 2024
1 parent abfc5ef commit ce88ccf
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
4 changes: 3 additions & 1 deletion llvm/lib/Transforms/Utils/SimplifyCFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down
25 changes: 25 additions & 0 deletions llvm/test/Transforms/SimplifyCFG/switch_mask.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

0 comments on commit ce88ccf

Please sign in to comment.