xref: /llvm-project/llvm/test/Transforms/Inline/inline-cost-switch-default.ll (revision d48bf8aef2abeb915b1e04e1b78051869088df42)
1; RUN: opt -S -passes=inline %s -debug-only=inline-cost -min-jump-table-entries=4 --disable-output 2>&1 | FileCheck %s -check-prefix=LOOKUPTABLE -match-full-lines
2; RUN: opt -S -passes=inline %s -debug-only=inline-cost -min-jump-table-entries=5 --disable-output 2>&1 | FileCheck %s -check-prefix=SWITCH -match-full-lines
3; REQUIRES: x86_64-linux, asserts
4
5target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
6target triple = "x86_64-unknown-linux-gnu"
7
8define i64 @main(i64 %a) {
9  %b = call i64 @small_switch_default(i64 %a)
10  %c = call i64 @small_switch_no_default(i64 %a)
11  %d = call i64 @lookup_table_default(i64 %a)
12  %e = call i64 @lookup_table_no_default(i64 %a)
13  ret i64 %b
14}
15
16; SWITCH-LABEL: Analyzing call of small_switch_default{{.*}}
17; SWITCH: Cost: 0
18define i64 @small_switch_default(i64 %a) {
19  switch i64 %a, label %default_branch [
20  i64 -1, label %branch_0
21  i64 8, label %branch_1
22  i64 52, label %branch_2
23  ]
24
25branch_0:
26  br label %exit
27
28branch_1:
29  br label %exit
30
31branch_2:
32  br label %exit
33
34default_branch:
35  br label %exit
36
37exit:
38  %b = phi i64 [ 5, %branch_0 ], [ 9, %branch_1 ], [ 2, %branch_2 ], [ 3, %default_branch ]
39  ret i64 %b
40}
41
42; SWITCH-LABEL: Analyzing call of small_switch_no_default{{.*}}
43; SWITCH: Cost: -10
44define i64 @small_switch_no_default(i64 %a) {
45  switch i64 %a, label %unreachabledefault [
46  i64 -1, label %branch_0
47  i64 8, label %branch_1
48  i64 52, label %branch_2
49  ]
50
51branch_0:
52  br label %exit
53
54branch_1:
55  br label %exit
56
57branch_2:
58  br label %exit
59
60unreachabledefault:
61  unreachable
62
63exit:
64  %b = phi i64 [ 5, %branch_0 ], [ 9, %branch_1 ], [ 2, %branch_2 ]
65  ret i64 %b
66}
67
68; LOOKUPTABLE-LABEL: Analyzing call of lookup_table_default{{.*}}
69; LOOKUPTABLE: Cost: 10
70; SWITCH-LABEL: Analyzing call of lookup_table_default{{.*}}
71; SWITCH: Cost: 20
72define i64 @lookup_table_default(i64 %a) {
73  switch i64 %a, label %default_branch [
74  i64 0, label %branch_0
75  i64 1, label %branch_1
76  i64 2, label %branch_2
77  i64 3, label %branch_3
78  ]
79
80branch_0:
81  br label %exit
82
83branch_1:
84  br label %exit
85
86branch_2:
87  br label %exit
88
89branch_3:
90  br label %exit
91
92default_branch:
93  br label %exit
94
95exit:
96  %b = phi i64 [ 5, %branch_0 ], [ 9, %branch_1 ], [ 2, %branch_2 ], [ 7, %branch_3 ], [ 3, %default_branch ]
97  ret i64 %b
98}
99
100; LOOKUPTABLE-LABEL: Analyzing call of lookup_table_no_default{{.*}}
101; LOOKUPTABLE: Cost: 0
102; SWITCH-LABEL: Analyzing call of lookup_table_no_default{{.*}}
103; SWITCH: Cost: 20
104define i64 @lookup_table_no_default(i64 %a) {
105  switch i64 %a, label %unreachabledefault [
106  i64 0, label %branch_0
107  i64 1, label %branch_1
108  i64 2, label %branch_2
109  i64 3, label %branch_3
110  ]
111
112branch_0:
113  br label %exit
114
115branch_1:
116  br label %exit
117
118branch_2:
119  br label %exit
120
121branch_3:
122  br label %exit
123
124unreachabledefault:
125  unreachable
126
127exit:
128  %b = phi i64 [ 5, %branch_0 ], [ 9, %branch_1 ], [ 2, %branch_2 ], [ 7, %branch_3 ]
129  ret i64 %b
130}
131