[InstCombine] Signed saturation tests. NFC
[llvm-complete.git] / test / Bindings / llvm-c / echo.ll
blobc29991a1221376b23fab4a6bd34a3b50d9951e1f
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
5 source_filename = "/test/Bindings/echo.ll"
6 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
7 target triple = "x86_64-apple-macosx10.11.0"
9 module asm "classical GAS"
11 %S = type { i64, %S* }
13 @var = global i32 42
14 @ext = external global i32*
15 @cst = constant %S { i64 1, %S* @cst }
16 @tl = thread_local global { i64, %S* } { i64 1, %S* @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
25 @aliased1 = alias i32, i32* @var
26 @aliased2 = internal alias i32, i32* @var
27 @aliased3 = external alias i32, i32* @var
28 @aliased4 = weak alias i32, i32* @var
29 @aliased5 = weak_odr alias i32, i32* @var
31 @ifunc = ifunc i32 (i32), i64 ()* @ifunc_resolver
33 define i64 @ifunc_resolver() {
34 entry:
35   ret i64 0
38 define { i64, %S* } @unpackrepack(%S %s) {
39   %1 = extractvalue %S %s, 0
40   %2 = extractvalue %S %s, 1
41   %3 = insertvalue { i64, %S* } undef, %S* %2, 1
42   %4 = insertvalue { i64, %S* } %3, i64 %1, 0
43   ret { i64, %S* } %4
46 declare void @decl()
48 ; TODO: label and metadata types
49 define void @types() {
50   %1 = alloca half
51   %2 = alloca float
52   %3 = alloca double
53   %4 = alloca x86_fp80
54   %5 = alloca fp128
55   %6 = alloca ppc_fp128
56   %7 = alloca i7
57   %8 = alloca void (i1)*
58   %9 = alloca [3 x i22]
59   %10 = alloca i328 addrspace(5)*
60   %11 = alloca <5 x i23*>
61   %12 = alloca x86_mmx
62   ret void
65 define i32 @iops(i32 %a, i32 %b) {
66   %1 = add i32 %a, %b
67   %2 = mul i32 %a, %1
68   %3 = sub i32 %2, %1
69   %4 = udiv i32 %3, %b
70   %5 = sdiv i32 %2, %4
71   %6 = urem i32 %3, %5
72   %7 = srem i32 %2, %6
73   %8 = shl i32 %1, %b
74   %9 = lshr i32 %a, %7
75   %10 = ashr i32 %b, %8
76   %11 = and i32 %9, %10
77   %12 = or i32 %2, %11
78   %13 = xor i32 %12, %4
79   ret i32 %13
82 define i32 @call() {
83   %1 = call i32 @iops(i32 23, i32 19)
84   ret i32 %1
87 define i32 @cond(i32 %a, i32 %b) {
88   br label %br
89 unreachable:
90   unreachable
91 br:
92   %1 = icmp eq i32 %a, %b
93   br i1 %1, label %next0, label %unreachable
94 next0:
95   %2 = icmp ne i32 %a, %b
96   br i1 %2, label %next1, label %unreachable
97 next1:
98   %3 = icmp ugt i32 %a, %b
99   br i1 %3, label %next2, label %unreachable
100 next2:
101   %4 = icmp uge i32 %a, %b
102   br i1 %4, label %next3, label %unreachable
103 next3:
104   %5 = icmp ult i32 %a, %b
105   br i1 %5, label %next4, label %unreachable
106 next4:
107   %6 = icmp ule i32 %a, %b
108   br i1 %6, label %next5, label %unreachable
109 next5:
110   %7 = icmp sgt i32 %a, %b
111   br i1 %7, label %next6, label %unreachable
112 next6:
113   %8 = icmp sge i32 %a, %b
114   br i1 %8, label %next7, label %unreachable
115 next7:
116   %9 = icmp slt i32 %a, %b
117   br i1 %9, label %next8, label %unreachable
118 next8:
119   %10 = icmp sle i32 %a, %b
120   br i1 %10, label %next9, label %unreachable
121 next9:
122   ret i32 0
125 define i32 @loop(i32 %i) {
126   br label %cond
127 cond:
128   %c = phi i32 [ %i, %0 ], [ %j, %do ]
129   %p = phi i32 [ %r, %do ], [ 789, %0 ]
130   %1 = icmp eq i32 %c, 0
131   br i1 %1, label %do, label %done
133   %2 = sub i32 %p, 23
134   %j = sub i32 %i, 1
135   %r = mul i32 %2, 3
136   br label %cond
137 done:
138   ret i32 %p
141 define void @memops(i8* %ptr) {
142   %a = load i8, i8* %ptr
143   %b = load volatile i8, i8* %ptr
144   %c = load i8, i8* %ptr, align 8
145   %d = load atomic i8, i8* %ptr acquire, align 32
146   store i8 0, i8* %ptr
147   store volatile i8 0, i8* %ptr
148   store i8 0, i8* %ptr, align 8
149   store atomic i8 0, i8* %ptr release, align 32
150   %e = atomicrmw add i8* %ptr, i8 0 monotonic
151   %f = atomicrmw volatile xchg i8* %ptr, i8 0 acq_rel
152   %g = cmpxchg i8* %ptr, i8 1, i8 2 seq_cst acquire
153   %h = cmpxchg weak i8* %ptr, i8 1, i8 2 seq_cst acquire
154   %i = cmpxchg volatile i8* %ptr, i8 1, i8 2 monotonic monotonic
155   ret void
158 declare void @personalityFn()
160 define void @exn() personality void ()* @personalityFn {
161 entry:
162   invoke void @decl()
163           to label %via.cleanup unwind label %exn.dispatch
164 via.cleanup:
165   invoke void @decl()
166           to label %via.catchswitch unwind label %cleanup.inner
167 cleanup.inner:
168   %cp.inner = cleanuppad within none []
169   cleanupret from %cp.inner unwind label %exn.dispatch
170 via.catchswitch:
171   invoke void @decl()
172           to label %exit unwind label %dispatch.inner
173 dispatch.inner:
174   %cs.inner = catchswitch within none [label %pad.inner] unwind label %exn.dispatch
175 pad.inner:
176   %catch.inner = catchpad within %cs.inner [i32 0]
177   catchret from %catch.inner to label %exit
178 exn.dispatch:
179   %cs = catchswitch within none [label %pad1, label %pad2] unwind label %cleanup
180 pad1:
181   catchpad within %cs [i32 1]
182   unreachable
183 pad2:
184   catchpad within %cs [i32 2]
185   unreachable
186 cleanup:
187   %cp = cleanuppad within none []
188   cleanupret from %cp unwind to caller
189 exit:
190   ret void
193 define void @with_debuginfo() !dbg !4 {
194   ret void, !dbg !7
197 declare i8* @llvm.stacksave()
198 declare void @llvm.stackrestore(i8*)
199 declare void @llvm.lifetime.start.p0i8(i64, i8*)
200 declare void @llvm.lifetime.end.p0i8(i64, i8*)
202 define void @test_intrinsics() {
203 entry:
204   %sp = call i8* @llvm.stacksave()
205   %x = alloca i32
206   %0 = bitcast i32* %x to i8*
207   call void @llvm.lifetime.start.p0i8(i64 4, i8* %0)
208   call void @llvm.lifetime.end.p0i8(i64 4, i8* %0)
209   call void @llvm.stackrestore(i8* %sp)
210   ret void
213 !llvm.dbg.cu = !{!0, !2}
214 !llvm.module.flags = !{!3}
216 !0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
217 !1 = !DIFile(filename: "echo.ll", directory: "/llvm/test/Bindings/llvm-c/echo.ll")
218 !2 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
219 !3 = !{i32 2, !"Debug Info Version", i32 3}
220 !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)
221 !5 = !DISubroutineType(types: !6)
222 !6 = !{}
223 !7 = !DILocation(line: 42, scope: !8, inlinedAt: !11)
224 !8 = distinct !DILexicalBlock(scope: !9, file: !1, line: 42, column: 12)
225 !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)
226 !10 = distinct !DILocation(line: 84, scope: !8, inlinedAt: !11)
227 !11 = !DILocation(line: 42, scope: !4)