[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / ARM / v6-jumptable-clobber.mir
bloba572ce5e1a07654e1e67ddc8807337664a2400b6
1 # RUN: llc -run-pass=arm-cp-islands -o - %s | FileCheck %s
3 # Test created by tweaking the register allocation after stopping the IR below
4 # just before constant islands. We were forwarding the table index to the end of
5 # the block, even though the LEA clobbered it.
7 # CHECK-LABEL: name: foo
8 # CHECK:     tBR_JT
9   # This order is important. If the jump-table comes first then the
10   # transformation is valid because the LEA can be removed, see second test.
11 # CHECK:     CONSTPOOL_ENTRY
12 # CHECK:     JUMPTABLE_ADDRS
14 # CHECK-LABEL: name: bar
15 # CHECK: tTBB_JT $pc, killed $r1
17 --- |
18   ; ModuleID = 'simple.ll'
19   source_filename = "simple.ll"
20   target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
21   target triple = "thumbv6m-none--eabi"
22   
23   define void @foo(i8 %in, i32* %addr) {
24     store i32 12345678, i32* %addr
25     %1 = call i32 @llvm.arm.space(i32 980, i32 undef)
26     %2 = zext i8 %in to i32
27     switch i32 %2, label %default [
28       i32 0, label %d1
29       i32 1, label %d2
30       i32 3, label %d3
31       i32 4, label %d4
32       i32 5, label %d5
33       i32 6, label %d6
34       i32 7, label %d7
35       i32 2, label %d8
36       i32 8, label %d9
37       i32 9, label %d10
38       i32 19, label %d11
39       i32 20, label %d12
40       i32 21, label %d13
41       i32 22, label %d14
42       i32 24, label %d15
43       i32 25, label %d16
44       i32 26, label %d17
45     ]
46   
47   default:                                          ; preds = %0
48     unreachable
49   
50   d1:                                               ; preds = %0
51     unreachable
52   
53   d2:                                               ; preds = %0
54     unreachable
55   
56   d3:                                               ; preds = %0
57     unreachable
58   
59   d4:                                               ; preds = %0
60     unreachable
61   
62   d5:                                               ; preds = %0
63     unreachable
64   
65   d6:                                               ; preds = %0
66     unreachable
67   
68   d7:                                               ; preds = %0
69     unreachable
70   
71   d8:                                               ; preds = %0
72     unreachable
73   
74   d9:                                               ; preds = %0
75     unreachable
76   
77   d10:                                              ; preds = %0
78     unreachable
79   
80   d11:                                              ; preds = %0
81     unreachable
82   
83   d12:                                              ; preds = %0
84     unreachable
85   
86   d13:                                              ; preds = %0
87     unreachable
88   
89   d14:                                              ; preds = %0
90     unreachable
91   
92   d15:                                              ; preds = %0
93     unreachable
94   
95   d16:                                              ; preds = %0
96     unreachable
97   
98   d17:                                              ; preds = %0
99     unreachable
100   }
102   define void @bar(i8 %in, i32* %addr) {
103       store i32 12345678, i32* %addr
104     %1 = zext i8 %in to i32
105     switch i32 %1, label %default [
106       i32 0, label %d1
107       i32 1, label %d2
108       i32 3, label %d3
109       i32 4, label %d4
110       i32 5, label %d5
111       i32 6, label %d6
112       i32 7, label %d7
113       i32 2, label %d8
114       i32 8, label %d9
115       i32 9, label %d10
116       i32 19, label %d11
117       i32 20, label %d12
118       i32 21, label %d13
119       i32 22, label %d14
120       i32 24, label %d15
121       i32 25, label %d16
122       i32 26, label %d17
123     ]
124   
125   default:                                          ; preds = %0
126     unreachable
127   
128   d1:                                               ; preds = %0
129     unreachable
130   
131   d2:                                               ; preds = %0
132     unreachable
133   
134   d3:                                               ; preds = %0
135     unreachable
136   
137   d4:                                               ; preds = %0
138     unreachable
139   
140   d5:                                               ; preds = %0
141     unreachable
142   
143   d6:                                               ; preds = %0
144     unreachable
145   
146   d7:                                               ; preds = %0
147     unreachable
148   
149   d8:                                               ; preds = %0
150     unreachable
151   
152   d9:                                               ; preds = %0
153     unreachable
154   
155   d10:                                              ; preds = %0
156     unreachable
157   
158   d11:                                              ; preds = %0
159     unreachable
160   
161   d12:                                              ; preds = %0
162     unreachable
163   
164   d13:                                              ; preds = %0
165     unreachable
166   
167   d14:                                              ; preds = %0
168     unreachable
169   
170   d15:                                              ; preds = %0
171     unreachable
172   
173   d16:                                              ; preds = %0
174     unreachable
175   
176   d17:                                              ; preds = %0
177     unreachable
178   }
179   
180   ; Function Attrs: nounwind
181   declare i32 @llvm.arm.space(i32, i32) #0
182   
183   ; Function Attrs: nounwind
184   declare void @llvm.stackprotector(i8*, i8**) #0
185   
186   attributes #0 = { nounwind }
190 name:            foo
191 alignment:       2
192 exposesReturnsTwice: false
193 legalized:       false
194 regBankSelected: false
195 selected:        false
196 tracksRegLiveness: true
197 liveins:         
198   - { reg: '$r0' }
199   - { reg: '$r1' }
200 frameInfo:       
201   isFrameAddressTaken: false
202   isReturnAddressTaken: false
203   hasStackMap:     false
204   hasPatchPoint:   false
205   stackSize:       0
206   offsetAdjustment: 0
207   maxAlignment:    0
208   adjustsStack:    false
209   hasCalls:        false
210   maxCallFrameSize: 0
211   hasOpaqueSPAdjustment: false
212   hasVAStart:      false
213   hasMustTailInVarArgFunc: false
214 constants:       
215   - id:              0
216     value:           i32 12345678
217     alignment:       4
218 jumpTable:       
219   kind:            inline
220   entries:         
221     - id:              0
222       blocks:          [ '%bb.3.d2', '%bb.9.d8', '%bb.4.d3', '%bb.5.d4', 
223                          '%bb.6.d5', '%bb.7.d6', '%bb.8.d7', '%bb.10.d9', 
224                          '%bb.11.d10', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', 
225                          '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', 
226                          '%bb.2.d1', '%bb.2.d1', '%bb.12.d11', '%bb.13.d12', 
227                          '%bb.14.d13', '%bb.15.d14', '%bb.2.d1', '%bb.16.d15', 
228                          '%bb.17.d16', '%bb.18.d17' ]
229 body:             |
230   bb.0 (%ir-block.0):
231     successors: %bb.2.d1(0x03c3c3c4), %bb.1(0x7c3c3c3c)
232     liveins: $r0, $r1
233   
234     $r2 = tLDRpci %const.0, 14, $noreg
235     tSTRi killed $r2, killed $r1, 0, 14, $noreg :: (store 4 into %ir.addr)
236     dead $r1 = SPACE 980, undef $r0
237     $r0 = tUXTB killed $r0, 14, $noreg
238     $r1, dead $cpsr = tSUBi3 killed $r0, 1, 14, $noreg
239     tCMPi8 $r1, 25, 14, $noreg, implicit-def $cpsr
240     tBcc %bb.2.d1, 8, killed $cpsr
241   
242   bb.1 (%ir-block.0):
243     successors: %bb.3.d2(0x07c549d2), %bb.9.d8(0x07c549d2), %bb.4.d3(0x07c549d2), %bb.5.d4(0x07c549d2), %bb.6.d5(0x07c549d2), %bb.7.d6(0x07c549d2), %bb.8.d7(0x07c549d2), %bb.10.d9(0x07c549d2), %bb.11.d10(0x07c549d2), %bb.2.d1(0x03ab62db), %bb.12.d11(0x07c549d2), %bb.13.d12(0x07c549d2), %bb.14.d13(0x07c549d2), %bb.15.d14(0x07c549d2), %bb.16.d15(0x07c549d2), %bb.17.d16(0x07c549d2), %bb.18.d17(0x07c549d2)
244     liveins: $r1
245   
246     $r0, dead $cpsr = tLSLri killed $r1, 2, 14, $noreg
247     $r1 = tLEApcrelJT %jump-table.0, 14, $noreg
248     $r0 = tLDRr killed $r1, killed $r0, 14, $noreg :: (load 4 from jump-table)
249     tBR_JTr killed $r0, %jump-table.0
250   
251   bb.3.d2:
252   
253   bb.9.d8:
254   
255   bb.4.d3:
256   
257   bb.5.d4:
258   
259   bb.6.d5:
260   
261   bb.7.d6:
262   
263   bb.8.d7:
264   
265   bb.10.d9:
266   
267   bb.11.d10:
268   
269   bb.2.d1:
270   
271   bb.12.d11:
272   
273   bb.13.d12:
274   
275   bb.14.d13:
276   
277   bb.15.d14:
278   
279   bb.16.d15:
280   
281   bb.17.d16:
282   
283   bb.18.d17:
288 name:            bar
289 alignment:       2
290 exposesReturnsTwice: false
291 legalized:       false
292 regBankSelected: false
293 selected:        false
294 tracksRegLiveness: true
295 liveins:         
296   - { reg: '$r0' }
297   - { reg: '$r1' }
298 frameInfo:       
299   isFrameAddressTaken: false
300   isReturnAddressTaken: false
301   hasStackMap:     false
302   hasPatchPoint:   false
303   stackSize:       0
304   offsetAdjustment: 0
305   maxAlignment:    0
306   adjustsStack:    false
307   hasCalls:        false
308   maxCallFrameSize: 0
309   hasOpaqueSPAdjustment: false
310   hasVAStart:      false
311   hasMustTailInVarArgFunc: false
312 constants:       
313   - id:              0
314     value:           i32 12345678
315     alignment:       4
316 jumpTable:       
317   kind:            inline
318   entries:         
319     - id:              0
320       blocks:          [ '%bb.3.d2', '%bb.9.d8', '%bb.4.d3', '%bb.5.d4', 
321                          '%bb.6.d5', '%bb.7.d6', '%bb.8.d7', '%bb.10.d9', 
322                          '%bb.11.d10', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', 
323                          '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', 
324                          '%bb.2.d1', '%bb.2.d1', '%bb.12.d11', '%bb.13.d12', 
325                          '%bb.14.d13', '%bb.15.d14', '%bb.2.d1', '%bb.16.d15', 
326                          '%bb.17.d16', '%bb.18.d17' ]
327 body:             |
328   bb.0 (%ir-block.0):
329     successors: %bb.2.d1(0x03c3c3c4), %bb.1(0x7c3c3c3c)
330     liveins: $r0, $r1
331   
332     $r2 = tLDRpci %const.0, 14, $noreg
333     tSTRi killed $r2, killed $r1, 0, 14, $noreg :: (store 4 into %ir.addr)
334     $r0 = tUXTB killed $r0, 14, $noreg
335     $r1, dead $cpsr = tSUBi3 killed $r0, 1, 14, $noreg
336     tCMPi8 $r1, 25, 14, $noreg, implicit-def $cpsr
337     tBcc %bb.2.d1, 8, killed $cpsr
338   
339   bb.1 (%ir-block.0):
340     successors: %bb.3.d2(0x07c549d2), %bb.9.d8(0x07c549d2), %bb.4.d3(0x07c549d2), %bb.5.d4(0x07c549d2), %bb.6.d5(0x07c549d2), %bb.7.d6(0x07c549d2), %bb.8.d7(0x07c549d2), %bb.10.d9(0x07c549d2), %bb.11.d10(0x07c549d2), %bb.2.d1(0x03ab62db), %bb.12.d11(0x07c549d2), %bb.13.d12(0x07c549d2), %bb.14.d13(0x07c549d2), %bb.15.d14(0x07c549d2), %bb.16.d15(0x07c549d2), %bb.17.d16(0x07c549d2), %bb.18.d17(0x07c549d2)
341     liveins: $r1
342   
343     $r0, dead $cpsr = tLSLri killed $r1, 2, 14, $noreg
344     $r1 = tLEApcrelJT %jump-table.0, 14, $noreg
345     $r0 = tLDRr killed $r1, killed $r0, 14, $noreg :: (load 4 from jump-table)
346     tBR_JTr killed $r0, %jump-table.0
347   
348   bb.3.d2:
349   
350   bb.9.d8:
351   
352   bb.4.d3:
353   
354   bb.5.d4:
355   
356   bb.6.d5:
357   
358   bb.7.d6:
359   
360   bb.8.d7:
361   
362   bb.10.d9:
363   
364   bb.11.d10:
365   
366   bb.2.d1:
367   
368   bb.12.d11:
369   
370   bb.13.d12:
371   
372   bb.14.d13:
373   
374   bb.15.d14:
375   
376   bb.16.d15:
377   
378   bb.17.d16:
379   
380   bb.18.d17: