mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-27 13:30:05 +00:00
01e223e92e
SimplifyCFG currently does this transformation, but I'm planning to remove that to allow other passes, such as this one, to exploit the unreachable default. This patch takes care to keep track of what case values are unreachable even after the transformation, allowing for more efficient lowering. Differential Revision: http://reviews.llvm.org/D6697 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226934 91177308-0d34-0410-b5e6-96231b3b80d8
45 lines
660 B
LLVM
45 lines
660 B
LLVM
; RUN: opt < %s -lowerswitch -S | FileCheck %s
|
|
;
|
|
; The switch is lowered with a single icmp.
|
|
; CHECK: icmp
|
|
; CHECK-NOT: icmp
|
|
;
|
|
;int foo(int a) {
|
|
;
|
|
; switch (a) {
|
|
; case 0:
|
|
; return 10;
|
|
; case 1:
|
|
; return 3;
|
|
; default:
|
|
; __builtin_unreachable();
|
|
; }
|
|
;
|
|
;}
|
|
|
|
define i32 @foo(i32 %a) {
|
|
%1 = alloca i32, align 4
|
|
%2 = alloca i32, align 4
|
|
store i32 %a, i32* %2, align 4
|
|
%3 = load i32* %2, align 4
|
|
switch i32 %3, label %6 [
|
|
i32 0, label %4
|
|
i32 1, label %5
|
|
]
|
|
|
|
; <label>:4
|
|
store i32 10, i32* %1
|
|
br label %7
|
|
|
|
; <label>:5
|
|
store i32 3, i32* %1
|
|
br label %7
|
|
|
|
; <label>:6
|
|
unreachable
|
|
|
|
; <label>:7
|
|
%8 = load i32* %1
|
|
ret i32 %8
|
|
}
|