xref: /llvm-project/llvm/test/Bindings/llvm-c/echo.ll (revision eb7d535199d7fc3de763276093b97141a041d3d6)
1; RUN: llvm-as < %s | llvm-dis > %t.orig
2; RUN: llvm-as < %s | llvm-c-test --echo > %t.echo
3; RUN: diff -w %t.orig %t.echo
4;
5source_filename = "/test/Bindings/echo.ll"
6target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
7target triple = "x86_64-apple-macosx10.11.0"
8
9module asm "classical GAS"
10
11%S = type { i64, ptr }
12
13@var = global i32 42
14@ext = external global ptr
15@cst = constant %S { i64 1, ptr @cst }
16@tl = thread_local global { i64, ptr } { i64 1, ptr @cst }
17@arr = linkonce_odr global [5 x i8] [ i8 2, i8 3, i8 5, i8 7, i8 11 ]
18@str = private unnamed_addr constant [13 x i8] c"hello world\0A\00"
19@locStr = private local_unnamed_addr constant [13 x i8] c"hello world\0A\00"
20@hidden = hidden global i32 7
21@protected = protected global i32 23
22@section = global i32 27, section ".custom"
23@align = global i32 31, align 4
24@nullptr = global ptr null
25
26@const_gep = global ptr getelementptr (i32, ptr @var, i64 2)
27@const_inbounds_gep = global ptr getelementptr inbounds (i32, ptr @var, i64 1)
28@const_gep_nuw = global ptr getelementptr nuw (i32, ptr @var, i64 1)
29@const_gep_nusw = global ptr getelementptr nusw (i32, ptr @var, i64 1)
30@const_gep_nuw_inbounds = global ptr getelementptr nuw inbounds (i32, ptr @var, i64 1)
31
32@aliased1 = alias i32, ptr @var
33@aliased2 = internal alias i32, ptr @var
34@aliased3 = external alias i32, ptr @var
35@aliased4 = weak alias i32, ptr @var
36@aliased5 = weak_odr alias i32, ptr @var
37
38@ifunc = ifunc i32 (i32), ptr @ifunc_resolver
39
40@ptrauth_addr_disc = global i32 0
41@ptrauth_data = global i32 0
42@ptrauth_ptr_01 = global ptr ptrauth (ptr @ptrauth_data, i32 77, i64 1001, ptr @ptrauth_addr_disc)
43@ptrauth_ptr_02 = global ptr ptrauth (ptr @ptrauth_data, i32 11, i64 99, ptr null)
44
45define ptr @ifunc_resolver() {
46entry:
47  ret ptr null
48}
49
50define { i64, ptr } @unpackrepack(%S %s) {
51  %1 = extractvalue %S %s, 0
52  %2 = extractvalue %S %s, 1
53  %3 = insertvalue { i64, ptr } undef, ptr %2, 1
54  %4 = insertvalue { i64, ptr } %3, i64 %1, 0
55  ret { i64, ptr } %4
56}
57
58declare void @decl()
59
60; TODO: label and metadata types
61define void @types() {
62  %1 = alloca half, align 2
63  %2 = alloca float, align 4
64  %3 = alloca double, align 8
65  %4 = alloca x86_fp80, align 16
66  %5 = alloca fp128, align 16
67  %6 = alloca ppc_fp128, align 16
68  %7 = alloca i7, align 1
69  %8 = alloca ptr, align 8
70  %9 = alloca [3 x i22], align 4
71  %10 = alloca ptr addrspace(5), align 8
72  %11 = alloca <5 x ptr>, align 64
73  %12 = alloca <1 x i64>, align 8
74  ret void
75}
76
77; Target extension types:
78define target("target.ext.1") @target_ext_01(target("target.ext.1") %0) {
79  ret target("target.ext.1") %0
80}
81
82define target("target.ext.2", i8, i1) @target_ext_02(target("target.ext.2", i8, i1) %0) {
83  ret target("target.ext.2", i8, i1) %0
84}
85
86define target("target.ext.3", 7) @target_ext_03(target("target.ext.3", 7) %0) {
87  ret target("target.ext.3", 7) %0
88}
89
90define target("target.ext.4", i1, i32, 7) @target_ext_04(target("target.ext.4", i1, i32, 7) %0) {
91  ret target("target.ext.4", i1, i32, 7) %0
92}
93
94define i32 @iops(i32 %a, i32 %b) {
95  %1 = add i32 %a, %b
96  %2 = mul i32 %a, %1
97  %3 = sub i32 %2, %1
98  %4 = udiv i32 %3, %b
99  %5 = sdiv i32 %2, %4
100  %6 = urem i32 %3, %5
101  %7 = srem i32 %2, %6
102  %8 = shl i32 %1, %b
103  %9 = lshr i32 %a, %7
104  %10 = ashr i32 %b, %8
105  %11 = and i32 %9, %10
106  %12 = or i32 %2, %11
107  %13 = xor i32 %12, %4
108  %14 = add nuw i32 %13, %a
109  %15 = add nsw i32 %14, %b
110  %16 = add nuw nsw i32 %15, %a
111  %17 = shl nuw i32 %16, %a
112  %18 = shl nsw i32 %17, %b
113  %19 = shl nuw nsw i32 %18, %a
114  %20 = udiv exact i32 %19, %1
115  %21 = sdiv exact i32 %20, %2
116  %22 = lshr exact i32 %21, %4
117  %23 = ashr exact i32 %22, %14
118  %24 = zext i32 %23 to i64
119  %25 = zext nneg i32 %23 to i64
120  %26 = or disjoint i32 %23, %a
121  ret i32 %26
122}
123
124define i32 @call() {
125  %1 = call i32 @iops(i32 23, i32 19)
126  ret i32 %1
127}
128
129define i32 @tailcall() {
130  %1 = tail call i32 @call()
131  ret i32 %1
132}
133
134define i32 @musttailcall() {
135  %1 = musttail call i32 @call()
136  ret i32 %1
137}
138
139define i32 @notailcall() {
140  %1 = notail call i32 @call()
141  ret i32 %1
142}
143
144define i32 @call_inline_asm(i32 %0) {
145	; Test Intel syntax
146	%2 = tail call i32 asm sideeffect inteldialect "mov $0, $1", "=r,r,~{dirflag},~{fpsr},~{flags}"(i32 %0)
147	%3 = tail call i32 asm sideeffect inteldialect "lea $0, [$1+$2]", "=r,r,r,~{dirflag},~{fpsr},~{flags}"(i32 %0, i32 %2)
148	%4 = tail call i32 asm inteldialect "mov $0, $1", "=r,r,~{dirflag},~{fpsr},~{flags}"(i32 %3)
149	%5 = tail call i32 asm inteldialect unwind "mov $0, $1", "=r,r,~{dirflag},~{fpsr},~{flags}"(i32 %4)
150	%6 = tail call i32 asm alignstack inteldialect "mov $0, $1", "=r,r,~{dirflag},~{fpsr},~{flags}"(i32 %5)
151
152	; Test AT&T syntax
153	%7 = tail call i32 asm "mov $1, $0", "=r,r,~{dirflag},~{fpsr},~{flags}"(i32 %6)
154	%8 = tail call i32 asm sideeffect "mov $1, $0", "=r,r,~{dirflag},~{fpsr},~{flags}"(i32 %7)
155	%9 = tail call i32 asm alignstack "mov $1, $0", "=r,r,~{dirflag},~{fpsr},~{flags}"(i32 %8)
156	%10 = tail call i32 asm alignstack unwind "mov $1, $0", "=r,r,~{dirflag},~{fpsr},~{flags}"(i32 %9)
157	ret i32 %10
158}
159
160define i32 @cond(i32 %a, i32 %b) {
161  br label %br
162unreachable:
163  unreachable
164br:
165  %1 = icmp eq i32 %a, %b
166  br i1 %1, label %next0, label %unreachable
167next0:
168  %2 = icmp ne i32 %a, %b
169  br i1 %2, label %next1, label %unreachable
170next1:
171  %3 = icmp ugt i32 %a, %b
172  br i1 %3, label %next2, label %unreachable
173next2:
174  %4 = icmp uge i32 %a, %b
175  br i1 %4, label %next3, label %unreachable
176next3:
177  %5 = icmp ult i32 %a, %b
178  br i1 %5, label %next4, label %unreachable
179next4:
180  %6 = icmp ule i32 %a, %b
181  br i1 %6, label %next5, label %unreachable
182next5:
183  %7 = icmp sgt i32 %a, %b
184  br i1 %7, label %next6, label %unreachable
185next6:
186  %8 = icmp sge i32 %a, %b
187  br i1 %8, label %next7, label %unreachable
188next7:
189  %9 = icmp slt i32 %a, %b
190  br i1 %9, label %next8, label %unreachable
191next8:
192  %10 = icmp sle i32 %a, %b
193  br i1 %10, label %next9, label %unreachable
194next9:
195  ret i32 0
196}
197
198define i32 @loop(i32 %i) {
199  br label %cond
200cond:
201  %c = phi i32 [ %i, %0 ], [ %j, %do ]
202  %p = phi i32 [ %r, %do ], [ 789, %0 ]
203  %1 = icmp eq i32 %c, 0
204  br i1 %1, label %do, label %done
205do:
206  %2 = sub i32 %p, 23
207  %j = sub i32 %i, 1
208  %r = mul i32 %2, 3
209  br label %cond
210done:
211  ret i32 %p
212}
213
214define void @memops(ptr %ptr) {
215  %a = load i8, ptr %ptr
216  %b = load volatile i8, ptr %ptr
217  %c = load i8, ptr %ptr, align 8
218  %d = load atomic i8, ptr %ptr acquire, align 32
219  %e = load atomic i8, ptr %ptr syncscope("singlethread") acquire, align 32
220  store i8 0, ptr %ptr
221  store volatile i8 0, ptr %ptr
222  store i8 0, ptr %ptr, align 8
223  store atomic i8 0, ptr %ptr release, align 32
224  store atomic i8 0, ptr %ptr syncscope("singlethread") release, align 32
225  %f = atomicrmw add ptr %ptr, i8 0 monotonic, align 1
226  %g = atomicrmw volatile xchg ptr %ptr, i8 0 acq_rel, align 8
227  %h = atomicrmw volatile xchg ptr %ptr, i8 0 syncscope("singlethread") acq_rel, align 8
228  %i = atomicrmw volatile xchg ptr %ptr, i8 0 syncscope("agent") acq_rel, align 8
229  %j = cmpxchg ptr %ptr, i8 1, i8 2 seq_cst acquire, align 1
230  %k = cmpxchg weak ptr %ptr, i8 1, i8 2 seq_cst acquire, align 8
231  %l = cmpxchg volatile ptr %ptr, i8 1, i8 2 monotonic monotonic, align 16
232  %m = cmpxchg volatile ptr %ptr, i8 1, i8 2 syncscope("singlethread") monotonic monotonic, align 16
233  %n = cmpxchg volatile ptr %ptr, i8 1, i8 2 syncscope("agent") monotonic monotonic, align 16
234  fence syncscope("singlethread") acquire
235  fence syncscope("agent") acquire
236  ret void
237}
238
239define i32 @vectorops(i32, i32) {
240  %a = insertelement <4 x i32> undef, i32 %0, i32 0
241  %b = insertelement <4 x i32> %a, i32 %1, i32 2
242  %c = shufflevector <4 x i32> %b, <4 x i32> undef, <4 x i32> zeroinitializer
243  %d = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
244  %e = add <4 x i32> %d, %a
245  %f = mul <4 x i32> %e, %b
246  %g = xor <4 x i32> %f, %d
247  %h = or <4 x i32> %f, %e
248  %i = lshr <4 x i32> %h, <i32 2, i32 2, i32 2, i32 2>
249  %j = shl <4 x i32> %i, <i32 2, i32 3, i32 4, i32 5>
250  %k = shufflevector <4 x i32> %j, <4 x i32> %i, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
251  %m = shufflevector <4 x i32> %k, <4 x i32> undef, <1 x i32> <i32 1>
252  %n = shufflevector <4 x i32> %j, <4 x i32> undef, <8 x i32> <i32 0, i32 0, i32 1, i32 2, i32 undef, i32 3, i32 undef, i32 undef>
253  %p = extractelement <8 x i32> %n, i32 5
254  ret i32 %p
255}
256
257define i32 @scalablevectorops(i32, <vscale x 4 x i32>) {
258  %a = insertelement <vscale x 4 x i32> undef, i32 %0, i32 0
259  %b = insertelement <vscale x 4 x i32> %a, i32 %0, i32 2
260  %c = shufflevector <vscale x 4 x i32> %b, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
261  %e = add <vscale x 4 x i32> %a, %1
262  %f = mul <vscale x 4 x i32> %e, %b
263  %g = xor <vscale x 4 x i32> %f, %e
264  %h = or <vscale x 4 x i32> %g, %e
265  %i = lshr <vscale x 4 x i32> %h, undef
266  %j = extractelement <vscale x 4 x i32> %i, i32 3
267  ret i32 %j
268}
269
270declare void @personalityFn()
271
272define void @exn() personality ptr @personalityFn {
273entry:
274  invoke void @decl()
275          to label %via.cleanup unwind label %exn.dispatch
276via.cleanup:
277  invoke void @decl()
278          to label %via.catchswitch unwind label %cleanup.inner
279cleanup.inner:
280  %cp.inner = cleanuppad within none []
281  cleanupret from %cp.inner unwind label %exn.dispatch
282via.catchswitch:
283  invoke void @decl()
284          to label %exit unwind label %dispatch.inner
285dispatch.inner:
286  %cs.inner = catchswitch within none [label %pad.inner] unwind label %exn.dispatch
287pad.inner:
288  %catch.inner = catchpad within %cs.inner [i32 0]
289  catchret from %catch.inner to label %exit
290exn.dispatch:
291  %cs = catchswitch within none [label %pad1, label %pad2] unwind label %cleanup
292pad1:
293  catchpad within %cs [i32 1]
294  unreachable
295pad2:
296  catchpad within %cs [i32 2]
297  unreachable
298cleanup:
299  %cp = cleanuppad within none []
300  cleanupret from %cp unwind to caller
301exit:
302  ret void
303}
304
305define void @operandbundles() personality ptr @personalityFn {
306  call void @decl() [ "foo"(), "bar\00x"(i32 0, ptr null, token none) ]
307  invoke void @decl() [ "baz"(label %bar) ] to label %foo unwind label %bar
308foo:
309  ret void
310bar:
311  %1 = landingpad { ptr, i32 }
312          cleanup
313  ret void
314}
315
316define void @with_debuginfo() !dbg !4 {
317  ret void, !dbg !7
318}
319
320declare ptr @llvm.stacksave()
321declare void @llvm.stackrestore(ptr)
322declare void @llvm.lifetime.start.p0(i64, ptr)
323declare void @llvm.lifetime.end.p0(i64, ptr)
324
325define void @test_intrinsics() {
326entry:
327  %sp = call ptr @llvm.stacksave()
328  %0 = alloca i8, align 1
329  call void @llvm.lifetime.start.p0(i64 1, ptr %0)
330  call void @llvm.lifetime.end.p0(i64 1, ptr %0)
331  call void @llvm.stackrestore(ptr %sp)
332  ret void
333}
334
335define void @test_fast_math_flags(i1 %c, float %a, float %b) {
336entry:
337  %select.f.1 = select i1 %c, float %a, float %b
338  %select.f.2 = select nsz i1 %c, float %a, float %b
339  %select.f.3 = select fast i1 %c, float %a, float %b
340  %select.f.4 = select nnan arcp afn i1 %c, float %a, float %b
341
342  br i1 %c, label %choose_a, label %choose_b
343
344choose_a:
345  br label %final
346
347choose_b:
348  br label %final
349
350final:
351  %phi.f.1 = phi float  [ %a, %choose_a ], [ %b, %choose_b ]
352  %phi.f.2 = phi nsz float [ %a, %choose_a ], [ %b, %choose_b ]
353  %phi.f.3 = phi fast float [ %a, %choose_a ], [ %b, %choose_b ]
354  %phi.f.4 = phi nnan arcp afn float [ %a, %choose_a ], [ %b, %choose_b ]
355  ret void
356}
357
358define float @test_fast_math_flags_call_inner(float %a) {
359  ret float %a
360}
361
362define void @test_fast_math_flags_call_outer(float %a) {
363  %a.1 = call float @test_fast_math_flags_call_inner(float %a)
364  %a.2 = call nsz float @test_fast_math_flags_call_inner(float %a)
365  %a.3 = call fast float @test_fast_math_flags_call_inner(float %a)
366  %a.4 = call nnan arcp afn float @test_fast_math_flags_call_inner(float %a)
367  ret void
368}
369
370define void @test_func_prefix_data_01() prefix i32 123 {
371  ret void
372}
373
374define void @test_func_prefix_data_02() prefix i64 2000 {
375  ret void
376}
377
378%func_prolog_struct = type <{ i8, i8, ptr }>
379
380define void @test_func_prologue_data_01() prologue %func_prolog_struct <{ i8 235, i8 8, ptr zeroinitializer}> {
381  ret void
382}
383
384
385define void @test_call_br_01(i32 %input) {
386entry:
387  callbr void asm "nop", "r,!i"(i32 %input) to label %bb_01 [label %bb_02]
388
389bb_01:
390  ret void
391bb_02:
392  ret void
393}
394
395define void @test_call_br_02(i32 %input0, i32 %input1) {
396entry:
397  ; Multiple indirect destinations, operand bundles, and arguments
398  callbr void asm "nop", "r,r,!i,!i"(i32 %input0, i32 %input1)
399    ["op0"(i32 %input1), "op1"(label %bb_02)]
400    to label %bb_01 [label %bb_03, label %bb_02]
401
402bb_01:
403  ret void
404bb_02:
405  ret void
406bb_03:
407  ret void
408}
409
410define ptr @test_gep_no_wrap_flags(ptr %0) {
411  %gep.1 = getelementptr i8, ptr %0, i32 4
412  %gep.inbounds = getelementptr inbounds i8, ptr %0, i32 4
413  %gep.nuw = getelementptr nuw i8, ptr %0, i32 4
414  %gep.nuw.inbounds = getelementptr inbounds nuw i8, ptr %0, i32 4
415  %gep.nusw = getelementptr nusw i8, ptr %0, i32 4
416  ret ptr %gep.nusw
417}
418
419!llvm.dbg.cu = !{!0, !2}
420!llvm.module.flags = !{!3}
421
422!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
423!1 = !DIFile(filename: "echo.ll", directory: "/llvm/test/Bindings/llvm-c/echo.ll")
424!2 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
425!3 = !{i32 2, !"Debug Info Version", i32 3}
426!4 = distinct !DISubprogram(name: "with_debuginfo", linkageName: "_with_debuginfo", scope: null, file: !1, line: 42, type: !5, isLocal: false, isDefinition: true, scopeLine: 1519, flags: DIFlagPrototyped, isOptimized: true, unit: !0, templateParams: !6, retainedNodes: !6)
427!5 = !DISubroutineType(types: !6)
428!6 = !{}
429!7 = !DILocation(line: 42, scope: !8, inlinedAt: !11)
430!8 = distinct !DILexicalBlock(scope: !9, file: !1, line: 42, column: 12)
431!9 = distinct !DISubprogram(name: "fake_inlined_block", linkageName: "_fake_inlined_block", scope: null, file: !1, line: 82, type: !5, isLocal: false, isDefinition: true, scopeLine: 82, flags: DIFlagPrototyped, isOptimized: true, unit: !2, templateParams: !6, retainedNodes: !6)
432!10 = distinct !DILocation(line: 84, scope: !8, inlinedAt: !11)
433!11 = !DILocation(line: 42, scope: !4)
434