forked from OSchip/llvm-project
Transforms: Don't create bad weights when eliminating dead cases
If we happen to eliminate every case in a switch that has branch weights, we currently try to create metadata for the one remaining branch, triggering an assert. Instead, we need to check that the metadata we're trying to create is sensible. llvm-svn: 197791
This commit is contained in:
parent
668eb1f746
commit
0ba3f211c4
|
@ -3222,7 +3222,7 @@ static bool EliminateDeadSwitchCases(SwitchInst *SI) {
|
|||
Case.getCaseSuccessor()->removePredecessor(SI->getParent());
|
||||
SI->removeCase(Case);
|
||||
}
|
||||
if (HasWeight) {
|
||||
if (HasWeight && Weights.size() >= 2) {
|
||||
SmallVector<uint32_t, 8> MDWeights(Weights.begin(), Weights.end());
|
||||
SI->setMetadata(LLVMContext::MD_prof,
|
||||
MDBuilder(SI->getParent()->getContext()).
|
||||
|
|
|
@ -313,6 +313,31 @@ sw.epilog:
|
|||
ret void
|
||||
}
|
||||
|
||||
;; If every case is dead, make sure they are all removed. This used to
|
||||
;; crash trying to merge the metadata.
|
||||
define void @test13(i32 %x) nounwind {
|
||||
entry:
|
||||
%i = shl i32 %x, 1
|
||||
switch i32 %i, label %a [
|
||||
i32 21, label %b
|
||||
i32 25, label %c
|
||||
], !prof !8
|
||||
; CHECK-LABEL: @test13(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: call void @helper
|
||||
; CHECK-NEXT: ret void
|
||||
|
||||
a:
|
||||
call void @helper(i32 0) nounwind
|
||||
ret void
|
||||
b:
|
||||
call void @helper(i32 1) nounwind
|
||||
ret void
|
||||
c:
|
||||
call void @helper(i32 2) nounwind
|
||||
ret void
|
||||
}
|
||||
|
||||
!0 = metadata !{metadata !"branch_weights", i32 3, i32 5}
|
||||
!1 = metadata !{metadata !"branch_weights", i32 1, i32 1}
|
||||
!2 = metadata !{metadata !"branch_weights", i32 1, i32 2}
|
||||
|
|
Loading…
Reference in New Issue