70 lines · plain
1; RUN: opt -S -passes=objc-arc,objc-arc-contract < %s | FileCheck %s2 3target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"4declare ptr @llvm.objc.unretainedObject(ptr)5declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr)6declare ptr @llvm.objc.autoreleaseReturnValue(ptr)7declare ptr @objc_msgSend(ptr, ptr, ...)8declare void @llvm.objc.release(ptr)9 10; Test that the optimizer can create an objc_retainAutoreleaseReturnValue11; declaration even if no objc_retain declaration exists.12; rdar://940130313 14; CHECK: define ptr @test0(ptr %p) {15; CHECK-NEXT: entry:16; CHECK-NEXT: %0 = tail call ptr @llvm.objc.retainAutoreleaseReturnValue(ptr %p) [[NUW:#[0-9]+]]17; CHECK-NEXT: ret ptr %018; CHECK-NEXT: }19 20define ptr @test0(ptr %p) {21entry:22 %call = tail call ptr @llvm.objc.unretainedObject(ptr %p)23 %0 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call) nounwind24 %1 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %call) nounwind25 ret ptr %call26}27 28; Properly create the @llvm.objc.retain declaration when it doesn't already exist.29; rdar://982511430 31; CHECK-LABEL: @test1(32; CHECK: @llvm.objc.retain33; CHECK: @llvm.objc.retainAutoreleasedReturnValue(34; CHECK: @llvm.objc.release35; CHECK: @llvm.objc.release36; CHECK: }37define void @test1(ptr %call88) nounwind personality ptr @__gxx_personality_v0 {38entry:39 %tmp1 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call88) nounwind40 %call94 = invoke ptr @objc_msgSend(ptr %tmp1)41 to label %invoke.cont93 unwind label %lpad9142 43invoke.cont93: ; preds = %entry44 %tmp2 = call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %call94) nounwind45 call void @llvm.objc.release(ptr %tmp1) nounwind46 invoke void @objc_msgSend(ptr %tmp2)47 to label %invoke.cont102 unwind label %lpad10048 49invoke.cont102: ; preds = %invoke.cont9350 call void @llvm.objc.release(ptr %tmp2) nounwind, !clang.imprecise_release !051 unreachable52 53lpad91: ; preds = %entry54 %exn91 = landingpad {ptr, i32}55 cleanup56 unreachable57 58lpad100: ; preds = %invoke.cont9359 %exn100 = landingpad {ptr, i32}60 cleanup61 call void @llvm.objc.release(ptr %tmp2) nounwind, !clang.imprecise_release !062 unreachable63}64 65declare i32 @__gxx_personality_v0(...)66 67!0 = !{}68 69; CHECK: attributes [[NUW]] = { nounwind }70