aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/InlineFunction.cpp
diff options
context:
space:
mode:
authorAkira Hatanaka <ahatanaka@apple.com>2021-02-05 06:00:05 -0800
committerAkira Hatanaka <ahatanaka@apple.com>2021-02-05 06:00:05 -0800
commit2fbbb18c1dbeb124dfc3c2aebae97d4780ff9bd6 (patch)
treea1fbdb9841da1e36f79ff7a0c36dbcef976e29bb /llvm/lib/Transforms/Utils/InlineFunction.cpp
parent3fe3946d9a958b7af6130241996d9cfcecf559d4 (diff)
downloadllvm-2fbbb18c1dbeb124dfc3c2aebae97d4780ff9bd6.zip
llvm-2fbbb18c1dbeb124dfc3c2aebae97d4780ff9bd6.tar.gz
llvm-2fbbb18c1dbeb124dfc3c2aebae97d4780ff9bd6.tar.bz2
Revert "[ObjC][ARC] Use operand bundle 'clang.arc.rv' instead of explicitly"
This reverts commit 3fe3946d9a958b7af6130241996d9cfcecf559d4. The commit violates layering by including a header from Analysis in lib/IR/AutoUpgrade.cpp.
Diffstat (limited to 'llvm/lib/Transforms/Utils/InlineFunction.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/InlineFunction.cpp102
1 files changed, 1 insertions, 101 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp
index 434b11f..3026342 100644
--- a/llvm/lib/Transforms/Utils/InlineFunction.cpp
+++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp
@@ -27,9 +27,8 @@
#include "llvm/Analysis/CaptureTracking.h"
#include "llvm/Analysis/EHPersonalities.h"
#include "llvm/Analysis/InstructionSimplify.h"
-#include "llvm/Analysis/ObjCARCAnalysisUtils.h"
-#include "llvm/Analysis/ObjCARCUtil.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
+#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/Analysis/VectorUtils.h"
#include "llvm/IR/Argument.h"
@@ -62,7 +61,6 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Transforms/Utils/AssumeBundleBuilder.h"
#include "llvm/Transforms/Utils/Cloning.h"
-#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include <algorithm>
#include <cassert>
@@ -1652,98 +1650,6 @@ void llvm::updateProfileCallee(
}
}
-/// An operand bundle "clang.arc.rv" on a call indicates the call result is
-/// implicitly consumed by a call to retainRV or claimRV immediately after the
-/// call. This function inlines the retainRV/claimRV calls.
-///
-/// There are three cases to consider:
-///
-/// 1. If there is a call to autoreleaseRV that takes a pointer to the returned
-/// object in the callee return block, the autoreleaseRV call and the
-/// retainRV/claimRV call in the caller cancel out. If the call in the caller
-/// is a claimRV call, a call to objc_release is emitted.
-///
-/// 2. If there is a call in the callee return block that doesn't have operand
-/// bundle "clang.arc.rv", the operand bundle on the original call is
-/// transferred to the call in the callee.
-///
-/// 3. Otherwise, a call to objc_retain is inserted if the call in the caller is
-/// a retainRV call.
-static void
-inlineRetainOrClaimRVCalls(CallBase &CB,
- const SmallVectorImpl<ReturnInst *> &Returns) {
- Module *Mod = CB.getModule();
- bool IsRetainRV = objcarc::hasRVOpBundle(&CB, true), IsClaimRV = !IsRetainRV;
-
- for (auto *RI : Returns) {
- Value *RetOpnd = objcarc::GetRCIdentityRoot(RI->getOperand(0));
- BasicBlock::reverse_iterator I = ++(RI->getIterator().getReverse());
- BasicBlock::reverse_iterator EI = RI->getParent()->rend();
- bool InsertRetainCall = IsRetainRV;
- IRBuilder<> Builder(RI->getContext());
-
- // Walk backwards through the basic block looking for either a matching
- // autoreleaseRV call or an unannotated call.
- for (; I != EI;) {
- auto CurI = I++;
-
- // Ignore casts.
- if (isa<CastInst>(*CurI))
- continue;
-
- if (auto *II = dyn_cast<IntrinsicInst>(&*CurI)) {
- if (II->getIntrinsicID() == Intrinsic::objc_autoreleaseReturnValue &&
- II->hasNUses(0) &&
- objcarc::GetRCIdentityRoot(II->getOperand(0)) == RetOpnd) {
- // If we've found a matching authoreleaseRV call:
- // - If the call is annotated with claimRV, insert a call to
- // objc_release and erase the autoreleaseRV call.
- // - If the call is annotated with retainRV, just erase the
- // autoreleaseRV call.
- if (IsClaimRV) {
- Builder.SetInsertPoint(II);
- Function *IFn =
- Intrinsic::getDeclaration(Mod, Intrinsic::objc_release);
- Value *BC =
- Builder.CreateBitCast(RetOpnd, IFn->getArg(0)->getType());
- Builder.CreateCall(IFn, BC, "");
- }
- II->eraseFromParent();
- InsertRetainCall = false;
- }
- } else if (auto *CI = dyn_cast<CallInst>(&*CurI)) {
- if (objcarc::GetRCIdentityRoot(CI) == RetOpnd &&
- !objcarc::hasRVOpBundle(CI)) {
- // If we've found an unannotated call that defines RetOpnd, add a
- // "clang.arc.rv" operand bundle.
- Value *BundleArgs[] = {
- ConstantInt::get(Builder.getInt64Ty(),
- objcarc::getRVOperandBundleEnum(IsRetainRV))};
- OperandBundleDef OB("clang.arc.rv", BundleArgs);
- auto *NewCall = CallBase::addOperandBundle(
- CI, LLVMContext::OB_clang_arc_rv, OB, CI);
- NewCall->copyMetadata(*CI);
- CI->replaceAllUsesWith(NewCall);
- CI->eraseFromParent();
- InsertRetainCall = false;
- }
- }
-
- break;
- }
-
- if (InsertRetainCall) {
- // The call has operand bundle "clang.arc.rv"="retain" and we've failed to
- // find a matching autoreleaseRV or an annotated call in the callee. Emit
- // a call to objc_retain.
- Builder.SetInsertPoint(RI);
- Function *IFn = Intrinsic::getDeclaration(Mod, Intrinsic::objc_retain);
- Value *BC = Builder.CreateBitCast(RetOpnd, IFn->getArg(0)->getType());
- Builder.CreateCall(IFn, BC, "");
- }
- }
-}
-
/// This function inlines the called function into the basic block of the
/// caller. This returns false if it is not possible to inline this call.
/// The program is still in a well defined state if this occurs though.
@@ -1781,8 +1687,6 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
// ... and "funclet" operand bundles.
if (Tag == LLVMContext::OB_funclet)
continue;
- if (Tag == LLVMContext::OB_clang_arc_rv)
- continue;
return InlineResult::failure("unsupported operand bundle");
}
@@ -1949,10 +1853,6 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI,
// Remember the first block that is newly cloned over.
FirstNewBlock = LastBlock; ++FirstNewBlock;
- // Insert retainRV/clainRV runtime calls.
- if (objcarc::hasRVOpBundle(&CB))
- inlineRetainOrClaimRVCalls(CB, Returns);
-
if (IFI.CallerBFI != nullptr && IFI.CalleeBFI != nullptr)
// Update the BFI of blocks cloned into the caller.
updateCallerBFI(OrigBB, VMap, IFI.CallerBFI, IFI.CalleeBFI,