blob: c0f6a43fda375675eeeb9f7443ff2876289efe92 [file] [log] [blame]
Shawn Landden24f40852019-06-13 19:36:38 +00001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
Eric Christophercee313d2019-04-17 04:52:47 +00002; RUN: opt %s -simplifycfg -S | FileCheck %s
3
4declare i32 @f(i32)
5
6define i32 @basic(i32 %x) {
Shawn Landden24f40852019-06-13 19:36:38 +00007; CHECK-LABEL: @basic(
8; CHECK-NEXT: entry:
9; CHECK-NEXT: [[X_OFF:%.*]] = add i32 [[X:%.*]], -5
10; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i32 [[X_OFF]], 3
11; CHECK-NEXT: br i1 [[SWITCH]], label [[A:%.*]], label [[DEFAULT:%.*]]
12; CHECK: default:
13; CHECK-NEXT: [[TMP0:%.*]] = call i32 @f(i32 0)
14; CHECK-NEXT: ret i32 [[TMP0]]
15; CHECK: a:
16; CHECK-NEXT: [[TMP1:%.*]] = call i32 @f(i32 1)
17; CHECK-NEXT: ret i32 [[TMP1]]
18;
Eric Christophercee313d2019-04-17 04:52:47 +000019
20entry:
21 switch i32 %x, label %default [
Shawn Landden24f40852019-06-13 19:36:38 +000022 i32 5, label %a
23 i32 6, label %a
24 i32 7, label %a
Eric Christophercee313d2019-04-17 04:52:47 +000025 ]
26default:
27 %0 = call i32 @f(i32 0)
28 ret i32 %0
29a:
30 %1 = call i32 @f(i32 1)
31 ret i32 %1
32}
33
34
35define i32 @unreachable(i32 %x) {
Shawn Landden24f40852019-06-13 19:36:38 +000036; CHECK-LABEL: @unreachable(
37; CHECK-NEXT: entry:
38; CHECK-NEXT: [[X_OFF:%.*]] = add i32 [[X:%.*]], -5
39; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i32 [[X_OFF]], 3
40; CHECK-NEXT: br i1 [[SWITCH]], label [[A:%.*]], label [[B:%.*]]
41; CHECK: a:
42; CHECK-NEXT: [[TMP0:%.*]] = call i32 @f(i32 0)
43; CHECK-NEXT: ret i32 [[TMP0]]
44; CHECK: b:
45; CHECK-NEXT: [[TMP1:%.*]] = call i32 @f(i32 1)
46; CHECK-NEXT: ret i32 [[TMP1]]
47;
Eric Christophercee313d2019-04-17 04:52:47 +000048
49entry:
50 switch i32 %x, label %unreachable [
Shawn Landden24f40852019-06-13 19:36:38 +000051 i32 5, label %a
52 i32 6, label %a
53 i32 7, label %a
54 i32 10, label %b
55 i32 20, label %b
56 i32 30, label %b
57 i32 40, label %b
Eric Christophercee313d2019-04-17 04:52:47 +000058 ]
59unreachable:
60 unreachable
61a:
62 %0 = call i32 @f(i32 0)
63 ret i32 %0
64b:
65 %1 = call i32 @f(i32 1)
66 ret i32 %1
67}
68
69
70define i32 @unreachable2(i32 %x) {
Shawn Landden24f40852019-06-13 19:36:38 +000071; CHECK-LABEL: @unreachable2(
72; CHECK-NEXT: entry:
73; CHECK-NEXT: [[X_OFF:%.*]] = add i32 [[X:%.*]], -5
74; CHECK-NEXT: [[SWITCH:%.*]] = icmp ult i32 [[X_OFF]], 3
75; CHECK-NEXT: br i1 [[SWITCH]], label [[A:%.*]], label [[B:%.*]]
76; CHECK: a:
77; CHECK-NEXT: [[TMP0:%.*]] = call i32 @f(i32 0)
78; CHECK-NEXT: ret i32 [[TMP0]]
79; CHECK: b:
80; CHECK-NEXT: [[TMP1:%.*]] = call i32 @f(i32 1)
81; CHECK-NEXT: ret i32 [[TMP1]]
82;
Eric Christophercee313d2019-04-17 04:52:47 +000083
84entry:
85 ; Note: folding the most popular case destination into the default
86 ; would prevent switch-to-icmp here.
87 switch i32 %x, label %unreachable [
Shawn Landden24f40852019-06-13 19:36:38 +000088 i32 5, label %a
89 i32 6, label %a
90 i32 7, label %a
91 i32 10, label %b
92 i32 20, label %b
Eric Christophercee313d2019-04-17 04:52:47 +000093 ]
94unreachable:
95 unreachable
96a:
97 %0 = call i32 @f(i32 0)
98 ret i32 %0
99b:
100 %1 = call i32 @f(i32 1)
101 ret i32 %1
102}