This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG874b0a0b9db9: [CodeGen] Mark calls to objc_autorelease as
tail (authored by ahatanak).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D91111/new/
https://reviews.llvm.org/D91111
Files:
clang/lib/CodeGen/CGObjC.cpp
clang/test/CodeGenObjC/convert-messages-to-runtime-calls.m
Index: clang/test/CodeGenObjC/convert-messages-to-runtime-calls.m
===================================================================
--- clang/test/CodeGenObjC/convert-messages-to-runtime-calls.m
+++ clang/test/CodeGenObjC/convert-messages-to-runtime-calls.m
@@ -30,7 +30,7 @@
// CALLS: {{call.*@objc_allocWithZone}}
// CALLS: {{call.*@objc_retain}}
// CALLS: {{call.*@objc_release}}
- // CALLS: {{call.*@objc_autorelease}}
+ // CALLS: {{tail call.*@objc_autorelease}}
[NSObject alloc];
[NSObject allocWithZone:nil];
[x retain];
@@ -121,7 +121,7 @@
// call will return i8* which we have to cast to A*
// CHECK-LABEL: define {{.*}}void @test_autorelease_class_ptr
A* test_autorelease_class_ptr(B *b) {
- // CALLS: {{call.*@objc_autorelease}}
+ // CALLS: {{tail call.*@objc_autorelease}}
// CALLS-NEXT: bitcast i8*
// CALLS-NEXT: ret
return [b autorelease];
Index: clang/lib/CodeGen/CGObjC.cpp
===================================================================
--- clang/lib/CodeGen/CGObjC.cpp
+++ clang/lib/CodeGen/CGObjC.cpp
@@ -2221,6 +2221,12 @@
// Call the function.
llvm::CallBase *Inst = CGF.EmitCallOrInvoke(fn, value);
+ // Mark calls to objc_autorelease as tail on the assumption that methods
+ // overriding autorelease do not touch anything on the stack.
+ if (fnName == "objc_autorelease")
+ if (auto *Call = dyn_cast<llvm::CallInst>(Inst))
+ Call->setTailCall();
+
// Cast the result back to the original type.
return CGF.Builder.CreateBitCast(Inst, origType);
}
Index: clang/test/CodeGenObjC/convert-messages-to-runtime-calls.m
===================================================================
--- clang/test/CodeGenObjC/convert-messages-to-runtime-calls.m
+++ clang/test/CodeGenObjC/convert-messages-to-runtime-calls.m
@@ -30,7 +30,7 @@
// CALLS: {{call.*@objc_allocWithZone}}
// CALLS: {{call.*@objc_retain}}
// CALLS: {{call.*@objc_release}}
- // CALLS: {{call.*@objc_autorelease}}
+ // CALLS: {{tail call.*@objc_autorelease}}
[NSObject alloc];
[NSObject allocWithZone:nil];
[x retain];
@@ -121,7 +121,7 @@
// call will return i8* which we have to cast to A*
// CHECK-LABEL: define {{.*}}void @test_autorelease_class_ptr
A* test_autorelease_class_ptr(B *b) {
- // CALLS: {{call.*@objc_autorelease}}
+ // CALLS: {{tail call.*@objc_autorelease}}
// CALLS-NEXT: bitcast i8*
// CALLS-NEXT: ret
return [b autorelease];
Index: clang/lib/CodeGen/CGObjC.cpp
===================================================================
--- clang/lib/CodeGen/CGObjC.cpp
+++ clang/lib/CodeGen/CGObjC.cpp
@@ -2221,6 +2221,12 @@
// Call the function.
llvm::CallBase *Inst = CGF.EmitCallOrInvoke(fn, value);
+ // Mark calls to objc_autorelease as tail on the assumption that methods
+ // overriding autorelease do not touch anything on the stack.
+ if (fnName == "objc_autorelease")
+ if (auto *Call = dyn_cast<llvm::CallInst>(Inst))
+ Call->setTailCall();
+
// Cast the result back to the original type.
return CGF.Builder.CreateBitCast(Inst, origType);
}
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits