mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-28 09:31:03 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197791 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
35c913b5b1
commit
bcb726dc8a
@ -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…
x
Reference in New Issue
Block a user