xref: /llvm-project/llvm/test/CodeGen/PowerPC/aix-lower-jump-table-mir.ll (revision 69b056d5638bbe3c8098b5d3a4980eb9929b9bbe)
1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
3; RUN: -ppc-min-jump-table-entries=4 -code-model=small -stop-after=machine-cp < %s | FileCheck \
4; RUN: --check-prefix=32SMALL-MIR %s
5
6; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
7; RUN: -ppc-min-jump-table-entries=4 -code-model=large -stop-after=machine-cp < %s | FileCheck \
8; RUN: --check-prefix=32LARGE-MIR %s
9
10; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
11; RUN: -ppc-min-jump-table-entries=4 -code-model=small -stop-after=machine-cp < %s | FileCheck \
12; RUN: --check-prefix=64SMALL-MIR %s
13
14; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
15; RUN: -ppc-min-jump-table-entries=4 -code-model=large -stop-after=machine-cp < %s | FileCheck \
16; RUN: --check-prefix=64LARGE-MIR %s
17
18define i32 @jump_table(i32 %a) {
19  ; 32SMALL-MIR-LABEL: name: jump_table
20  ; 32SMALL-MIR: bb.0.entry:
21  ; 32SMALL-MIR-NEXT:   successors: %bb.6(0x19999998), %bb.1(0x66666668)
22  ; 32SMALL-MIR-NEXT:   liveins: $r3
23  ; 32SMALL-MIR-NEXT: {{  $}}
24  ; 32SMALL-MIR-NEXT:   renamable $r3 = ADDI killed renamable $r3, -1
25  ; 32SMALL-MIR-NEXT:   renamable $cr0 = CMPLWI renamable $r3, 3
26  ; 32SMALL-MIR-NEXT:   BCC 44, killed renamable $cr0, %bb.6
27  ; 32SMALL-MIR-NEXT: {{  $}}
28  ; 32SMALL-MIR-NEXT: bb.1.entry:
29  ; 32SMALL-MIR-NEXT:   successors: %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000), %bb.5(0x20000000)
30  ; 32SMALL-MIR-NEXT:   liveins: $r3
31  ; 32SMALL-MIR-NEXT: {{  $}}
32  ; 32SMALL-MIR-NEXT:   renamable $r3 = RLWINM killed renamable $r3, 2, 0, 29
33  ; 32SMALL-MIR-NEXT:   renamable $r4 = LWZtoc %jump-table.0, $r2 :: (load (s32) from got)
34  ; 32SMALL-MIR-NEXT:   renamable $r3 = LWZX killed renamable $r3, renamable $r4 :: (load (s32) from jump-table)
35  ; 32SMALL-MIR-NEXT:   renamable $r3 = ADD4 killed renamable $r3, killed renamable $r4
36  ; 32SMALL-MIR-NEXT:   MTCTR killed renamable $r3, implicit-def $ctr
37  ; 32SMALL-MIR-NEXT:   BCTR implicit $ctr
38  ; 32SMALL-MIR-NEXT: {{  $}}
39  ; 32SMALL-MIR-NEXT: bb.2.sw.bb:
40  ; 32SMALL-MIR-NEXT:   successors: %bb.6(0x80000000)
41  ; 32SMALL-MIR-NEXT: {{  $}}
42  ; 32SMALL-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
43  ; 32SMALL-MIR-NEXT:   B %bb.6
44  ; 32SMALL-MIR-NEXT: {{  $}}
45  ; 32SMALL-MIR-NEXT: bb.3.sw.bb1:
46  ; 32SMALL-MIR-NEXT:   successors: %bb.6(0x80000000)
47  ; 32SMALL-MIR-NEXT: {{  $}}
48  ; 32SMALL-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
49  ; 32SMALL-MIR-NEXT:   B %bb.6
50  ; 32SMALL-MIR-NEXT: {{  $}}
51  ; 32SMALL-MIR-NEXT: bb.4.sw.bb2:
52  ; 32SMALL-MIR-NEXT:   successors: %bb.6(0x80000000)
53  ; 32SMALL-MIR-NEXT: {{  $}}
54  ; 32SMALL-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
55  ; 32SMALL-MIR-NEXT:   B %bb.6
56  ; 32SMALL-MIR-NEXT: {{  $}}
57  ; 32SMALL-MIR-NEXT: bb.5.sw.bb3:
58  ; 32SMALL-MIR-NEXT:   successors: %bb.6(0x80000000)
59  ; 32SMALL-MIR-NEXT: {{  $}}
60  ; 32SMALL-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
61  ; 32SMALL-MIR-NEXT: {{  $}}
62  ; 32SMALL-MIR-NEXT: bb.6.sw.epilog:
63  ; 32SMALL-MIR-NEXT:   $r3 = LI 0
64  ; 32SMALL-MIR-NEXT:   BLR implicit $lr, implicit $rm, implicit $r3
65  ;
66  ; 32LARGE-MIR-LABEL: name: jump_table
67  ; 32LARGE-MIR: bb.0.entry:
68  ; 32LARGE-MIR-NEXT:   successors: %bb.6(0x19999998), %bb.1(0x66666668)
69  ; 32LARGE-MIR-NEXT:   liveins: $r3
70  ; 32LARGE-MIR-NEXT: {{  $}}
71  ; 32LARGE-MIR-NEXT:   renamable $r3 = ADDI killed renamable $r3, -1
72  ; 32LARGE-MIR-NEXT:   renamable $cr0 = CMPLWI renamable $r3, 3
73  ; 32LARGE-MIR-NEXT:   BCC 44, killed renamable $cr0, %bb.6
74  ; 32LARGE-MIR-NEXT: {{  $}}
75  ; 32LARGE-MIR-NEXT: bb.1.entry:
76  ; 32LARGE-MIR-NEXT:   successors: %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000), %bb.5(0x20000000)
77  ; 32LARGE-MIR-NEXT:   liveins: $r3
78  ; 32LARGE-MIR-NEXT: {{  $}}
79  ; 32LARGE-MIR-NEXT:   renamable $r3 = RLWINM killed renamable $r3, 2, 0, 29
80  ; 32LARGE-MIR-NEXT:   renamable $r4 = ADDIStocHA $r2, %jump-table.0
81  ; 32LARGE-MIR-NEXT:   renamable $r4 = LWZtocL %jump-table.0, killed renamable $r4, implicit $r2 :: (load (s32) from got)
82  ; 32LARGE-MIR-NEXT:   renamable $r3 = LWZX killed renamable $r3, renamable $r4 :: (load (s32) from jump-table)
83  ; 32LARGE-MIR-NEXT:   renamable $r3 = ADD4 killed renamable $r3, killed renamable $r4
84  ; 32LARGE-MIR-NEXT:   MTCTR killed renamable $r3, implicit-def $ctr
85  ; 32LARGE-MIR-NEXT:   BCTR implicit $ctr
86  ; 32LARGE-MIR-NEXT: {{  $}}
87  ; 32LARGE-MIR-NEXT: bb.2.sw.bb:
88  ; 32LARGE-MIR-NEXT:   successors: %bb.6(0x80000000)
89  ; 32LARGE-MIR-NEXT: {{  $}}
90  ; 32LARGE-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
91  ; 32LARGE-MIR-NEXT:   B %bb.6
92  ; 32LARGE-MIR-NEXT: {{  $}}
93  ; 32LARGE-MIR-NEXT: bb.3.sw.bb1:
94  ; 32LARGE-MIR-NEXT:   successors: %bb.6(0x80000000)
95  ; 32LARGE-MIR-NEXT: {{  $}}
96  ; 32LARGE-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
97  ; 32LARGE-MIR-NEXT:   B %bb.6
98  ; 32LARGE-MIR-NEXT: {{  $}}
99  ; 32LARGE-MIR-NEXT: bb.4.sw.bb2:
100  ; 32LARGE-MIR-NEXT:   successors: %bb.6(0x80000000)
101  ; 32LARGE-MIR-NEXT: {{  $}}
102  ; 32LARGE-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
103  ; 32LARGE-MIR-NEXT:   B %bb.6
104  ; 32LARGE-MIR-NEXT: {{  $}}
105  ; 32LARGE-MIR-NEXT: bb.5.sw.bb3:
106  ; 32LARGE-MIR-NEXT:   successors: %bb.6(0x80000000)
107  ; 32LARGE-MIR-NEXT: {{  $}}
108  ; 32LARGE-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
109  ; 32LARGE-MIR-NEXT: {{  $}}
110  ; 32LARGE-MIR-NEXT: bb.6.sw.epilog:
111  ; 32LARGE-MIR-NEXT:   $r3 = LI 0
112  ; 32LARGE-MIR-NEXT:   BLR implicit $lr, implicit $rm, implicit $r3
113  ;
114  ; 64SMALL-MIR-LABEL: name: jump_table
115  ; 64SMALL-MIR: bb.0.entry:
116  ; 64SMALL-MIR-NEXT:   successors: %bb.6(0x19999998), %bb.1(0x66666668)
117  ; 64SMALL-MIR-NEXT:   liveins: $x3
118  ; 64SMALL-MIR-NEXT: {{  $}}
119  ; 64SMALL-MIR-NEXT:   renamable $r3 = ADDI renamable $r3, -1, implicit killed $x3, implicit-def $x3
120  ; 64SMALL-MIR-NEXT:   renamable $cr0 = CMPLWI renamable $r3, 3
121  ; 64SMALL-MIR-NEXT:   BCC 44, killed renamable $cr0, %bb.6
122  ; 64SMALL-MIR-NEXT: {{  $}}
123  ; 64SMALL-MIR-NEXT: bb.1.entry:
124  ; 64SMALL-MIR-NEXT:   successors: %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000), %bb.5(0x20000000)
125  ; 64SMALL-MIR-NEXT:   liveins: $x3
126  ; 64SMALL-MIR-NEXT: {{  $}}
127  ; 64SMALL-MIR-NEXT:   renamable $x3 = RLDIC killed renamable $x3, 2, 30
128  ; 64SMALL-MIR-NEXT:   renamable $x4 = LDtocJTI %jump-table.0, $x2 :: (load (s64) from got)
129  ; 64SMALL-MIR-NEXT:   renamable $x3 = LWAX killed renamable $x3, renamable $x4 :: (load (s32) from jump-table)
130  ; 64SMALL-MIR-NEXT:   renamable $x3 = ADD8 killed renamable $x3, killed renamable $x4
131  ; 64SMALL-MIR-NEXT:   MTCTR8 killed renamable $x3, implicit-def $ctr8
132  ; 64SMALL-MIR-NEXT:   BCTR8 implicit $ctr8
133  ; 64SMALL-MIR-NEXT: {{  $}}
134  ; 64SMALL-MIR-NEXT: bb.2.sw.bb:
135  ; 64SMALL-MIR-NEXT:   successors: %bb.6(0x80000000)
136  ; 64SMALL-MIR-NEXT: {{  $}}
137  ; 64SMALL-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
138  ; 64SMALL-MIR-NEXT:   B %bb.6
139  ; 64SMALL-MIR-NEXT: {{  $}}
140  ; 64SMALL-MIR-NEXT: bb.3.sw.bb1:
141  ; 64SMALL-MIR-NEXT:   successors: %bb.6(0x80000000)
142  ; 64SMALL-MIR-NEXT: {{  $}}
143  ; 64SMALL-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
144  ; 64SMALL-MIR-NEXT:   B %bb.6
145  ; 64SMALL-MIR-NEXT: {{  $}}
146  ; 64SMALL-MIR-NEXT: bb.4.sw.bb2:
147  ; 64SMALL-MIR-NEXT:   successors: %bb.6(0x80000000)
148  ; 64SMALL-MIR-NEXT: {{  $}}
149  ; 64SMALL-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
150  ; 64SMALL-MIR-NEXT:   B %bb.6
151  ; 64SMALL-MIR-NEXT: {{  $}}
152  ; 64SMALL-MIR-NEXT: bb.5.sw.bb3:
153  ; 64SMALL-MIR-NEXT:   successors: %bb.6(0x80000000)
154  ; 64SMALL-MIR-NEXT: {{  $}}
155  ; 64SMALL-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
156  ; 64SMALL-MIR-NEXT: {{  $}}
157  ; 64SMALL-MIR-NEXT: bb.6.sw.epilog:
158  ; 64SMALL-MIR-NEXT:   $x3 = LI8 0
159  ; 64SMALL-MIR-NEXT:   BLR8 implicit $lr8, implicit $rm, implicit $x3
160  ;
161  ; 64LARGE-MIR-LABEL: name: jump_table
162  ; 64LARGE-MIR: bb.0.entry:
163  ; 64LARGE-MIR-NEXT:   successors: %bb.6(0x19999998), %bb.1(0x66666668)
164  ; 64LARGE-MIR-NEXT:   liveins: $x3
165  ; 64LARGE-MIR-NEXT: {{  $}}
166  ; 64LARGE-MIR-NEXT:   renamable $r3 = ADDI renamable $r3, -1, implicit killed $x3, implicit-def $x3
167  ; 64LARGE-MIR-NEXT:   renamable $cr0 = CMPLWI renamable $r3, 3
168  ; 64LARGE-MIR-NEXT:   BCC 44, killed renamable $cr0, %bb.6
169  ; 64LARGE-MIR-NEXT: {{  $}}
170  ; 64LARGE-MIR-NEXT: bb.1.entry:
171  ; 64LARGE-MIR-NEXT:   successors: %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000), %bb.5(0x20000000)
172  ; 64LARGE-MIR-NEXT:   liveins: $x3
173  ; 64LARGE-MIR-NEXT: {{  $}}
174  ; 64LARGE-MIR-NEXT:   renamable $x3 = RLDIC killed renamable $x3, 2, 30
175  ; 64LARGE-MIR-NEXT:   renamable $x4 = ADDIStocHA8 $x2, %jump-table.0
176  ; 64LARGE-MIR-NEXT:   renamable $x4 = LDtocL %jump-table.0, killed renamable $x4, implicit $x2 :: (load (s64) from got)
177  ; 64LARGE-MIR-NEXT:   renamable $x3 = LWAX killed renamable $x3, renamable $x4 :: (load (s32) from jump-table)
178  ; 64LARGE-MIR-NEXT:   renamable $x3 = ADD8 killed renamable $x3, killed renamable $x4
179  ; 64LARGE-MIR-NEXT:   MTCTR8 killed renamable $x3, implicit-def $ctr8
180  ; 64LARGE-MIR-NEXT:   BCTR8 implicit $ctr8
181  ; 64LARGE-MIR-NEXT: {{  $}}
182  ; 64LARGE-MIR-NEXT: bb.2.sw.bb:
183  ; 64LARGE-MIR-NEXT:   successors: %bb.6(0x80000000)
184  ; 64LARGE-MIR-NEXT: {{  $}}
185  ; 64LARGE-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
186  ; 64LARGE-MIR-NEXT:   B %bb.6
187  ; 64LARGE-MIR-NEXT: {{  $}}
188  ; 64LARGE-MIR-NEXT: bb.3.sw.bb1:
189  ; 64LARGE-MIR-NEXT:   successors: %bb.6(0x80000000)
190  ; 64LARGE-MIR-NEXT: {{  $}}
191  ; 64LARGE-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
192  ; 64LARGE-MIR-NEXT:   B %bb.6
193  ; 64LARGE-MIR-NEXT: {{  $}}
194  ; 64LARGE-MIR-NEXT: bb.4.sw.bb2:
195  ; 64LARGE-MIR-NEXT:   successors: %bb.6(0x80000000)
196  ; 64LARGE-MIR-NEXT: {{  $}}
197  ; 64LARGE-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
198  ; 64LARGE-MIR-NEXT:   B %bb.6
199  ; 64LARGE-MIR-NEXT: {{  $}}
200  ; 64LARGE-MIR-NEXT: bb.5.sw.bb3:
201  ; 64LARGE-MIR-NEXT:   successors: %bb.6(0x80000000)
202  ; 64LARGE-MIR-NEXT: {{  $}}
203  ; 64LARGE-MIR-NEXT:   INLINEASM &"", 1 /* sideeffect attdialect */
204  ; 64LARGE-MIR-NEXT: {{  $}}
205  ; 64LARGE-MIR-NEXT: bb.6.sw.epilog:
206  ; 64LARGE-MIR-NEXT:   $x3 = LI8 0
207  ; 64LARGE-MIR-NEXT:   BLR8 implicit $lr8, implicit $rm, implicit $x3
208entry:
209  switch i32 %a, label %sw.epilog [
210    i32 1, label %sw.bb
211    i32 2, label %sw.bb1
212    i32 3, label %sw.bb2
213    i32 4, label %sw.bb3
214  ]
215
216sw.bb:
217  tail call void asm sideeffect "", ""()
218  br label %sw.epilog
219
220sw.bb1:
221  tail call void asm sideeffect "", ""()
222  br label %sw.epilog
223
224sw.bb2:
225  tail call void asm sideeffect "", ""()
226  br label %sw.epilog
227
228sw.bb3:
229  tail call void asm sideeffect "", ""()
230  br label %sw.epilog
231
232sw.epilog:
233  ret i32 0
234}
235