1; RUN: opt -pre-isel-intrinsic-lowering -S -o - %s | FileCheck %s 2; RUN: opt -passes='pre-isel-intrinsic-lowering' -S -o - %s | FileCheck %s 3 4; Make sure calls to the objc intrinsics are translated to calls in to the 5; runtime 6 7define i8* @test_objc_autorelease(i8* %arg0) { 8; CHECK-LABEL: test_objc_autorelease 9; CHECK-NEXT: entry 10; CHECK-NEXT: %0 = call i8* @objc_autorelease(i8* %arg0) 11; CHECK-NEXT: ret i8* %0 12entry: 13 %0 = call i8* @llvm.objc.autorelease(i8* %arg0) 14 ret i8* %0 15} 16 17define void @test_objc_autoreleasePoolPop(i8* %arg0) { 18; CHECK-LABEL: test_objc_autoreleasePoolPop 19; CHECK-NEXT: entry 20; CHECK-NEXT: call void @objc_autoreleasePoolPop(i8* %arg0) 21; CHECK-NEXT: ret void 22entry: 23 call void @llvm.objc.autoreleasePoolPop(i8* %arg0) 24 ret void 25} 26 27define i8* @test_objc_autoreleasePoolPush() { 28; CHECK-LABEL: test_objc_autoreleasePoolPush 29; CHECK-NEXT: entry 30; CHECK-NEXT: %0 = call i8* @objc_autoreleasePoolPush() 31; CHECK-NEXT: ret i8* %0 32entry: 33 %0 = call i8* @llvm.objc.autoreleasePoolPush() 34 ret i8* %0 35} 36 37define i8* @test_objc_autoreleaseReturnValue(i8* %arg0) { 38; CHECK-LABEL: test_objc_autoreleaseReturnValue 39; CHECK-NEXT: entry 40; CHECK-NEXT: %0 = call i8* @objc_autoreleaseReturnValue(i8* %arg0) 41; CHECK-NEXT: ret i8* %0 42entry: 43 %0 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %arg0) 44 ret i8* %0 45} 46 47define void @test_objc_copyWeak(i8** %arg0, i8** %arg1) { 48; CHECK-LABEL: test_objc_copyWeak 49; CHECK-NEXT: entry 50; CHECK-NEXT: call void @objc_copyWeak(i8** %arg0, i8** %arg1) 51; CHECK-NEXT: ret void 52entry: 53 call void @llvm.objc.copyWeak(i8** %arg0, i8** %arg1) 54 ret void 55} 56 57define void @test_objc_destroyWeak(i8** %arg0) { 58; CHECK-LABEL: test_objc_destroyWeak 59; CHECK-NEXT: entry 60; CHECK-NEXT: call void @objc_destroyWeak(i8** %arg0) 61; CHECK-NEXT: ret void 62entry: 63 call void @llvm.objc.destroyWeak(i8** %arg0) 64 ret void 65} 66 67define i8* @test_objc_initWeak(i8** %arg0, i8* %arg1) { 68; CHECK-LABEL: test_objc_initWeak 69; CHECK-NEXT: entry 70; CHECK-NEXT: %0 = call i8* @objc_initWeak(i8** %arg0, i8* %arg1) 71; CHECK-NEXT: ret i8* %0 72entry: 73 %0 = call i8* @llvm.objc.initWeak(i8** %arg0, i8* %arg1) 74 ret i8* %0 75} 76 77define i8* @test_objc_loadWeak(i8** %arg0) { 78; CHECK-LABEL: test_objc_loadWeak 79; CHECK-NEXT: entry 80; CHECK-NEXT: %0 = call i8* @objc_loadWeak(i8** %arg0) 81; CHECK-NEXT: ret i8* %0 82entry: 83 %0 = call i8* @llvm.objc.loadWeak(i8** %arg0) 84 ret i8* %0 85} 86 87define i8* @test_objc_loadWeakRetained(i8** %arg0) { 88; CHECK-LABEL: test_objc_loadWeakRetained 89; CHECK-NEXT: entry 90; CHECK-NEXT: %0 = call i8* @objc_loadWeakRetained(i8** %arg0) 91; CHECK-NEXT: ret i8* %0 92entry: 93 %0 = call i8* @llvm.objc.loadWeakRetained(i8** %arg0) 94 ret i8* %0 95} 96 97define void @test_objc_moveWeak(i8** %arg0, i8** %arg1) { 98; CHECK-LABEL: test_objc_moveWeak 99; CHECK-NEXT: entry 100; CHECK-NEXT: call void @objc_moveWeak(i8** %arg0, i8** %arg1) 101; CHECK-NEXT: ret void 102entry: 103 call void @llvm.objc.moveWeak(i8** %arg0, i8** %arg1) 104 ret void 105} 106 107define void @test_objc_release(i8* %arg0) { 108; CHECK-LABEL: test_objc_release 109; CHECK-NEXT: entry 110; CHECK-NEXT: call void @objc_release(i8* %arg0) 111; CHECK-NEXT: ret void 112entry: 113 call void @llvm.objc.release(i8* %arg0) 114 ret void 115} 116 117define i8* @test_objc_retain(i8* %arg0) { 118; CHECK-LABEL: test_objc_retain 119; CHECK-NEXT: entry 120; CHECK-NEXT: %0 = call i8* @objc_retain(i8* %arg0) 121; CHECK-NEXT: ret i8* %0 122entry: 123 %0 = call i8* @llvm.objc.retain(i8* %arg0) 124 ret i8* %0 125} 126 127define i8* @test_objc_retainAutorelease(i8* %arg0) { 128; CHECK-LABEL: test_objc_retainAutorelease 129; CHECK-NEXT: entry 130; CHECK-NEXT: %0 = call i8* @objc_retainAutorelease(i8* %arg0) 131; CHECK-NEXT: ret i8* %0 132entry: 133 %0 = call i8* @llvm.objc.retainAutorelease(i8* %arg0) 134 ret i8* %0 135} 136 137define i8* @test_objc_retainAutoreleaseReturnValue(i8* %arg0) { 138; CHECK-LABEL: test_objc_retainAutoreleaseReturnValue 139; CHECK-NEXT: entry 140; CHECK-NEXT: %0 = tail call i8* @objc_retainAutoreleaseReturnValue(i8* %arg0) 141; CHECK-NEXT: ret i8* %0 142entry: 143 %0 = tail call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %arg0) 144 ret i8* %0 145} 146 147define i8* @test_objc_retainAutoreleasedReturnValue(i8* %arg0) { 148; CHECK-LABEL: test_objc_retainAutoreleasedReturnValue 149; CHECK-NEXT: entry 150; CHECK-NEXT: %0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %arg0) 151; CHECK-NEXT: ret i8* %0 152entry: 153 %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %arg0) 154 ret i8* %0 155} 156 157define i8* @test_objc_retainBlock(i8* %arg0) { 158; CHECK-LABEL: test_objc_retainBlock 159; CHECK-NEXT: entry 160; CHECK-NEXT: %0 = call i8* @objc_retainBlock(i8* %arg0) 161; CHECK-NEXT: ret i8* %0 162entry: 163 %0 = call i8* @llvm.objc.retainBlock(i8* %arg0) 164 ret i8* %0 165} 166 167define void @test_objc_storeStrong(i8** %arg0, i8* %arg1) { 168; CHECK-LABEL: test_objc_storeStrong 169; CHECK-NEXT: entry 170; CHECK-NEXT: call void @objc_storeStrong(i8** %arg0, i8* %arg1) 171; CHECK-NEXT: ret void 172entry: 173 call void @llvm.objc.storeStrong(i8** %arg0, i8* %arg1) 174 ret void 175} 176 177define i8* @test_objc_storeWeak(i8** %arg0, i8* %arg1) { 178; CHECK-LABEL: test_objc_storeWeak 179; CHECK-NEXT: entry 180; CHECK-NEXT: %0 = call i8* @objc_storeWeak(i8** %arg0, i8* %arg1) 181; CHECK-NEXT: ret i8* %0 182entry: 183 %0 = call i8* @llvm.objc.storeWeak(i8** %arg0, i8* %arg1) 184 ret i8* %0 185} 186 187define i8* @test_objc_unsafeClaimAutoreleasedReturnValue(i8* %arg0) { 188; CHECK-LABEL: test_objc_unsafeClaimAutoreleasedReturnValue 189; CHECK-NEXT: entry 190; CHECK-NEXT: %0 = call i8* @objc_unsafeClaimAutoreleasedReturnValue(i8* %arg0) 191; CHECK-NEXT: ret i8* %0 192entry: 193 %0 = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %arg0) 194 ret i8* %0 195} 196 197define i8* @test_objc_retainedObject(i8* %arg0) { 198; CHECK-LABEL: test_objc_retainedObject 199; CHECK-NEXT: entry 200; CHECK-NEXT: %0 = call i8* @objc_retainedObject(i8* %arg0) 201; CHECK-NEXT: ret i8* %0 202entry: 203 %0 = call i8* @llvm.objc.retainedObject(i8* %arg0) 204 ret i8* %0 205} 206 207define i8* @test_objc_unretainedObject(i8* %arg0) { 208; CHECK-LABEL: test_objc_unretainedObject 209; CHECK-NEXT: entry 210; CHECK-NEXT: %0 = call i8* @objc_unretainedObject(i8* %arg0) 211; CHECK-NEXT: ret i8* %0 212entry: 213 %0 = call i8* @llvm.objc.unretainedObject(i8* %arg0) 214 ret i8* %0 215} 216 217define i8* @test_objc_unretainedPointer(i8* %arg0) { 218; CHECK-LABEL: test_objc_unretainedPointer 219; CHECK-NEXT: entry 220; CHECK-NEXT: %0 = call i8* @objc_unretainedPointer(i8* %arg0) 221; CHECK-NEXT: ret i8* %0 222entry: 223 %0 = call i8* @llvm.objc.unretainedPointer(i8* %arg0) 224 ret i8* %0 225} 226 227define i8* @test_objc_retain_autorelease(i8* %arg0) { 228; CHECK-LABEL: test_objc_retain_autorelease 229; CHECK-NEXT: entry 230; CHECK-NEXT: %0 = call i8* @objc_retain_autorelease(i8* %arg0) 231; CHECK-NEXT: ret i8* %0 232entry: 233 %0 = call i8* @llvm.objc.retain.autorelease(i8* %arg0) 234 ret i8* %0 235} 236 237define i32 @test_objc_sync_enter(i8* %arg0) { 238; CHECK-LABEL: test_objc_sync_enter 239; CHECK-NEXT: entry 240; CHECK-NEXT: %0 = call i32 @objc_sync_enter(i8* %arg0) 241; CHECK-NEXT: ret i32 %0 242entry: 243 %0 = call i32 @llvm.objc.sync.enter(i8* %arg0) 244 ret i32 %0 245} 246 247define i32 @test_objc_sync_exit(i8* %arg0) { 248; CHECK-LABEL: test_objc_sync_exit 249; CHECK-NEXT: entry 250; CHECK-NEXT: %0 = call i32 @objc_sync_exit(i8* %arg0) 251; CHECK-NEXT: ret i32 %0 252entry: 253 %0 = call i32 @llvm.objc.sync.exit(i8* %arg0) 254 ret i32 %0 255} 256 257declare i8* @llvm.objc.autorelease(i8*) 258declare void @llvm.objc.autoreleasePoolPop(i8*) 259declare i8* @llvm.objc.autoreleasePoolPush() 260declare i8* @llvm.objc.autoreleaseReturnValue(i8*) 261declare void @llvm.objc.copyWeak(i8**, i8**) 262declare void @llvm.objc.destroyWeak(i8**) 263declare extern_weak i8* @llvm.objc.initWeak(i8**, i8*) 264declare i8* @llvm.objc.loadWeak(i8**) 265declare i8* @llvm.objc.loadWeakRetained(i8**) 266declare void @llvm.objc.moveWeak(i8**, i8**) 267declare void @llvm.objc.release(i8*) 268declare i8* @llvm.objc.retain(i8*) 269declare i8* @llvm.objc.retainAutorelease(i8*) 270declare i8* @llvm.objc.retainAutoreleaseReturnValue(i8*) 271declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*) 272declare i8* @llvm.objc.retainBlock(i8*) 273declare void @llvm.objc.storeStrong(i8**, i8*) 274declare i8* @llvm.objc.storeWeak(i8**, i8*) 275declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*) 276declare i8* @llvm.objc.retainedObject(i8*) 277declare i8* @llvm.objc.unretainedObject(i8*) 278declare i8* @llvm.objc.unretainedPointer(i8*) 279declare i8* @llvm.objc.retain.autorelease(i8*) 280declare i32 @llvm.objc.sync.enter(i8*) 281declare i32 @llvm.objc.sync.exit(i8*) 282 283attributes #0 = { nounwind } 284 285; CHECK: declare i8* @objc_autorelease(i8*) 286; CHECK: declare void @objc_autoreleasePoolPop(i8*) 287; CHECK: declare i8* @objc_autoreleasePoolPush() 288; CHECK: declare i8* @objc_autoreleaseReturnValue(i8*) 289; CHECK: declare void @objc_copyWeak(i8**, i8**) 290; CHECK: declare void @objc_destroyWeak(i8**) 291; CHECK: declare extern_weak i8* @objc_initWeak(i8**, i8*) 292; CHECK: declare i8* @objc_loadWeak(i8**) 293; CHECK: declare i8* @objc_loadWeakRetained(i8**) 294; CHECK: declare void @objc_moveWeak(i8**, i8**) 295; CHECK: declare void @objc_release(i8*) [[NLB:#[0-9]+]] 296; CHECK: declare i8* @objc_retain(i8*) [[NLB]] 297; CHECK: declare i8* @objc_retainAutorelease(i8*) 298; CHECK: declare i8* @objc_retainAutoreleaseReturnValue(i8*) 299; CHECK: declare i8* @objc_retainAutoreleasedReturnValue(i8*) 300; CHECK: declare i8* @objc_retainBlock(i8*) 301; CHECK: declare void @objc_storeStrong(i8**, i8*) 302; CHECK: declare i8* @objc_storeWeak(i8**, i8*) 303; CHECK: declare i8* @objc_unsafeClaimAutoreleasedReturnValue(i8*) 304; CHECK: declare i8* @objc_retainedObject(i8*) 305; CHECK: declare i8* @objc_unretainedObject(i8*) 306; CHECK: declare i8* @objc_unretainedPointer(i8*) 307; CHECK: declare i8* @objc_retain_autorelease(i8*) 308; CHECK: declare i32 @objc_sync_enter(i8*) 309; CHECK: declare i32 @objc_sync_exit(i8*) 310 311; CHECK: attributes #0 = { nounwind } 312; CHECK: attributes [[NLB]] = { nonlazybind } 313