1 ; RUN: opt -S -objc-arc < %s | FileCheck %s 2 3 target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" 4 target triple = "i686--windows-msvc" 5 6 declare i8* @f(i8*, i8*) 7 8 declare i32 @__CxxFrameHandler3(...) 9 10 declare dllimport i8* @objc_autoreleaseReturnValue(i8* returned) 11 declare dllimport i8* @objc_retain(i8* returned) 12 declare dllimport i8* @objc_retainAutoreleasedReturnValue(i8* returned) 13 declare dllimport void @objc_release(i8*) 14 15 define i8* @g(i8* %p, i8* %q) local_unnamed_addr personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { 16 entry: 17 %0 = tail call i8* @objc_retain(i8* %p) #0 18 %1 = tail call i8* @objc_retain(i8* %q) #0 19 %call = invoke i8* @f(i8* %p, i8* %q) 20 to label %invoke.cont unwind label %catch.dispatch, !clang.arc.no_objc_arc_exceptions !0 21 22 catch.dispatch: 23 %2 = catchswitch within none [label %catch] unwind to caller 24 25 catch: 26 %3 = catchpad within %2 [i8* null, i32 64, i8* null] 27 catchret from %3 to label %cleanup 28 29 invoke.cont: 30 %4 = tail call i8* @objc_retainAutoreleasedReturnValue(i8* %call) #0 31 br label %cleanup 32 33 cleanup: 34 %retval.0 = phi i8* [ %call, %invoke.cont ], [ null, %catch ] 35 tail call void @objc_release(i8* %q) #0, !clang.imprecise_release !0 36 tail call void @objc_release(i8* %p) #0, !clang.imprecise_release !0 37 %5 = tail call i8* @objc_autoreleaseReturnValue(i8* %retval.0) #0 38 ret i8* %retval.0 39 } 40 41 ; CHECK-LABEL: entry: 42 ; CHECK-NEXT: %0 = tail call i8* @objc_retain(i8* %p) #0 43 ; CHECK-NEXT: %call = invoke i8* @f(i8* %p, i8* %q) 44 ; CHECK-NEXT: to label %invoke.cont unwind label %catch.dispatch 45 46 ; CHECK-LABEL: catch.dispatch: 47 ; CHECK-NEXT: %1 = catchswitch within none [label %catch] unwind to caller 48 49 ; CHECK-LABEL: cleanup: 50 ; CHECK: tail call void @objc_release(i8* %p) #0 51 52 attributes #0 = { nounwind } 53 54 !0 = !{} 55