blob: a109b317c7320a1fade6030a86e575ff0253f15a [file] [log] [blame]
Eric Christophercee313d2019-04-17 04:52:47 +00001; RUN: opt %s -simplifycfg -S | FileCheck %s
2
3declare i32 @f(i32)
4
5define i32 @basic(i32 %x) {
6; CHECK-LABEL: @basic
7; CHECK: x.off = add i32 %x, -5
8; CHECK: %switch = icmp ult i32 %x.off, 3
9; CHECK: br i1 %switch, label %a, label %default
10
11entry:
12 switch i32 %x, label %default [
13 i32 5, label %a
14 i32 6, label %a
15 i32 7, label %a
16 ]
17default:
18 %0 = call i32 @f(i32 0)
19 ret i32 %0
20a:
21 %1 = call i32 @f(i32 1)
22 ret i32 %1
23}
24
25
26define i32 @unreachable(i32 %x) {
27; CHECK-LABEL: @unreachable
28; CHECK: x.off = add i32 %x, -5
29; CHECK: %switch = icmp ult i32 %x.off, 3
30; CHECK: br i1 %switch, label %a, label %b
31
32entry:
33 switch i32 %x, label %unreachable [
34 i32 5, label %a
35 i32 6, label %a
36 i32 7, label %a
37 i32 10, label %b
38 i32 20, label %b
39 i32 30, label %b
40 i32 40, label %b
41 ]
42unreachable:
43 unreachable
44a:
45 %0 = call i32 @f(i32 0)
46 ret i32 %0
47b:
48 %1 = call i32 @f(i32 1)
49 ret i32 %1
50}
51
52
53define i32 @unreachable2(i32 %x) {
54; CHECK-LABEL: @unreachable2
55; CHECK: x.off = add i32 %x, -5
56; CHECK: %switch = icmp ult i32 %x.off, 3
57; CHECK: br i1 %switch, label %a, label %b
58
59entry:
60 ; Note: folding the most popular case destination into the default
61 ; would prevent switch-to-icmp here.
62 switch i32 %x, label %unreachable [
63 i32 5, label %a
64 i32 6, label %a
65 i32 7, label %a
66 i32 10, label %b
67 i32 20, label %b
68 ]
69unreachable:
70 unreachable
71a:
72 %0 = call i32 @f(i32 0)
73 ret i32 %0
74b:
75 %1 = call i32 @f(i32 1)
76 ret i32 %1
77}