51 lines · plain
1; RUN: opt -S -passes=objc-arc < %s | FileCheck %s2 3; Handle a retain+release pair entirely contained within a split loop backedge.4; rdar://112562395 6; CHECK-LABEL: define void @test0(7; CHECK: call ptr @llvm.objc.retain(ptr %call) [[NUW:#[0-9]+]]8; CHECK: call ptr @llvm.objc.retain(ptr %call) [[NUW]]9; CHECK: call ptr @llvm.objc.retain(ptr %cond) [[NUW]]10; CHECK: call void @llvm.objc.release(ptr %call) [[NUW]]11; CHECK: call void @llvm.objc.release(ptr %call) [[NUW]]12; CHECK: call void @llvm.objc.release(ptr %cond) [[NUW]]13define void @test0() personality ptr @__objc_personality_v0 {14entry:15 br label %while.body16 17while.body: ; preds = %while.cond18 %call = invoke ptr @returner()19 to label %invoke.cont unwind label %lpad, !clang.arc.no_objc_arc_exceptions !020 21invoke.cont: ; preds = %while.body22 %t0 = call ptr @llvm.objc.retain(ptr %call) nounwind23 %t1 = call ptr @llvm.objc.retain(ptr %call) nounwind24 %call.i1 = invoke ptr @returner()25 to label %invoke.cont1 unwind label %lpad26 27invoke.cont1: ; preds = %invoke.cont28 %cond = select i1 undef, ptr null, ptr %call29 %t2 = call ptr @llvm.objc.retain(ptr %cond) nounwind30 call void @llvm.objc.release(ptr %call) nounwind31 call void @llvm.objc.release(ptr %call) nounwind32 call void @use_pointer(ptr %cond)33 call void @llvm.objc.release(ptr %cond) nounwind34 br label %while.body35 36lpad: ; preds = %invoke.cont, %while.body37 %t4 = landingpad { ptr, i32 }38 catch ptr null39 ret void40}41 42declare ptr @returner()43declare i32 @__objc_personality_v0(...)44declare void @llvm.objc.release(ptr)45declare ptr @llvm.objc.retain(ptr)46declare void @use_pointer(ptr)47 48!0 = !{}49 50; CHECK: attributes [[NUW]] = { nounwind }51