brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 9d551d9 Raw
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