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