1 ; RUN: opt -S -objc-arc < %s | FileCheck %s 2 3 declare i8* @objc_retain(i8*) 4 declare void @objc_release(i8*) 5 declare i8* @objc_msgSend(i8*, i8*, ...) 6 declare void @use_pointer(i8*) 7 declare void @callee() 8 9 ; ARCOpt shouldn't try to move the releases to the block containing the invoke. 10 11 ; CHECK: define void @test0( 12 ; CHECK: invoke.cont: 13 ; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 14 ; CHECK: ret void 15 ; CHECK: lpad: 16 ; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 17 ; CHECK: ret void 18 define void @test0(i8* %zipFile) { 19 entry: 20 call i8* @objc_retain(i8* %zipFile) nounwind 21 call void @use_pointer(i8* %zipFile) 22 invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*)*)(i8* %zipFile) 23 to label %invoke.cont unwind label %lpad 24 25 invoke.cont: ; preds = %entry 26 call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 27 ret void 28 29 lpad: ; preds = %entry 30 %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 31 cleanup 32 call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 33 ret void 34 } 35 36 ; ARCOpt should move the release before the callee calls. 37 38 ; CHECK: define void @test1( 39 ; CHECK: invoke.cont: 40 ; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 41 ; CHECK: call void @callee() 42 ; CHECK: br label %done 43 ; CHECK: lpad: 44 ; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 45 ; CHECK: call void @callee() 46 ; CHECK: br label %done 47 ; CHECK: done: 48 ; CHECK-NEXT: ret void 49 define void @test1(i8* %zipFile) { 50 entry: 51 call i8* @objc_retain(i8* %zipFile) nounwind 52 call void @use_pointer(i8* %zipFile) 53 invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*)*)(i8* %zipFile) 54 to label %invoke.cont unwind label %lpad 55 56 invoke.cont: ; preds = %entry 57 call void @callee() 58 br label %done 59 60 lpad: ; preds = %entry 61 %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0 62 cleanup 63 call void @callee() 64 br label %done 65 66 done: 67 call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 68 ret void 69 } 70 71 declare i32 @__gxx_personality_v0(...) 72 73 !0 = metadata !{} 74