1; RUN: opt -S -objc-arc < %s | FileCheck %s 2 3declare i8* @objc_retain(i8*) 4declare void @objc_release(i8*) 5declare i8* @objc_msgSend(i8*, i8*, ...) 6declare void @use_pointer(i8*) 7declare 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 18define void @test0(i8* %zipFile) { 19entry: 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 25invoke.cont: ; preds = %entry 26 call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 27 ret void 28 29lpad: ; preds = %entry 30 call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 31 ret void 32} 33 34; ARCOpt should move the release before the callee calls. 35 36; CHECK: define void @test1( 37; CHECK: invoke.cont: 38; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 39; CHECK: call void @callee() 40; CHECK: br label %done 41; CHECK: lpad: 42; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 43; CHECK: call void @callee() 44; CHECK: br label %done 45; CHECK: done: 46; CHECK-NEXT: ret void 47define void @test1(i8* %zipFile) { 48entry: 49 call i8* @objc_retain(i8* %zipFile) nounwind 50 call void @use_pointer(i8* %zipFile) 51 invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*)*)(i8* %zipFile) 52 to label %invoke.cont unwind label %lpad 53 54invoke.cont: ; preds = %entry 55 call void @callee() 56 br label %done 57 58lpad: ; preds = %entry 59 call void @callee() 60 br label %done 61 62done: 63 call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 64 ret void 65} 66 67!0 = metadata !{} 68