[ARM] Cortex-M4 schedule additions
[llvm-complete.git] / test / CodeGen / ARM / splitkit.ll
blob870c6952311c31d71294b8404f2fb465e323f708
1 ; RUN: llc -o - %s | FileCheck %s
2 ; Make sure RegAllocGreedy/SplitKit do not produce invalid liveness information
3 ; and crash when splitting a liverange twice and rematerializing each time.
4 ; (Sorry for the testcase; this was ran through bugpoint and then  manually
5 ;  reduced for several hours but is still big...)
6 target triple = "thumbv7-apple-ios"
8 %struct.ham = type { %struct.wombat.0 }
9 %struct.wombat.0 = type { %struct.barney }
10 %struct.barney = type { %struct.snork.1 }
11 %struct.snork.1 = type { %struct.wobble.2 }
12 %struct.wobble.2 = type { %struct.blam }
13 %struct.blam = type { i32, i32, i8* }
14 %struct.ham.3 = type { %struct.pluto }
15 %struct.pluto = type { %struct.zot*, %struct.snork.5, %struct.wibble }
16 %struct.zot = type { %struct.blam.4* }
17 %struct.blam.4 = type <{ %struct.zot, %struct.blam.4*, %struct.zot*, i8, [3 x i8] }>
18 %struct.snork.5 = type { %struct.quux }
19 %struct.quux = type { %struct.zot }
20 %struct.wibble = type { %struct.widget }
21 %struct.widget = type { i32 }
22 %struct.bar = type { %struct.spam }
23 %struct.spam = type { %struct.zot*, %struct.wobble, %struct.zot.7 }
24 %struct.wobble = type { %struct.wibble.6 }
25 %struct.wibble.6 = type { %struct.zot }
26 %struct.zot.7 = type { %struct.ham.8 }
27 %struct.ham.8 = type { i32 }
28 %struct.hoge = type { %struct.ham, %struct.foo }
29 %struct.foo = type { float, float }
30 %struct.wombat = type { %struct.ham, float }
31 %struct.snork = type { %struct.ham.9, [11 x i8] }
32 %struct.ham.9 = type { i8 }
34 @global = external global i8
35 @global.1 = private constant [20 x i8] c"aaaaaaaaaaaaaaaaaa0\00"
36 @global.2 = external constant [27 x i8]
37 @global.3 = external global %struct.ham
38 @global.4 = external constant [47 x i8]
39 @global.5 = external constant [61 x i8]
40 @global.6 = external constant [40 x i8]
41 @global.7 = external constant [24 x i8]
42 @global.8 = external constant [20 x i8]
43 @global.9 = external global %struct.ham
44 @global.10 = external global %struct.ham
45 @global.11 = external global %struct.ham
46 @global.12 = external global %struct.ham
47 @global.13 = external global %struct.ham
48 @global.14 = external global %struct.ham
49 @global.15 = external global %struct.ham
50 @global.16 = external global %struct.ham
51 @global.17 = external global %struct.ham
52 @global.18 = external constant [35 x i8]
53 @global.19 = external global %struct.ham
54 @global.20 = external constant [53 x i8]
55 @global.21 = external global %struct.ham
56 @global.22 = external global %struct.ham
57 @global.23 = external global %struct.ham
58 @global.24 = external constant [32 x i8]
59 @global.25 = external global %struct.ham
60 @global.26 = external constant [47 x i8]
61 @global.27 = external global %struct.ham
62 @global.28 = external constant [45 x i8]
63 @global.29 = external global %struct.ham
64 @global.30 = external global %struct.ham
65 @global.31 = external constant [24 x i8]
66 @global.32 = external global %struct.ham
67 @global.33 = external global %struct.ham
68 @global.34 = external global %struct.ham
69 @global.35 = external global %struct.ham
70 @global.36 = external constant [27 x i8]
71 @global.37 = external global %struct.ham
72 @global.38 = external constant [10 x i8]
73 @global.39 = external global %struct.ham
74 @global.40 = external global %struct.ham
75 @global.41 = external global %struct.ham
76 @global.42 = external global %struct.ham
77 @global.43 = external global %struct.ham
78 @global.44 = external constant [41 x i8]
79 @global.45 = external global %struct.ham
80 @global.46 = external global %struct.ham
81 @global.47 = external global %struct.ham
82 @global.48 = external global %struct.ham
83 @global.49 = external constant [52 x i8]
84 @global.50 = external constant [47 x i8]
85 @global.51 = external global %struct.ham
86 @global.52 = external global %struct.ham
87 @global.53 = external global %struct.ham
88 @global.54 = external global %struct.ham
89 @global.55 = external global %struct.ham.3
90 @global.56 = external global %struct.bar
91 @global.57 = external global i8
93 declare %struct.ham* @bar(%struct.ham* returned)
95 declare i32 @__cxa_atexit(void (i8*)*, i8*, i8*)
97 declare %struct.ham* @wobble(%struct.ham* returned, %struct.ham* ) 
99 declare i32 @quux(...)
101 declare i8* @_Znwm(i32)
103 declare i32 @wobble.58(%struct.pluto*, [1 x i32], %struct.ham* , %struct.hoge* )
105 declare i32 @widget(%struct.spam*, [1 x i32], %struct.ham* , %struct.wombat* )
107 ; Just check we didn't crash and did output something...
108 ; CHECK-LABEL: func:
109 ; CHECK: trap
110 define internal void @func() section "__TEXT,__StaticInit,regular,pure_instructions" personality i32 (...)* @quux {
111   %tmp = tail call i32 @__cxa_atexit(void (i8*)* bitcast (%struct.ham* (%struct.ham*)* @bar to void (i8*)*), i8* bitcast (%struct.ham* @global.3 to i8*), i8* @global) #0
112   %tmp2 = invoke %struct.ham* @wobble(%struct.ham* undef, %struct.ham*  @global.9)
113           to label %bb14 unwind label %bbunwind
115 bb14:
116   %tmp15 = getelementptr  i8, i8* undef, i32 12
117   store i8 0, i8* %tmp15
118   %tmp16 = icmp eq i8 undef, 0
119   br i1 %tmp16, label %bb28, label %bb18
121 bb18:
122   br i1 undef, label %bb21, label %bb29
124 bb21:
125   %tmp22 = call i8* @_Znwm(i32 16)
126   store i32 17, i32* getelementptr  (%struct.ham, %struct.ham* @global.10, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
127   %tmp23 = call i8* @_Znwm(i32 32)
128   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 undef, i8* align 1 getelementptr  ([27 x i8], [27 x i8]* @global.2, i32 0, i32 0), i32 26, i1 false)
129   store i32 33, i32* getelementptr  (%struct.ham, %struct.ham* @global.11, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
130   store i32 23, i32* getelementptr  (%struct.ham, %struct.ham* @global.11, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1)
131   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 undef, i8* align 1 getelementptr  ([24 x i8], [24 x i8]* @global.7, i32 0, i32 0), i32 23, i1 false)
132   %tmp24 = call i32 @__cxa_atexit(void (i8*)* bitcast (%struct.ham* (%struct.ham*)* @bar to void (i8*)*), i8* bitcast (%struct.ham* @global.11 to i8*), i8* @global) #0
133   store i32 49, i32* getelementptr  (%struct.ham, %struct.ham* @global.12, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
134   store i32 37, i32* getelementptr  (%struct.ham, %struct.ham* @global.13, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1)
135   call void @llvm.memset.p0i8.i32(i8* align 4 bitcast (%struct.ham* @global.14 to i8*), i8 0, i32 12, i1 false)
136   %tmp25 = call i8* @_Znwm(i32 48)
137   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %tmp25, i8* align 1 getelementptr  ([40 x i8], [40 x i8]* @global.6, i32 0, i32 0), i32 39, i1 false)
138   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 undef, i8* align 1 getelementptr  ([47 x i8], [47 x i8]* @global.4, i32 0, i32 0), i32 46, i1 false)
139   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 undef, i8* align 1 getelementptr  ([61 x i8], [61 x i8]* @global.5, i32 0, i32 0), i32 60, i1 false)
140   %tmp26 = call i8* @_Znwm(i32 48)
141   store i32 65, i32* getelementptr  (%struct.ham, %struct.ham* @global.15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
142   %tmp27 = icmp eq i8 undef, 0
143   br i1 %tmp27, label %bb30, label %bb33
145 bb28:
146   call void @llvm.trap()
147   unreachable
149 bb29:
150   call void @llvm.trap()
151   unreachable
153 bb30:
154   %tmp31 = icmp eq i32 undef, 37
155   br i1 %tmp31, label %bb32, label %bb30
157 bb32:
158   store i8 1, i8* @global.57
159   br label %bb33
161 bb33:
162   %tmp34 = call i8* @_Znwm(i32 32)
163   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 undef, i8* align 1 getelementptr  ([20 x i8], [20 x i8]* @global.1, i32 0, i32 0), i32 19, i1 false)
164   store i32 17, i32* getelementptr  (%struct.ham, %struct.ham* @global.16, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
165   store i32 65, i32* getelementptr  (%struct.ham, %struct.ham* @global.17, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
166   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 undef, i8* align 1 getelementptr  ([35 x i8], [35 x i8]* @global.18, i32 0, i32 0), i32 34, i1 false)
167   store i32 65, i32* getelementptr  (%struct.ham, %struct.ham* @global.19, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
168   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 undef, i8* align 1 getelementptr  ([53 x i8], [53 x i8]* @global.20, i32 0, i32 0), i32 52, i1 false)
169   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 undef, i8* align 1 getelementptr  ([20 x i8], [20 x i8]* @global.8, i32 0, i32 0), i32 19, i1 false)
170   store i32 37, i32* getelementptr  (%struct.ham, %struct.ham* @global.21, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1)
171   %tmp35 = call i8* @_Znwm(i32 32)
172   store i8 16, i8* bitcast (%struct.ham* @global.22 to i8*)
173   %tmp36 = call i8* @_Znwm(i32 32)
174   store i32 31, i32* getelementptr  (%struct.ham, %struct.ham* @global.23, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1)
175   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %tmp36, i8* align 1 getelementptr  ([32 x i8], [32 x i8]* @global.24, i32 0, i32 0), i32 31, i1 false)
176   %tmp37 = getelementptr  i8, i8* %tmp36, i32 31
177   store i8 0, i8* %tmp37
178   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 undef, i8* align 1 getelementptr  ([47 x i8], [47 x i8]* @global.26, i32 0, i32 0), i32 46, i1 false)
179   %tmp38 = call i32 @__cxa_atexit(void (i8*)* bitcast (%struct.ham* (%struct.ham*)* @bar to void (i8*)*), i8* bitcast (%struct.ham* @global.25 to i8*), i8* @global) #0
180   %tmp39 = call i8* @_Znwm(i32 48)
181   store i32 44, i32* getelementptr  (%struct.ham, %struct.ham* @global.27, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1)
182   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %tmp39, i8* align 1 getelementptr  ([45 x i8], [45 x i8]* @global.28, i32 0, i32 0), i32 44, i1 false)
183   %tmp40 = getelementptr  i8, i8* %tmp39, i32 44
184   store i8 0, i8* %tmp40
185   call void @llvm.memset.p0i8.i32(i8* align 4 bitcast (%struct.ham* @global.29 to i8*), i8 0, i32 12, i1 false)
186   %tmp41 = call i8* @_Znwm(i32 32)
187   store i32 23, i32* getelementptr  (%struct.ham, %struct.ham* @global.30, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1)
188   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %tmp41, i8* align 1 getelementptr  ([24 x i8], [24 x i8]* @global.31, i32 0, i32 0), i32 23, i1 false)
189   %tmp42 = getelementptr  i8, i8* %tmp41, i32 23
190   store i8 0, i8* %tmp42
191   call void @llvm.memset.p0i8.i32(i8* align 4 bitcast (%struct.ham* @global.32 to i8*), i8 0, i32 12, i1 false)
192   store i8 16, i8* bitcast (%struct.ham* @global.32 to i8*)
193   %tmp43 = call i32 @__cxa_atexit(void (i8*)* bitcast (%struct.ham* (%struct.ham*)* @bar to void (i8*)*), i8* bitcast (%struct.ham* @global.33 to i8*), i8* @global) #0
194   %tmp44 = call i8* @_Znwm(i32 16)
195   call void @llvm.memset.p0i8.i32(i8* align 4 bitcast (%struct.ham* @global.34 to i8*), i8 0, i32 12, i1 false)
196   call void @llvm.memset.p0i8.i32(i8* align 4 bitcast (%struct.ham* @global.9 to i8*), i8 0, i32 12, i1 false)
197   %tmp45 = call i8* @_Znwm(i32 32)
198   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %tmp45, i8* align 1 getelementptr  ([27 x i8], [27 x i8]* @global.36, i32 0, i32 0), i32 26, i1 false)
199   call void @llvm.memset.p0i8.i32(i8* align 4 bitcast (%struct.ham* @global.37 to i8*), i8 0, i32 12, i1 false)
200   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 getelementptr (%struct.snork, %struct.snork* bitcast (%struct.ham* @global.37 to %struct.snork*), i32 0, i32 1, i32 0), i8* align 1 getelementptr  ([10 x i8], [10 x i8]* @global.38, i32 0, i32 0), i32 9, i1 false)
201   store i32 17, i32* getelementptr  (%struct.ham, %struct.ham* @global.39, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
202   %tmp46 = call i32 @__cxa_atexit(void (i8*)* bitcast (%struct.ham* (%struct.ham*)* @bar to void (i8*)*), i8* bitcast (%struct.ham* @global.40 to i8*), i8* @global) #0
203   %tmp47 = call i8* @_Znwm(i32 32)
204   %tmp48 = getelementptr  i8, i8* %tmp47, i32 21
205   store i8 0, i8* %tmp48
206   store i32 33, i32* getelementptr  (%struct.ham, %struct.ham* @global.41, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
207   store i32 15, i32* getelementptr  (%struct.ham, %struct.ham* @global.42, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1)
208   %tmp49 = call i32 @__cxa_atexit(void (i8*)* bitcast (%struct.ham* (%struct.ham*)* @bar to void (i8*)*), i8* bitcast (%struct.ham* @global.43 to i8*), i8* @global) #0
209   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 undef, i8* align 1 getelementptr  ([41 x i8], [41 x i8]* @global.44, i32 0, i32 0), i32 40, i1 false)
210   %tmp50 = call i32 @__cxa_atexit(void (i8*)* bitcast (%struct.ham* (%struct.ham*)* @bar to void (i8*)*), i8* bitcast (%struct.ham* @global.45 to i8*), i8* @global) #0
211   %tmp51 = call i32 @__cxa_atexit(void (i8*)* bitcast (%struct.ham* (%struct.ham*)* @bar to void (i8*)*), i8* bitcast (%struct.ham* @global.46 to i8*), i8* @global) #0
212   %tmp52 = call i8* @_Znwm(i32 32)
213   store i8* %tmp52, i8** getelementptr  (%struct.ham, %struct.ham* @global.47, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 2)
214   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 undef, i8* align 1 getelementptr  ([52 x i8], [52 x i8]* @global.49, i32 0, i32 0), i32 51, i1 false)
215   %tmp53 = call i32 @__cxa_atexit(void (i8*)* bitcast (%struct.ham* (%struct.ham*)* @bar to void (i8*)*), i8* bitcast (%struct.ham* @global.48 to i8*), i8* @global) #0
216   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 undef, i8* align 1 getelementptr  ([47 x i8], [47 x i8]* @global.50, i32 0, i32 0), i32 46, i1 false)
217   store i32 33, i32* getelementptr  (%struct.ham, %struct.ham* @global.51, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
218   store i32 37, i32* getelementptr  (%struct.ham, %struct.ham* @global.52, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1)
219   %tmp54 = invoke %struct.ham* @wobble(%struct.ham* undef, %struct.ham*  @global.54)
220           to label %bb58 unwind label %bbunwind
222 bb58:
223   %tmp59 = invoke i32 @wobble.58(%struct.pluto* getelementptr  (%struct.ham.3, %struct.ham.3* @global.55, i32 0, i32 0), [1 x i32] [i32 ptrtoint (%struct.zot* getelementptr  (%struct.ham.3, %struct.ham.3* @global.55, i32 0, i32 0, i32 1, i32 0, i32 0) to i32)], %struct.ham*  undef, %struct.hoge*  undef)
224           to label %bb71 unwind label %bbunwind
226 bb71:
227   %tmp72 = invoke i32 @widget(%struct.spam* getelementptr  (%struct.bar, %struct.bar* @global.56, i32 0, i32 0), [1 x i32] [i32 ptrtoint (%struct.zot* getelementptr  (%struct.bar, %struct.bar* @global.56, i32 0, i32 0, i32 1, i32 0, i32 0) to i32)], %struct.ham*  undef, %struct.wombat*  undef)
228           to label %bb73 unwind label %bbunwind
230 bb73:
231   ret void
233 bbunwind:
234   %tmp75 = landingpad { i8*, i32 }
235           cleanup
236   resume { i8*, i32 } undef
239 declare void @llvm.trap()
241 declare void @llvm.memcpy.p0i8.p0i8.i32(i8* , i8* , i32, i1)
243 declare void @llvm.memset.p0i8.i32(i8* , i8, i32, i1)
245 attributes #0 = { nounwind }