diff options
author | Pete Cooper <peter_cooper@apple.com> | 2018-12-18 20:32:49 +0000 |
---|---|---|
committer | Pete Cooper <peter_cooper@apple.com> | 2018-12-18 20:32:49 +0000 |
commit | be4f5711073613115c036206db0d9a45fd0632ab (patch) | |
tree | c6abfb8491cb76ee11f26515ef05293f4b9eaf67 /llvm/test/Transforms/ObjCARC/nested.ll | |
parent | 36a03526e99cc8861bb2fefc3d1336a2e3d894cf (diff) | |
download | bcm5719-llvm-be4f5711073613115c036206db0d9a45fd0632ab.tar.gz bcm5719-llvm-be4f5711073613115c036206db0d9a45fd0632ab.zip |
Change the objc ARC optimizer to use the new objc.* intrinsics
We're moving ARC optimisation and ARC emission in clang away from runtime methods
and towards intrinsics. This is the part which actually uses the intrinsics in the ARC
optimizer when both analyzing the existing calls and emitting new ones.
Differential Revision: https://reviews.llvm.org/D55348
Reviewers: ahatanak
llvm-svn: 349534
Diffstat (limited to 'llvm/test/Transforms/ObjCARC/nested.ll')
-rw-r--r-- | llvm/test/Transforms/ObjCARC/nested.ll | 262 |
1 files changed, 131 insertions, 131 deletions
diff --git a/llvm/test/Transforms/ObjCARC/nested.ll b/llvm/test/Transforms/ObjCARC/nested.ll index b317cd80295..8b7e673e11a 100644 --- a/llvm/test/Transforms/ObjCARC/nested.ll +++ b/llvm/test/Transforms/ObjCARC/nested.ll @@ -9,16 +9,16 @@ declare void @callee() declare i8* @returner() -declare i8* @objc_retainAutoreleasedReturnValue(i8*) -declare i8* @objc_retain(i8*) -declare void @objc_enumerationMutation(i8*) +declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*) +declare i8* @llvm.objc.retain(i8*) +declare void @llvm.objc.enumerationMutation(i8*) declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind -declare i8* @objc_msgSend(i8*, i8*, ...) nonlazybind +declare i8* @llvm.objc.msgSend(i8*, i8*, ...) nonlazybind declare void @use(i8*) -declare void @objc_release(i8*) +declare void @llvm.objc.release(i8*) declare i8* @def() declare void @__crasher_block_invoke(i8* nocapture) -declare i8* @objc_retainBlock(i8*) +declare i8* @llvm.objc.retainBlock(i8*) declare void @__crasher_block_invoke1(i8* nocapture) !0 = !{} @@ -26,19 +26,19 @@ declare void @__crasher_block_invoke1(i8* nocapture) ; Delete a nested retain+release pair. ; CHECK-LABEL: define void @test0( -; CHECK: call i8* @objc_retain -; CHECK-NOT: @objc_retain +; CHECK: call i8* @llvm.objc.retain +; CHECK-NOT: @llvm.objc.retain ; CHECK: } define void @test0(i8* %a) nounwind { entry: %state.ptr = alloca %struct.__objcFastEnumerationState, align 8 %items.ptr = alloca [16 x i8*], align 8 - %0 = call i8* @objc_retain(i8* %a) nounwind + %0 = call i8* @llvm.objc.retain(i8* %a) nounwind %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8* call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false) - %1 = call i8* @objc_retain(i8* %0) nounwind + %1 = call i8* @llvm.objc.retain(i8* %0) nounwind %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %iszero = icmp eq i64 %call, 0 br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit @@ -63,7 +63,7 @@ forcoll.loopbody: br i1 %2, label %forcoll.notmutated, label %forcoll.mutated forcoll.mutated: - call void @objc_enumerationMutation(i8* %1) + call void @llvm.objc.enumerationMutation(i8* %1) br label %forcoll.notmutated forcoll.notmutated: @@ -77,33 +77,33 @@ forcoll.notmutated: forcoll.refetch: %tmp5 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call6 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp5, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call6 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp5, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %5 = icmp eq i64 %call6, 0 br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer forcoll.empty: - call void @objc_release(i8* %1) nounwind - call void @objc_release(i8* %0) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %1) nounwind + call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0 ret void } ; Delete a nested retain+release pair. ; CHECK-LABEL: define void @test2( -; CHECK: call i8* @objc_retain -; CHECK-NOT: @objc_retain +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK-NOT: @llvm.objc.retain ; CHECK: } define void @test2() nounwind { entry: %state.ptr = alloca %struct.__objcFastEnumerationState, align 8 %items.ptr = alloca [16 x i8*], align 8 %call = call i8* @returner() - %0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call) nounwind + %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8* call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false) - %1 = call i8* @objc_retain(i8* %0) nounwind + %1 = call i8* @llvm.objc.retain(i8* %0) nounwind %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %iszero = icmp eq i64 %call3, 0 br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit @@ -128,7 +128,7 @@ forcoll.loopbody: br i1 %2, label %forcoll.notmutated, label %forcoll.mutated forcoll.mutated: - call void @objc_enumerationMutation(i8* %1) + call void @llvm.objc.enumerationMutation(i8* %1) br label %forcoll.notmutated forcoll.notmutated: @@ -142,33 +142,33 @@ forcoll.notmutated: forcoll.refetch: %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %5 = icmp eq i64 %call7, 0 br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer forcoll.empty: - call void @objc_release(i8* %1) nounwind - call void @objc_release(i8* %0) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %1) nounwind + call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0 ret void } ; Delete a nested retain+release pair. ; CHECK-LABEL: define void @test4( -; CHECK: call i8* @objc_retain -; CHECK-NOT: @objc_retain +; CHECK: call i8* @llvm.objc.retain +; CHECK-NOT: @llvm.objc.retain ; CHECK: } define void @test4() nounwind { entry: %state.ptr = alloca %struct.__objcFastEnumerationState, align 8 %items.ptr = alloca [16 x i8*], align 8 %tmp = load i8*, i8** @g, align 8 - %0 = call i8* @objc_retain(i8* %tmp) nounwind + %0 = call i8* @llvm.objc.retain(i8* %tmp) nounwind %tmp2 = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8* call void @llvm.memset.p0i8.i64(i8* align 8 %tmp2, i8 0, i64 64, i1 false) - %1 = call i8* @objc_retain(i8* %0) nounwind + %1 = call i8* @llvm.objc.retain(i8* %0) nounwind %tmp4 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp4, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp4, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %iszero = icmp eq i64 %call, 0 br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit @@ -193,7 +193,7 @@ forcoll.loopbody: br i1 %2, label %forcoll.notmutated, label %forcoll.mutated forcoll.mutated: - call void @objc_enumerationMutation(i8* %1) + call void @llvm.objc.enumerationMutation(i8* %1) br label %forcoll.notmutated forcoll.notmutated: @@ -207,33 +207,33 @@ forcoll.notmutated: forcoll.refetch: %tmp7 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call8 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp7, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call8 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp7, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %5 = icmp eq i64 %call8, 0 br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer forcoll.empty: - call void @objc_release(i8* %1) nounwind - call void @objc_release(i8* %0) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %1) nounwind + call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0 ret void } ; Delete a nested retain+release pair. ; CHECK-LABEL: define void @test5( -; CHECK: call i8* @objc_retain -; CHECK-NOT: @objc_retain +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK-NOT: @llvm.objc.retain ; CHECK: } define void @test5() nounwind { entry: %state.ptr = alloca %struct.__objcFastEnumerationState, align 8 %items.ptr = alloca [16 x i8*], align 8 %call = call i8* @returner() - %0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call) nounwind + %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8* call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false) - %1 = call i8* @objc_retain(i8* %0) nounwind + %1 = call i8* @llvm.objc.retain(i8* %0) nounwind %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %iszero = icmp eq i64 %call3, 0 br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit @@ -258,7 +258,7 @@ forcoll.loopbody: br i1 %2, label %forcoll.notmutated, label %forcoll.mutated forcoll.mutated: - call void @objc_enumerationMutation(i8* %1) + call void @llvm.objc.enumerationMutation(i8* %1) br label %forcoll.notmutated forcoll.notmutated: @@ -272,13 +272,13 @@ forcoll.notmutated: forcoll.refetch: %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %5 = icmp eq i64 %call7, 0 br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer forcoll.empty: - call void @objc_release(i8* %1) nounwind - call void @objc_release(i8* %0) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %1) nounwind + call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0 ret void } @@ -286,20 +286,20 @@ forcoll.empty: ; use. ; ; CHECK-LABEL: define void @test6( -; CHECK: call i8* @objc_retain -; CHECK-NOT: @objc_retain +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK-NOT: @llvm.objc.retain ; CHECK: } define void @test6() nounwind { entry: %state.ptr = alloca %struct.__objcFastEnumerationState, align 8 %items.ptr = alloca [16 x i8*], align 8 %call = call i8* @returner() - %0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call) nounwind + %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8* call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false) - %1 = call i8* @objc_retain(i8* %0) nounwind + %1 = call i8* @llvm.objc.retain(i8* %0) nounwind %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %iszero = icmp eq i64 %call3, 0 br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit @@ -324,7 +324,7 @@ forcoll.loopbody: br i1 %2, label %forcoll.notmutated, label %forcoll.mutated forcoll.mutated: - call void @objc_enumerationMutation(i8* %1) + call void @llvm.objc.enumerationMutation(i8* %1) br label %forcoll.notmutated forcoll.notmutated: @@ -338,14 +338,14 @@ forcoll.notmutated: forcoll.refetch: %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %5 = icmp eq i64 %call7, 0 br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer forcoll.empty: - call void @objc_release(i8* %1) nounwind + call void @llvm.objc.release(i8* %1) nounwind call void @callee() - call void @objc_release(i8* %0) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0 ret void } @@ -354,21 +354,21 @@ forcoll.empty: ; reasnoning about nesting. ; CHECK-LABEL: define void @test7( -; CHECK: call i8* @objc_retain -; CHECK: @objc_retain +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK: @llvm.objc.retain ; CHECK: } define void @test7() nounwind { entry: %state.ptr = alloca %struct.__objcFastEnumerationState, align 8 %items.ptr = alloca [16 x i8*], align 8 %call = call i8* @returner() - %0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call) nounwind + %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind call void @callee() %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8* call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false) - %1 = call i8* @objc_retain(i8* %0) nounwind + %1 = call i8* @llvm.objc.retain(i8* %0) nounwind %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %iszero = icmp eq i64 %call3, 0 br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit @@ -393,7 +393,7 @@ forcoll.loopbody: br i1 %2, label %forcoll.notmutated, label %forcoll.mutated forcoll.mutated: - call void @objc_enumerationMutation(i8* %1) + call void @llvm.objc.enumerationMutation(i8* %1) br label %forcoll.notmutated forcoll.notmutated: @@ -407,34 +407,34 @@ forcoll.notmutated: forcoll.refetch: %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %5 = icmp eq i64 %call7, 0 br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer forcoll.empty: - call void @objc_release(i8* %1) nounwind + call void @llvm.objc.release(i8* %1) nounwind call void @callee() - call void @objc_release(i8* %0) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0 ret void } ; Delete a nested retain+release pair. ; CHECK-LABEL: define void @test8( -; CHECK: call i8* @objc_retain -; CHECK-NOT: @objc_retain +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK-NOT: @llvm.objc.retain ; CHECK: } define void @test8() nounwind { entry: %state.ptr = alloca %struct.__objcFastEnumerationState, align 8 %items.ptr = alloca [16 x i8*], align 8 %call = call i8* @returner() - %0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call) nounwind + %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8* call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false) - %1 = call i8* @objc_retain(i8* %0) nounwind + %1 = call i8* @llvm.objc.retain(i8* %0) nounwind %tmp2 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call3 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp2, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %iszero = icmp eq i64 %call3, 0 br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit @@ -459,7 +459,7 @@ forcoll.loopbody: br i1 %2, label %forcoll.notmutated, label %forcoll.mutated forcoll.mutated: - call void @objc_enumerationMutation(i8* %1) + call void @llvm.objc.enumerationMutation(i8* %1) br label %forcoll.notmutated forcoll.notmutated: @@ -480,13 +480,13 @@ forcoll.next: forcoll.refetch: %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %1, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %5 = icmp eq i64 %call7, 0 br i1 %5, label %forcoll.empty, label %forcoll.loopbody.outer forcoll.empty: - call void @objc_release(i8* %1) nounwind - call void @objc_release(i8* %0) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %1) nounwind + call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0 ret void } @@ -495,23 +495,23 @@ forcoll.empty: ; See test9b for the same testcase without a split backedge. ; CHECK-LABEL: define void @test9( -; CHECK: call i8* @objc_retain -; CHECK: call i8* @objc_retain -; CHECK: call i8* @objc_retain +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK: call i8* @llvm.objc.retain ; CHECK: } define void @test9() nounwind { entry: %state.ptr = alloca %struct.__objcFastEnumerationState, align 8 %items.ptr = alloca [16 x i8*], align 8 %call = call i8* @returner() - %0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call) nounwind + %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind %call1 = call i8* @returner() - %1 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call1) nounwind + %1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1) nounwind %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8* call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false) - %2 = call i8* @objc_retain(i8* %0) nounwind + %2 = call i8* @llvm.objc.retain(i8* %0) nounwind %tmp3 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call4 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp3, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call4 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp3, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %iszero = icmp eq i64 %call4, 0 br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit @@ -535,7 +535,7 @@ forcoll.loopbody: br i1 %3, label %forcoll.notmutated, label %forcoll.mutated forcoll.mutated: - call void @objc_enumerationMutation(i8* %2) + call void @llvm.objc.enumerationMutation(i8* %2) br label %forcoll.notmutated forcoll.notmutated: @@ -548,37 +548,37 @@ forcoll.notmutated.forcoll.loopbody_crit_edge: forcoll.refetch: %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %4 = icmp eq i64 %call7, 0 br i1 %4, label %forcoll.empty, label %forcoll.loopbody.outer forcoll.empty: - call void @objc_release(i8* %2) nounwind - call void @objc_release(i8* %1) nounwind, !clang.imprecise_release !0 - call void @objc_release(i8* %0) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %2) nounwind + call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0 ret void } ; Like test9, but without a split backedge. TODO: optimize this. ; CHECK-LABEL: define void @test9b( -; CHECK: call i8* @objc_retain -; CHECK: call i8* @objc_retain -; CHECK: @objc_retain +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK: @llvm.objc.retain ; CHECK: } define void @test9b() nounwind { entry: %state.ptr = alloca %struct.__objcFastEnumerationState, align 8 %items.ptr = alloca [16 x i8*], align 8 %call = call i8* @returner() - %0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call) nounwind + %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind %call1 = call i8* @returner() - %1 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call1) nounwind + %1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1) nounwind %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8* call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false) - %2 = call i8* @objc_retain(i8* %0) nounwind + %2 = call i8* @llvm.objc.retain(i8* %0) nounwind %tmp3 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call4 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp3, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call4 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp3, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %iszero = icmp eq i64 %call4, 0 br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit @@ -602,7 +602,7 @@ forcoll.loopbody: br i1 %3, label %forcoll.notmutated, label %forcoll.mutated forcoll.mutated: - call void @objc_enumerationMutation(i8* %2) + call void @llvm.objc.enumerationMutation(i8* %2) br label %forcoll.notmutated forcoll.notmutated: @@ -612,14 +612,14 @@ forcoll.notmutated: forcoll.refetch: %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %4 = icmp eq i64 %call7, 0 br i1 %4, label %forcoll.empty, label %forcoll.loopbody.outer forcoll.empty: - call void @objc_release(i8* %2) nounwind - call void @objc_release(i8* %1) nounwind, !clang.imprecise_release !0 - call void @objc_release(i8* %0) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %2) nounwind + call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0 ret void } @@ -628,24 +628,24 @@ forcoll.empty: ; See test10b for the same testcase without a split backedge. ; CHECK-LABEL: define void @test10( -; CHECK: call i8* @objc_retain -; CHECK: call i8* @objc_retain -; CHECK: call i8* @objc_retain +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK: call i8* @llvm.objc.retain ; CHECK: } define void @test10() nounwind { entry: %state.ptr = alloca %struct.__objcFastEnumerationState, align 8 %items.ptr = alloca [16 x i8*], align 8 %call = call i8* @returner() - %0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call) nounwind + %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind %call1 = call i8* @returner() - %1 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call1) nounwind + %1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1) nounwind call void @callee() %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8* call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false) - %2 = call i8* @objc_retain(i8* %0) nounwind + %2 = call i8* @llvm.objc.retain(i8* %0) nounwind %tmp3 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call4 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp3, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call4 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp3, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %iszero = icmp eq i64 %call4, 0 br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit @@ -669,7 +669,7 @@ forcoll.loopbody: br i1 %3, label %forcoll.notmutated, label %forcoll.mutated forcoll.mutated: - call void @objc_enumerationMutation(i8* %2) + call void @llvm.objc.enumerationMutation(i8* %2) br label %forcoll.notmutated forcoll.notmutated: @@ -682,38 +682,38 @@ forcoll.notmutated.forcoll.loopbody_crit_edge: forcoll.refetch: %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %4 = icmp eq i64 %call7, 0 br i1 %4, label %forcoll.empty, label %forcoll.loopbody.outer forcoll.empty: - call void @objc_release(i8* %2) nounwind - call void @objc_release(i8* %1) nounwind, !clang.imprecise_release !0 - call void @objc_release(i8* %0) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %2) nounwind + call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0 ret void } ; Like test10, but without a split backedge. TODO: optimize this. ; CHECK-LABEL: define void @test10b( -; CHECK: call i8* @objc_retain -; CHECK: call i8* @objc_retain -; CHECK: @objc_retain +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue +; CHECK: @llvm.objc.retain ; CHECK: } define void @test10b() nounwind { entry: %state.ptr = alloca %struct.__objcFastEnumerationState, align 8 %items.ptr = alloca [16 x i8*], align 8 %call = call i8* @returner() - %0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call) nounwind + %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call) nounwind %call1 = call i8* @returner() - %1 = call i8* @objc_retainAutoreleasedReturnValue(i8* %call1) nounwind + %1 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %call1) nounwind call void @callee() %tmp = bitcast %struct.__objcFastEnumerationState* %state.ptr to i8* call void @llvm.memset.p0i8.i64(i8* align 8 %tmp, i8 0, i64 64, i1 false) - %2 = call i8* @objc_retain(i8* %0) nounwind + %2 = call i8* @llvm.objc.retain(i8* %0) nounwind %tmp3 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call4 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp3, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call4 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp3, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %iszero = icmp eq i64 %call4, 0 br i1 %iszero, label %forcoll.empty, label %forcoll.loopinit @@ -737,7 +737,7 @@ forcoll.loopbody: br i1 %3, label %forcoll.notmutated, label %forcoll.mutated forcoll.mutated: - call void @objc_enumerationMutation(i8* %2) + call void @llvm.objc.enumerationMutation(i8* %2) br label %forcoll.notmutated forcoll.notmutated: @@ -747,14 +747,14 @@ forcoll.notmutated: forcoll.refetch: %tmp6 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8 - %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) + %call7 = call i64 bitcast (i8* (i8*, i8*, ...)* @llvm.objc.msgSend to i64 (i8*, i8*, %struct.__objcFastEnumerationState*, [16 x i8*]*, i64)*)(i8* %2, i8* %tmp6, %struct.__objcFastEnumerationState* %state.ptr, [16 x i8*]* %items.ptr, i64 16) %4 = icmp eq i64 %call7, 0 br i1 %4, label %forcoll.empty, label %forcoll.loopbody.outer forcoll.empty: - call void @objc_release(i8* %2) nounwind - call void @objc_release(i8* %1) nounwind, !clang.imprecise_release !0 - call void @objc_release(i8* %0) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %2) nounwind + call void @llvm.objc.release(i8* %1) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %0) nounwind, !clang.imprecise_release !0 ret void } @@ -768,9 +768,9 @@ forcoll.empty: @__block_d_tmp5 = external hidden constant { i64, i64, i8*, i8*, i8*, i8* } ; CHECK-LABEL: define void @test11( -; CHECK: tail call i8* @objc_retain(i8* %call) [[NUW:#[0-9]+]] -; CHECK: tail call i8* @objc_retain(i8* %call) [[NUW]] -; CHECK: call void @objc_release(i8* %call) [[NUW]], !clang.imprecise_release !0 +; CHECK: tail call i8* @llvm.objc.retain(i8* %call) [[NUW:#[0-9]+]] +; CHECK: tail call i8* @llvm.objc.retain(i8* %call) [[NUW]] +; CHECK: call void @llvm.objc.release(i8* %call) [[NUW]], !clang.imprecise_release !0 ; CHECK: } define void @test11() { entry: @@ -788,14 +788,14 @@ entry: store i8* bitcast (void (i8*)* @__crasher_block_invoke to i8*), i8** %block.invoke, align 8 %block.d = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block, i64 0, i32 4 store %struct.__block_d* bitcast ({ i64, i64, i8*, i8*, i8*, i8* }* @__block_d_tmp to %struct.__block_d*), %struct.__block_d** %block.d, align 8 - %foo2 = tail call i8* @objc_retain(i8* %call) nounwind + %foo2 = tail call i8* @llvm.objc.retain(i8* %call) nounwind store i8* %foo2, i8** %foo, align 8 %foo4 = bitcast <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block to i8* - %foo5 = call i8* @objc_retainBlock(i8* %foo4) nounwind + %foo5 = call i8* @llvm.objc.retainBlock(i8* %foo4) nounwind call void @use(i8* %foo5), !clang.arc.no_objc_arc_exceptions !0 - call void @objc_release(i8* %foo5) nounwind + call void @llvm.objc.release(i8* %foo5) nounwind %strongdestroy = load i8*, i8** %foo, align 8 - call void @objc_release(i8* %strongdestroy) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %strongdestroy) nounwind, !clang.imprecise_release !0 %foo10 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block9, i64 0, i32 5 %block.isa11 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block9, i64 0, i32 0 store i8* bitcast (i8** @_NSConcreteStackBlock to i8*), i8** %block.isa11, align 8 @@ -807,19 +807,19 @@ entry: store i8* bitcast (void (i8*)* @__crasher_block_invoke1 to i8*), i8** %block.invoke14, align 8 %block.d15 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>, <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block9, i64 0, i32 4 store %struct.__block_d* bitcast ({ i64, i64, i8*, i8*, i8*, i8* }* @__block_d_tmp5 to %struct.__block_d*), %struct.__block_d** %block.d15, align 8 - %foo18 = call i8* @objc_retain(i8* %call) nounwind + %foo18 = call i8* @llvm.objc.retain(i8* %call) nounwind store i8* %call, i8** %foo10, align 8 %foo20 = bitcast <{ i8*, i32, i32, i8*, %struct.__block_d*, i8* }>* %block9 to i8* - %foo21 = call i8* @objc_retainBlock(i8* %foo20) nounwind + %foo21 = call i8* @llvm.objc.retainBlock(i8* %foo20) nounwind call void @use(i8* %foo21), !clang.arc.no_objc_arc_exceptions !0 - call void @objc_release(i8* %foo21) nounwind + call void @llvm.objc.release(i8* %foo21) nounwind %strongdestroy25 = load i8*, i8** %foo10, align 8 - call void @objc_release(i8* %strongdestroy25) nounwind, !clang.imprecise_release !0 - call void @objc_release(i8* %call) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %strongdestroy25) nounwind, !clang.imprecise_release !0 + call void @llvm.objc.release(i8* %call) nounwind, !clang.imprecise_release !0 ret void } -; CHECK: attributes #0 = { argmemonly nounwind } -; CHECK: attributes #1 = { nonlazybind } ; CHECK: attributes [[NUW]] = { nounwind } +; CHECK: attributes #1 = { argmemonly nounwind } +; CHECK: attributes #2 = { nonlazybind } |