Re-implement the main strength-reduction portion of LoopStrengthReduction.
[oota-llvm.git] / test / CodeGen / X86 / 2007-10-16-IllegalAsm.ll
1 ; RUN: llc < %s -mtriple=x86_64-linux-gnu | grep movb | not grep x
2 ; PR1734
3
4         %struct.CUMULATIVE_ARGS = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
5         %struct.eh_status = type opaque
6         %struct.emit_status = type { i32, i32, %struct.rtx_def*, %struct.rtx_def*, %struct.sequence_stack*, i32, %struct.location_t, i32, i8*, %struct.rtx_def** }
7         %struct.expr_status = type { i32, i32, i32, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def* }
8         %struct.function = type { %struct.eh_status*, %struct.expr_status*, %struct.emit_status*, %struct.varasm_status*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.function*, i32, i32, i32, i32, %struct.rtx_def*, %struct.CUMULATIVE_ARGS, %struct.rtx_def*, %struct.rtx_def*, %struct.initial_value_struct*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, %struct.rtx_def*, i8, i32, i64, %struct.tree_node*, %struct.tree_node*, %struct.rtx_def*, %struct.varray_head_tag*, %struct.temp_slot*, i32, %struct.var_refs_queue*, i32, i32, %struct.rtvec_def*, %struct.tree_node*, i32, i32, i32, %struct.machine_function*, i32, i32, i8, i8, %struct.language_function*, %struct.rtx_def*, i32, i32, i32, i32, %struct.location_t, %struct.varray_head_tag*, %struct.tree_node*, %struct.tree_node*, i8, i8, i8 }
9         %struct.initial_value_struct = type opaque
10         %struct.lang_decl = type opaque
11         %struct.lang_type = type opaque
12         %struct.language_function = type opaque
13         %struct.location_t = type { i8*, i32 }
14         %struct.machine_function = type { %struct.stack_local_entry*, i8*, %struct.rtx_def*, i32, i32, i32, i32, i32 }
15         %struct.rtunion = type { i8* }
16         %struct.rtvec_def = type { i32, [1 x %struct.rtx_def*] }
17         %struct.rtx_def = type { i16, i8, i8, %struct.u }
18         %struct.sequence_stack = type { %struct.rtx_def*, %struct.rtx_def*, %struct.sequence_stack* }
19         %struct.stack_local_entry = type opaque
20         %struct.temp_slot = type opaque
21         %struct.tree_common = type { %struct.tree_node*, %struct.tree_node*, %union.tree_ann_d*, i8, i8, i8, i8, i8 }
22         %struct.tree_decl = type { %struct.tree_common, %struct.location_t, i32, %struct.tree_node*, i8, i8, i8, i8, i8, i8, i8, i8, i32, %struct.tree_decl_u1, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.rtx_def*, i32, %struct.tree_decl_u2, %struct.tree_node*, %struct.tree_node*, i64, %struct.lang_decl* }
23         %struct.tree_decl_u1 = type { i64 }
24         %struct.tree_decl_u2 = type { %struct.function* }
25         %struct.tree_node = type { %struct.tree_decl }
26         %struct.tree_type = type { %struct.tree_common, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, i32, i16, i8, i8, i32, %struct.tree_node*, %struct.tree_node*, %struct.rtunion, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, %struct.tree_node*, i64, %struct.lang_type* }
27         %struct.u = type { [1 x %struct.rtunion] }
28         %struct.var_refs_queue = type { %struct.rtx_def*, i32, i32, %struct.var_refs_queue* }
29         %struct.varasm_status = type opaque
30         %struct.varray_data = type { [1 x i64] }
31         %struct.varray_head_tag = type { i64, i64, i32, i8*, %struct.varray_data }
32         %union.tree_ann_d = type opaque
33 @.str = external constant [28 x i8]             ; <[28 x i8]*> [#uses=1]
34 @tree_code_type = external constant [0 x i32]           ; <[0 x i32]*> [#uses=5]
35 @global_trees = external global [47 x %struct.tree_node*]               ; <[47 x %struct.tree_node*]*> [#uses=1]
36 @mode_size = external global [48 x i8]          ; <[48 x i8]*> [#uses=1]
37 @__FUNCTION__.22683 = external constant [12 x i8]               ; <[12 x i8]*> [#uses=1]
38
39 define void @layout_type(%struct.tree_node* %type) {
40 entry:
41         %tmp15 = icmp eq %struct.tree_node* %type, null         ; <i1> [#uses=1]
42         br i1 %tmp15, label %cond_true, label %cond_false
43
44 cond_true:              ; preds = %entry
45         tail call void @fancy_abort( i8* getelementptr ([28 x i8]* @.str, i32 0, i64 0), i32 1713, i8* getelementptr ([12 x i8]* @__FUNCTION__.22683, i32 0, i32 0) )
46         unreachable
47
48 cond_false:             ; preds = %entry
49         %tmp19 = load %struct.tree_node** getelementptr ([47 x %struct.tree_node*]* @global_trees, i32 0, i64 0), align 8               ; <%struct.tree_node*> [#uses=1]
50         %tmp21 = icmp eq %struct.tree_node* %tmp19, %type               ; <i1> [#uses=1]
51         br i1 %tmp21, label %UnifiedReturnBlock, label %cond_next25
52
53 cond_next25:            ; preds = %cond_false
54         %tmp30 = getelementptr %struct.tree_node* %type, i32 0, i32 0, i32 0, i32 3             ; <i8*> [#uses=1]
55         %tmp3031 = bitcast i8* %tmp30 to i32*           ; <i32*> [#uses=6]
56         %tmp32 = load i32* %tmp3031, align 8            ; <i32> [#uses=3]
57         %tmp3435 = trunc i32 %tmp32 to i8               ; <i8> [#uses=3]
58         %tmp34353637 = zext i8 %tmp3435 to i64          ; <i64> [#uses=1]
59         %tmp38 = getelementptr [0 x i32]* @tree_code_type, i32 0, i64 %tmp34353637              ; <i32*> [#uses=1]
60         %tmp39 = load i32* %tmp38, align 4              ; <i32> [#uses=1]
61         %tmp40 = icmp eq i32 %tmp39, 2          ; <i1> [#uses=4]
62         br i1 %tmp40, label %cond_next46, label %cond_true43
63
64 cond_true43:            ; preds = %cond_next25
65         tail call void @tree_class_check_failed( %struct.tree_node* %type, i32 2, i8* getelementptr ([28 x i8]* @.str, i32 0, i64 0), i32 1719, i8* getelementptr ([12 x i8]* @__FUNCTION__.22683, i32 0, i32 0) )
66         unreachable
67
68 cond_next46:            ; preds = %cond_next25
69         %tmp4950 = bitcast %struct.tree_node* %type to %struct.tree_type*               ; <%struct.tree_type*> [#uses=2]
70         %tmp51 = getelementptr %struct.tree_type* %tmp4950, i32 0, i32 2                ; <%struct.tree_node**> [#uses=2]
71         %tmp52 = load %struct.tree_node** %tmp51, align 8               ; <%struct.tree_node*> [#uses=1]
72         %tmp53 = icmp eq %struct.tree_node* %tmp52, null                ; <i1> [#uses=1]
73         br i1 %tmp53, label %cond_next57, label %UnifiedReturnBlock
74
75 cond_next57:            ; preds = %cond_next46
76         %tmp65 = and i32 %tmp32, 255            ; <i32> [#uses=1]
77         switch i32 %tmp65, label %UnifiedReturnBlock [
78                  i32 6, label %bb140
79                  i32 7, label %bb69
80                  i32 8, label %bb140
81                  i32 13, label %bb478
82                  i32 23, label %bb
83         ]
84
85 bb:             ; preds = %cond_next57
86         tail call void @fancy_abort( i8* getelementptr ([28 x i8]* @.str, i32 0, i64 0), i32 1727, i8* getelementptr ([12 x i8]* @__FUNCTION__.22683, i32 0, i32 0) )
87         unreachable
88
89 bb69:           ; preds = %cond_next57
90         br i1 %tmp40, label %cond_next91, label %cond_true88
91
92 cond_true88:            ; preds = %bb69
93         tail call void @tree_class_check_failed( %struct.tree_node* %type, i32 2, i8* getelementptr ([28 x i8]* @.str, i32 0, i64 0), i32 1730, i8* getelementptr ([12 x i8]* @__FUNCTION__.22683, i32 0, i32 0) )
94         unreachable
95
96 cond_next91:            ; preds = %bb69
97         %tmp96 = getelementptr %struct.tree_node* %type, i32 0, i32 0, i32 8            ; <i8*> [#uses=1]
98         %tmp9697 = bitcast i8* %tmp96 to i32*           ; <i32*> [#uses=2]
99         %tmp98 = load i32* %tmp9697, align 8            ; <i32> [#uses=2]
100         %tmp100101552 = and i32 %tmp98, 511             ; <i32> [#uses=1]
101         %tmp102 = icmp eq i32 %tmp100101552, 0          ; <i1> [#uses=1]
102         br i1 %tmp102, label %cond_true105, label %bb140
103
104 cond_true105:           ; preds = %cond_next91
105         br i1 %tmp40, label %cond_next127, label %cond_true124
106
107 cond_true124:           ; preds = %cond_true105
108         tail call void @tree_class_check_failed( %struct.tree_node* %type, i32 2, i8* getelementptr ([28 x i8]* @.str, i32 0, i64 0), i32 1731, i8* getelementptr ([12 x i8]* @__FUNCTION__.22683, i32 0, i32 0) )
109         unreachable
110
111 cond_next127:           ; preds = %cond_true105
112         %tmp136 = or i32 %tmp98, 1              ; <i32> [#uses=1]
113         %tmp137 = and i32 %tmp136, -511         ; <i32> [#uses=1]
114         store i32 %tmp137, i32* %tmp9697, align 8
115         br label %bb140
116
117 bb140:          ; preds = %cond_next127, %cond_next91, %cond_next57, %cond_next57
118         switch i8 %tmp3435, label %cond_true202 [
119                  i8 6, label %cond_next208
120                  i8 9, label %cond_next208
121                  i8 7, label %cond_next208
122                  i8 8, label %cond_next208
123                  i8 10, label %cond_next208
124         ]
125
126 cond_true202:           ; preds = %bb140
127         tail call void (%struct.tree_node*, i8*, i32, i8*, ...)* @tree_check_failed( %struct.tree_node* %type, i8* getelementptr ([28 x i8]* @.str, i32 0, i64 0), i32 1738, i8* getelementptr ([12 x i8]* @__FUNCTION__.22683, i32 0, i32 0), i32 9, i32 6, i32 7, i32 8, i32 10, i32 0 )
128         unreachable
129
130 cond_next208:           ; preds = %bb140, %bb140, %bb140, %bb140, %bb140
131         %tmp213 = getelementptr %struct.tree_type* %tmp4950, i32 0, i32 14              ; <%struct.tree_node**> [#uses=1]
132         %tmp214 = load %struct.tree_node** %tmp213, align 8             ; <%struct.tree_node*> [#uses=2]
133         %tmp217 = getelementptr %struct.tree_node* %tmp214, i32 0, i32 0, i32 0, i32 3          ; <i8*> [#uses=1]
134         %tmp217218 = bitcast i8* %tmp217 to i32*                ; <i32*> [#uses=1]
135         %tmp219 = load i32* %tmp217218, align 8         ; <i32> [#uses=1]
136         %tmp221222 = trunc i32 %tmp219 to i8            ; <i8> [#uses=1]
137         %tmp223 = icmp eq i8 %tmp221222, 24             ; <i1> [#uses=1]
138         br i1 %tmp223, label %cond_true226, label %cond_next340
139
140 cond_true226:           ; preds = %cond_next208
141         switch i8 %tmp3435, label %cond_true288 [
142                  i8 6, label %cond_next294
143                  i8 9, label %cond_next294
144                  i8 7, label %cond_next294
145                  i8 8, label %cond_next294
146                  i8 10, label %cond_next294
147         ]
148
149 cond_true288:           ; preds = %cond_true226
150         tail call void (%struct.tree_node*, i8*, i32, i8*, ...)* @tree_check_failed( %struct.tree_node* %type, i8* getelementptr ([28 x i8]* @.str, i32 0, i64 0), i32 1739, i8* getelementptr ([12 x i8]* @__FUNCTION__.22683, i32 0, i32 0), i32 9, i32 6, i32 7, i32 8, i32 10, i32 0 )
151         unreachable
152
153 cond_next294:           ; preds = %cond_true226, %cond_true226, %cond_true226, %cond_true226, %cond_true226
154         %tmp301 = tail call i32 @tree_int_cst_sgn( %struct.tree_node* %tmp214 )         ; <i32> [#uses=1]
155         %tmp302 = icmp sgt i32 %tmp301, -1              ; <i1> [#uses=1]
156         br i1 %tmp302, label %cond_true305, label %cond_next340
157
158 cond_true305:           ; preds = %cond_next294
159         %tmp313 = load i32* %tmp3031, align 8           ; <i32> [#uses=2]
160         %tmp315316 = trunc i32 %tmp313 to i8            ; <i8> [#uses=1]
161         %tmp315316317318 = zext i8 %tmp315316 to i64            ; <i64> [#uses=1]
162         %tmp319 = getelementptr [0 x i32]* @tree_code_type, i32 0, i64 %tmp315316317318         ; <i32*> [#uses=1]
163         %tmp320 = load i32* %tmp319, align 4            ; <i32> [#uses=1]
164         %tmp321 = icmp eq i32 %tmp320, 2                ; <i1> [#uses=1]
165         br i1 %tmp321, label %cond_next327, label %cond_true324
166
167 cond_true324:           ; preds = %cond_true305
168         tail call void @tree_class_check_failed( %struct.tree_node* %type, i32 2, i8* getelementptr ([28 x i8]* @.str, i32 0, i64 0), i32 1740, i8* getelementptr ([12 x i8]* @__FUNCTION__.22683, i32 0, i32 0) )
169         unreachable
170
171 cond_next327:           ; preds = %cond_true305
172         %tmp338 = or i32 %tmp313, 8192          ; <i32> [#uses=1]
173         store i32 %tmp338, i32* %tmp3031, align 8
174         br label %cond_next340
175
176 cond_next340:           ; preds = %cond_next327, %cond_next294, %cond_next208
177         %tmp348 = load i32* %tmp3031, align 8           ; <i32> [#uses=1]
178         %tmp350351 = trunc i32 %tmp348 to i8            ; <i8> [#uses=1]
179         %tmp350351352353 = zext i8 %tmp350351 to i64            ; <i64> [#uses=1]
180         %tmp354 = getelementptr [0 x i32]* @tree_code_type, i32 0, i64 %tmp350351352353         ; <i32*> [#uses=1]
181         %tmp355 = load i32* %tmp354, align 4            ; <i32> [#uses=1]
182         %tmp356 = icmp eq i32 %tmp355, 2                ; <i1> [#uses=1]
183         br i1 %tmp356, label %cond_next385, label %cond_true359
184
185 cond_true359:           ; preds = %cond_next340
186         tail call void @tree_class_check_failed( %struct.tree_node* %type, i32 2, i8* getelementptr ([28 x i8]* @.str, i32 0, i64 0), i32 1742, i8* getelementptr ([12 x i8]* @__FUNCTION__.22683, i32 0, i32 0) )
187         unreachable
188
189 cond_next385:           ; preds = %cond_next340
190         %tmp390 = getelementptr %struct.tree_node* %type, i32 0, i32 0, i32 8           ; <i8*> [#uses=1]
191         %tmp390391 = bitcast i8* %tmp390 to i32*                ; <i32*> [#uses=3]
192         %tmp392 = load i32* %tmp390391, align 8         ; <i32> [#uses=1]
193         %tmp394 = and i32 %tmp392, 511          ; <i32> [#uses=1]
194         %tmp397 = tail call i32 @smallest_mode_for_size( i32 %tmp394, i32 2 )           ; <i32> [#uses=1]
195         %tmp404 = load i32* %tmp390391, align 8         ; <i32> [#uses=1]
196         %tmp397398405 = shl i32 %tmp397, 9              ; <i32> [#uses=1]
197         %tmp407 = and i32 %tmp397398405, 65024          ; <i32> [#uses=1]
198         %tmp408 = and i32 %tmp404, -65025               ; <i32> [#uses=1]
199         %tmp409 = or i32 %tmp408, %tmp407               ; <i32> [#uses=2]
200         store i32 %tmp409, i32* %tmp390391, align 8
201         %tmp417 = load i32* %tmp3031, align 8           ; <i32> [#uses=1]
202         %tmp419420 = trunc i32 %tmp417 to i8            ; <i8> [#uses=1]
203         %tmp419420421422 = zext i8 %tmp419420 to i64            ; <i64> [#uses=1]
204         %tmp423 = getelementptr [0 x i32]* @tree_code_type, i32 0, i64 %tmp419420421422         ; <i32*> [#uses=1]
205         %tmp424 = load i32* %tmp423, align 4            ; <i32> [#uses=1]
206         %tmp425 = icmp eq i32 %tmp424, 2                ; <i1> [#uses=1]
207         br i1 %tmp425, label %cond_next454, label %cond_true428
208
209 cond_true428:           ; preds = %cond_next385
210         tail call void @tree_class_check_failed( %struct.tree_node* %type, i32 2, i8* getelementptr ([28 x i8]* @.str, i32 0, i64 0), i32 1744, i8* getelementptr ([12 x i8]* @__FUNCTION__.22683, i32 0, i32 0) )
211         unreachable
212
213 cond_next454:           ; preds = %cond_next385
214         lshr i32 %tmp409, 9             ; <i32>:0 [#uses=1]
215         trunc i32 %0 to i8              ; <i8>:1 [#uses=1]
216         %tmp463464 = and i8 %1, 127             ; <i8> [#uses=1]
217         %tmp463464465466 = zext i8 %tmp463464 to i64            ; <i64> [#uses=1]
218         %tmp467 = getelementptr [48 x i8]* @mode_size, i32 0, i64 %tmp463464465466              ; <i8*> [#uses=1]
219         %tmp468 = load i8* %tmp467, align 1             ; <i8> [#uses=1]
220         %tmp468469553 = zext i8 %tmp468 to i16          ; <i16> [#uses=1]
221         %tmp470471 = shl i16 %tmp468469553, 3           ; <i16> [#uses=1]
222         %tmp470471472 = zext i16 %tmp470471 to i64              ; <i64> [#uses=1]
223         %tmp473 = tail call %struct.tree_node* @size_int_kind( i64 %tmp470471472, i32 2 )               ; <%struct.tree_node*> [#uses=1]
224         store %struct.tree_node* %tmp473, %struct.tree_node** %tmp51, align 8
225         ret void
226
227 bb478:          ; preds = %cond_next57
228         br i1 %tmp40, label %cond_next500, label %cond_true497
229
230 cond_true497:           ; preds = %bb478
231         tail call void @tree_class_check_failed( %struct.tree_node* %type, i32 2, i8* getelementptr ([28 x i8]* @.str, i32 0, i64 0), i32 1755, i8* getelementptr ([12 x i8]* @__FUNCTION__.22683, i32 0, i32 0) )
232         unreachable
233
234 cond_next500:           ; preds = %bb478
235         %tmp506 = getelementptr %struct.tree_node* %type, i32 0, i32 0, i32 0, i32 1            ; <%struct.tree_node**> [#uses=1]
236         %tmp507 = load %struct.tree_node** %tmp506, align 8             ; <%struct.tree_node*> [#uses=2]
237         %tmp511 = getelementptr %struct.tree_node* %tmp507, i32 0, i32 0, i32 0, i32 3          ; <i8*> [#uses=1]
238         %tmp511512 = bitcast i8* %tmp511 to i32*                ; <i32*> [#uses=1]
239         %tmp513 = load i32* %tmp511512, align 8         ; <i32> [#uses=2]
240         %tmp515516 = trunc i32 %tmp513 to i8            ; <i8> [#uses=1]
241         %tmp515516517518 = zext i8 %tmp515516 to i64            ; <i64> [#uses=1]
242         %tmp519 = getelementptr [0 x i32]* @tree_code_type, i32 0, i64 %tmp515516517518         ; <i32*> [#uses=1]
243         %tmp520 = load i32* %tmp519, align 4            ; <i32> [#uses=1]
244         %tmp521 = icmp eq i32 %tmp520, 2                ; <i1> [#uses=1]
245         br i1 %tmp521, label %cond_next527, label %cond_true524
246
247 cond_true524:           ; preds = %cond_next500
248         tail call void @tree_class_check_failed( %struct.tree_node* %tmp507, i32 2, i8* getelementptr ([28 x i8]* @.str, i32 0, i64 0), i32 1755, i8* getelementptr ([12 x i8]* @__FUNCTION__.22683, i32 0, i32 0) )
249         unreachable
250
251 cond_next527:           ; preds = %cond_next500
252         %tmp545 = and i32 %tmp513, 8192         ; <i32> [#uses=1]
253         %tmp547 = and i32 %tmp32, -8193         ; <i32> [#uses=1]
254         %tmp548 = or i32 %tmp547, %tmp545               ; <i32> [#uses=1]
255         store i32 %tmp548, i32* %tmp3031, align 8
256         ret void
257
258 UnifiedReturnBlock:             ; preds = %cond_next57, %cond_next46, %cond_false
259         ret void
260 }
261
262 declare void @fancy_abort(i8*, i32, i8*)
263
264 declare void @tree_class_check_failed(%struct.tree_node*, i32, i8*, i32, i8*)
265
266 declare i32 @smallest_mode_for_size(i32, i32)
267
268 declare %struct.tree_node* @size_int_kind(i64, i32)
269
270 declare void @tree_check_failed(%struct.tree_node*, i8*, i32, i8*, ...)
271
272 declare i32 @tree_int_cst_sgn(%struct.tree_node*)