mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-25 10:27:04 +00:00
SelectionDAG switch lowering: Replace unreachable default with most popular case.
This can significantly reduce the size of the switch, allowing for more efficient lowering. I also worked with the idea of exploiting unreachable defaults by omitting the range check for jump tables, but always ended up with a non-neglible binary size increase. It might be worth looking into some more. SimplifyCFG currently does this transformation, but I'm working towards changing that so we can optimize harder based on unreachable defaults. Differential Revision: http://reviews.llvm.org/D6510 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223566 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -41,7 +41,7 @@ entry:
|
||||
i1 false, label %label_end
|
||||
]
|
||||
default:
|
||||
unreachable
|
||||
br label %label_end
|
||||
|
||||
label_true:
|
||||
br label %label_end
|
||||
@@ -80,7 +80,7 @@ entry:
|
||||
i1 false, label %label_end
|
||||
]
|
||||
default:
|
||||
unreachable
|
||||
br label %label_end
|
||||
|
||||
label_true:
|
||||
br label %label_end
|
||||
@@ -119,7 +119,7 @@ entry:
|
||||
i1 false, label %label_end
|
||||
]
|
||||
default:
|
||||
unreachable
|
||||
br label %label_end
|
||||
|
||||
label_true:
|
||||
br label %label_end
|
||||
|
||||
@@ -24,7 +24,7 @@ if.end: ; preds = %if.then
|
||||
br label %cleanup
|
||||
|
||||
cleanup: ; preds = %if.end, %if.then9
|
||||
switch i32 undef, label %unreachable [
|
||||
switch i32 undef, label %default [
|
||||
i32 0, label %cleanup.cont
|
||||
i32 1, label %if.end11
|
||||
]
|
||||
@@ -35,6 +35,6 @@ cleanup.cont: ; preds = %cleanup
|
||||
if.end11: ; preds = %cleanup.cont, %cleanup, %land.lhs.true, %entry
|
||||
ret void
|
||||
|
||||
unreachable: ; preds = %cleanup
|
||||
unreachable
|
||||
default: ; preds = %cleanup
|
||||
br label %if.end11
|
||||
}
|
||||
|
||||
52
test/CodeGen/X86/switch-jump-table.ll
Normal file
52
test/CodeGen/X86/switch-jump-table.ll
Normal file
@@ -0,0 +1,52 @@
|
||||
; RUN: llc -march=x86 < %s | FileCheck %s
|
||||
|
||||
|
||||
; An unreachable default destination is replaced with the most popular case label.
|
||||
|
||||
define void @sum2(i32 %x, i32* %to) {
|
||||
; CHECK-LABEL: sum2:
|
||||
; CHECK: movl 4(%esp), [[REG:%e[a-z]{2}]]
|
||||
; cmpl $3, [[REG]]
|
||||
; CHECK: jbe .LBB0_1
|
||||
; CHECK: movl $4
|
||||
; CHECK: retl
|
||||
; CHECK-LABEL: .LBB0_1:
|
||||
; CHECK-NEXT: jmpl *.LJTI0_0(,[[REG]],4)
|
||||
|
||||
entry:
|
||||
switch i32 %x, label %default [
|
||||
i32 0, label %bb0
|
||||
i32 1, label %bb1
|
||||
i32 2, label %bb2
|
||||
i32 3, label %bb3
|
||||
i32 4, label %bb4
|
||||
i32 5, label %bb4
|
||||
]
|
||||
bb0:
|
||||
store i32 0, i32* %to
|
||||
br label %exit
|
||||
bb1:
|
||||
store i32 1, i32* %to
|
||||
br label %exit
|
||||
bb2:
|
||||
store i32 2, i32* %to
|
||||
br label %exit
|
||||
bb3:
|
||||
store i32 3, i32* %to
|
||||
br label %exit
|
||||
bb4:
|
||||
store i32 4, i32* %to
|
||||
br label %exit
|
||||
exit:
|
||||
ret void
|
||||
default:
|
||||
unreachable
|
||||
|
||||
; The jump table has four entries.
|
||||
; CHECK-LABEL: .LJTI0_0:
|
||||
; CHECK-NEXT: .long .LBB0_2
|
||||
; CHECK-NEXT: .long .LBB0_3
|
||||
; CHECK-NEXT: .long .LBB0_4
|
||||
; CHECK-NEXT: .long .LBB0_5
|
||||
; CHECK-NOT: .long
|
||||
}
|
||||
Reference in New Issue
Block a user