1; RUN: llvm-as -opaque-pointers < %s | llvm-dis -opaque-pointers | llvm-as -opaque-pointers | llvm-dis -opaque-pointers | FileCheck %s
2; RUN: verify-uselistorder -opaque-pointers %s
3
4; CHECK: @global = external global ptr
5@global = external global ptr
6
7; CHECK: @global_const_gep = global ptr getelementptr inbounds (i47, ptr @global, i64 1)
8@global_const_gep = global ptr getelementptr (i47, ptr @global, i64 1)
9
10; CHECK: @fptr1 = external global ptr
11; CHECK: @fptr2 = external global ptr addrspace(1)
12; CHECK: @fptr3 = external global ptr addrspace(2)
13@fptr1 = external global ptr ()*
14@fptr2 = external global ptr () addrspace(1)*
15@fptr3 = external global ptr () addrspace(1)* addrspace(2)*
16
17; CHECK: @ifunc = ifunc void (), ptr @f
18@ifunc = ifunc void (), ptr @f
19
20; CHECK: define ptr @f(ptr %a) {
21; CHECK:     %b = bitcast ptr %a to ptr
22; CHECK:     ret ptr %b
23define ptr @f(ptr %a) {
24    %b = bitcast ptr %a to ptr
25    ret ptr %b
26}
27
28; CHECK: define ptr @g(ptr addrspace(2) %a) {
29; CHECK:     %b = addrspacecast ptr addrspace(2) %a to ptr
30; CHECK:     ret ptr %b
31define ptr @g(ptr addrspace(2) %a) {
32    %b = addrspacecast ptr addrspace(2) %a to ptr addrspace(0)
33    ret ptr addrspace(0) %b
34}
35
36; CHECK: define ptr addrspace(2) @g2(ptr %a) {
37; CHECK:     %b = addrspacecast ptr %a to ptr addrspace(2)
38; CHECK:     ret ptr addrspace(2) %b
39define ptr addrspace(2) @g2(ptr addrspace(0) %a) {
40    %b = addrspacecast ptr addrspace(0) %a to ptr addrspace(2)
41    ret ptr addrspace(2) %b
42}
43
44; CHECK: define i32 @load(ptr %a)
45; CHECK:     %i = load i32, ptr %a
46; CHECK:     ret i32 %i
47define i32 @load(ptr %a) {
48    %i = load i32, ptr %a
49    ret i32 %i
50}
51
52; CHECK: define void @store(ptr %a, i32 %i)
53; CHECK:     store i32 %i, ptr %a
54; CHECK:     ret void
55define void @store(ptr %a, i32 %i) {
56    store i32 %i, ptr %a
57    ret void
58}
59
60; CHECK: define ptr @gep(ptr %a)
61; CHECK:     %res = getelementptr i8, ptr %a, i32 2
62; CHECK:     ret ptr %res
63define ptr @gep(ptr %a) {
64  %res = getelementptr i8, ptr %a, i32 2
65  ret ptr %res
66}
67
68; CHECK: define <2 x ptr> @gep_vec1(ptr %a)
69; CHECK:     %res = getelementptr i8, ptr %a, <2 x i32> <i32 1, i32 2>
70; CHECK:     ret <2 x ptr> %res
71define <2 x ptr> @gep_vec1(ptr %a) {
72  %res = getelementptr i8, ptr %a, <2 x i32> <i32 1, i32 2>
73  ret <2 x ptr> %res
74}
75
76; CHECK: define <2 x ptr> @gep_vec2(<2 x ptr> %a)
77; CHECK:     %res = getelementptr i8, <2 x ptr> %a, i32 2
78; CHECK:     ret <2 x ptr> %res
79define <2 x ptr> @gep_vec2(<2 x ptr> %a) {
80  %res = getelementptr i8, <2 x ptr> %a, i32 2
81  ret <2 x ptr> %res
82}
83
84; CHECK: define ptr @gep_constexpr(ptr %a)
85; CHECK:     ret ptr getelementptr (i16, ptr null, i32 3)
86define ptr @gep_constexpr(ptr %a) {
87  ret ptr getelementptr (i16, ptr null, i32 3)
88}
89
90; CHECK: define <2 x ptr> @gep_constexpr_vec1(ptr %a)
91; CHECK:     ret <2 x ptr> getelementptr (i16, ptr null, <2 x i32> <i32 3, i32 4>)
92define <2 x ptr> @gep_constexpr_vec1(ptr %a) {
93  ret <2 x ptr> getelementptr (i16, ptr null, <2 x i32> <i32 3, i32 4>)
94}
95
96; CHECK: define <2 x ptr> @gep_constexpr_vec2(<2 x ptr> %a)
97; CHECK:     ret <2 x ptr> getelementptr (i16, <2 x ptr> zeroinitializer, <2 x i32> <i32 3, i32 3>)
98define <2 x ptr> @gep_constexpr_vec2(<2 x ptr> %a) {
99  ret <2 x ptr> getelementptr (i16, <2 x ptr> zeroinitializer, i32 3)
100}
101
102; CHECK: define void @cmpxchg(ptr %p, i32 %a, i32 %b)
103; CHECK:     %val_success = cmpxchg ptr %p, i32 %a, i32 %b acq_rel monotonic
104; CHECK:     ret void
105define void @cmpxchg(ptr %p, i32 %a, i32 %b) {
106    %val_success = cmpxchg ptr %p, i32 %a, i32 %b acq_rel monotonic
107    ret void
108}
109
110; CHECK: define void @cmpxchg_ptr(ptr %p, ptr %a, ptr %b)
111; CHECK:     %val_success = cmpxchg ptr %p, ptr %a, ptr %b acq_rel monotonic
112; CHECK:     ret void
113define void @cmpxchg_ptr(ptr %p, ptr %a, ptr %b) {
114    %val_success = cmpxchg ptr %p, ptr %a, ptr %b acq_rel monotonic
115    ret void
116}
117
118; CHECK: define void @atomicrmw(ptr %a, i32 %i)
119; CHECK:     %b = atomicrmw add ptr %a, i32 %i acquire
120; CHECK:     ret void
121define void @atomicrmw(ptr %a, i32 %i) {
122    %b = atomicrmw add ptr %a, i32 %i acquire
123    ret void
124}
125
126; CHECK: define void @call(ptr %p)
127; CHECK:     call void %p()
128; CHECK:     ret void
129define void @call(ptr %p) {
130  call void %p()
131  ret void
132}
133
134; CHECK: define void @call_arg(ptr %p, i32 %a)
135; CHECK:     call void %p(i32 %a)
136; CHECK:     ret void
137define void @call_arg(ptr %p, i32 %a) {
138  call void %p(i32 %a)
139  ret void
140}
141
142; CHECK: define void @invoke(ptr %p) personality ptr @personality {
143; CHECK:   invoke void %p()
144; CHECK:     to label %continue unwind label %cleanup
145declare void @personality()
146define void @invoke(ptr %p) personality void ()* @personality {
147  invoke void %p()
148    to label %continue unwind label %cleanup
149
150continue:
151  ret void
152
153cleanup:
154  landingpad {}
155    cleanup
156  ret void
157}
158
159; CHECK: define void @byval(ptr byval({ i32, i32 }) %0)
160define void @byval(ptr byval({ i32, i32 }) %0) {
161  ret void
162}
163
164; CHECK: define void @call_unnamed_fn() {
165; CHECK:  call void @0()
166define void @call_unnamed_fn() {
167  call void @0()
168  ret void
169}
170
171; CHECK: define void @0() {
172define void @0() {
173  ret void
174}
175