diff options
Diffstat (limited to 'lib/Transforms/ObjCARC')
-rw-r--r-- | lib/Transforms/ObjCARC/ARCRuntimeEntryPoints.h | 6 | ||||
-rw-r--r-- | lib/Transforms/ObjCARC/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lib/Transforms/ObjCARC/DependencyAnalysis.cpp | 10 | ||||
-rw-r--r-- | lib/Transforms/ObjCARC/DependencyAnalysis.h | 10 | ||||
-rw-r--r-- | lib/Transforms/ObjCARC/ObjCARC.cpp | 1 | ||||
-rw-r--r-- | lib/Transforms/ObjCARC/ObjCARC.h | 20 | ||||
-rw-r--r-- | lib/Transforms/ObjCARC/ObjCARCAliasAnalysis.cpp | 6 | ||||
-rw-r--r-- | lib/Transforms/ObjCARC/ObjCARCAliasAnalysis.h | 6 | ||||
-rw-r--r-- | lib/Transforms/ObjCARC/ObjCARCContract.cpp | 13 | ||||
-rw-r--r-- | lib/Transforms/ObjCARC/ObjCARCOpts.cpp | 91 | ||||
-rw-r--r-- | lib/Transforms/ObjCARC/ProvenanceAnalysis.cpp | 4 | ||||
-rw-r--r-- | lib/Transforms/ObjCARC/ProvenanceAnalysis.h | 6 | ||||
-rw-r--r-- | lib/Transforms/ObjCARC/ProvenanceAnalysisEvaluator.cpp | 92 |
13 files changed, 164 insertions, 102 deletions
diff --git a/lib/Transforms/ObjCARC/ARCRuntimeEntryPoints.h b/lib/Transforms/ObjCARC/ARCRuntimeEntryPoints.h index 409842863073..e286dbc64a86 100644 --- a/lib/Transforms/ObjCARC/ARCRuntimeEntryPoints.h +++ b/lib/Transforms/ObjCARC/ARCRuntimeEntryPoints.h @@ -19,8 +19,8 @@ /// //===----------------------------------------------------------------------===// -#ifndef LLVM_TRANSFORMS_SCALAR_ARCRUNTIMEENTRYPOINTS_H -#define LLVM_TRANSFORMS_SCALAR_ARCRUNTIMEENTRYPOINTS_H +#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_ARCRUNTIMEENTRYPOINTS_H +#define LLVM_LIB_TRANSFORMS_OBJCARC_ARCRUNTIMEENTRYPOINTS_H #include "ObjCARC.h" @@ -183,4 +183,4 @@ private: } // namespace objcarc } // namespace llvm -#endif // LLVM_TRANSFORMS_SCALAR_ARCRUNTIMEENTRYPOINTS_H +#endif diff --git a/lib/Transforms/ObjCARC/CMakeLists.txt b/lib/Transforms/ObjCARC/CMakeLists.txt index 233deb398011..b449fac13860 100644 --- a/lib/Transforms/ObjCARC/CMakeLists.txt +++ b/lib/Transforms/ObjCARC/CMakeLists.txt @@ -8,6 +8,7 @@ add_llvm_library(LLVMObjCARCOpts ObjCARCContract.cpp DependencyAnalysis.cpp ProvenanceAnalysis.cpp + ProvenanceAnalysisEvaluator.cpp ) add_dependencies(LLVMObjCARCOpts intrinsics_gen) diff --git a/lib/Transforms/ObjCARC/DependencyAnalysis.cpp b/lib/Transforms/ObjCARC/DependencyAnalysis.cpp index 08c884293cc5..f6c236c31ef8 100644 --- a/lib/Transforms/ObjCARC/DependencyAnalysis.cpp +++ b/lib/Transforms/ObjCARC/DependencyAnalysis.cpp @@ -206,8 +206,8 @@ void llvm::objcarc::FindDependencies(DependenceKind Flavor, const Value *Arg, BasicBlock *StartBB, Instruction *StartInst, - SmallPtrSet<Instruction *, 4> &DependingInsts, - SmallPtrSet<const BasicBlock *, 4> &Visited, + SmallPtrSetImpl<Instruction *> &DependingInsts, + SmallPtrSetImpl<const BasicBlock *> &Visited, ProvenanceAnalysis &PA) { BasicBlock::iterator StartPos = StartInst; @@ -229,7 +229,7 @@ llvm::objcarc::FindDependencies(DependenceKind Flavor, // Add the predecessors to the worklist. do { BasicBlock *PredBB = *PI; - if (Visited.insert(PredBB)) + if (Visited.insert(PredBB).second) Worklist.push_back(std::make_pair(PredBB, PredBB->end())); } while (++PI != PE); break; @@ -246,9 +246,7 @@ llvm::objcarc::FindDependencies(DependenceKind Flavor, // Determine whether the original StartBB post-dominates all of the blocks we // visited. If not, insert a sentinal indicating that most optimizations are // not safe. - for (SmallPtrSet<const BasicBlock *, 4>::const_iterator I = Visited.begin(), - E = Visited.end(); I != E; ++I) { - const BasicBlock *BB = *I; + for (const BasicBlock *BB : Visited) { if (BB == StartBB) continue; const TerminatorInst *TI = cast<TerminatorInst>(&BB->back()); diff --git a/lib/Transforms/ObjCARC/DependencyAnalysis.h b/lib/Transforms/ObjCARC/DependencyAnalysis.h index 617cdf3843b8..7b5601ad6d5d 100644 --- a/lib/Transforms/ObjCARC/DependencyAnalysis.h +++ b/lib/Transforms/ObjCARC/DependencyAnalysis.h @@ -20,8 +20,8 @@ /// //===----------------------------------------------------------------------===// -#ifndef LLVM_TRANSFORMS_OBJCARC_DEPEDENCYANALYSIS_H -#define LLVM_TRANSFORMS_OBJCARC_DEPEDENCYANALYSIS_H +#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H +#define LLVM_LIB_TRANSFORMS_OBJCARC_DEPENDENCYANALYSIS_H #include "llvm/ADT/SmallPtrSet.h" @@ -53,8 +53,8 @@ enum DependenceKind { void FindDependencies(DependenceKind Flavor, const Value *Arg, BasicBlock *StartBB, Instruction *StartInst, - SmallPtrSet<Instruction *, 4> &DependingInstructions, - SmallPtrSet<const BasicBlock *, 4> &Visited, + SmallPtrSetImpl<Instruction *> &DependingInstructions, + SmallPtrSetImpl<const BasicBlock *> &Visited, ProvenanceAnalysis &PA); bool @@ -76,4 +76,4 @@ CanAlterRefCount(const Instruction *Inst, const Value *Ptr, } // namespace objcarc } // namespace llvm -#endif // LLVM_TRANSFORMS_OBJCARC_DEPEDENCYANALYSIS_H +#endif diff --git a/lib/Transforms/ObjCARC/ObjCARC.cpp b/lib/Transforms/ObjCARC/ObjCARC.cpp index 373168e89888..6ea038b8ba8c 100644 --- a/lib/Transforms/ObjCARC/ObjCARC.cpp +++ b/lib/Transforms/ObjCARC/ObjCARC.cpp @@ -42,6 +42,7 @@ void llvm::initializeObjCARCOpts(PassRegistry &Registry) { initializeObjCARCExpandPass(Registry); initializeObjCARCContractPass(Registry); initializeObjCARCOptPass(Registry); + initializePAEvalPass(Registry); } void LLVMInitializeObjCARCOpts(LLVMPassRegistryRef R) { diff --git a/lib/Transforms/ObjCARC/ObjCARC.h b/lib/Transforms/ObjCARC/ObjCARC.h index f71cf2bd4399..7a7eae84a1e2 100644 --- a/lib/Transforms/ObjCARC/ObjCARC.h +++ b/lib/Transforms/ObjCARC/ObjCARC.h @@ -20,8 +20,8 @@ /// //===----------------------------------------------------------------------===// -#ifndef LLVM_TRANSFORMS_SCALAR_OBJCARC_H -#define LLVM_TRANSFORMS_SCALAR_OBJCARC_H +#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_OBJCARC_H +#define LLVM_LIB_TRANSFORMS_OBJCARC_OBJCARC_H #include "llvm/ADT/StringSwitch.h" #include "llvm/Analysis/AliasAnalysis.h" @@ -380,11 +380,15 @@ static inline bool IsObjCIdentifiedObject(const Value *V) { StringRef Name = GV->getName(); // These special variables are known to hold values which are not // reference-counted pointers. - if (Name.startswith("\01L_OBJC_SELECTOR_REFERENCES_") || - Name.startswith("\01L_OBJC_CLASSLIST_REFERENCES_") || - Name.startswith("\01L_OBJC_CLASSLIST_SUP_REFS_$_") || - Name.startswith("\01L_OBJC_METH_VAR_NAME_") || - Name.startswith("\01l_objc_msgSend_fixup_")) + if (Name.startswith("\01l_objc_msgSend_fixup_")) + return true; + + StringRef Section = GV->getSection(); + if (Section.find("__message_refs") != StringRef::npos || + Section.find("__objc_classrefs") != StringRef::npos || + Section.find("__objc_superrefs") != StringRef::npos || + Section.find("__objc_methname") != StringRef::npos || + Section.find("__cstring") != StringRef::npos) return true; } } @@ -395,4 +399,4 @@ static inline bool IsObjCIdentifiedObject(const Value *V) { } // end namespace objcarc } // end namespace llvm -#endif // LLVM_TRANSFORMS_SCALAR_OBJCARC_H +#endif diff --git a/lib/Transforms/ObjCARC/ObjCARCAliasAnalysis.cpp b/lib/Transforms/ObjCARC/ObjCARCAliasAnalysis.cpp index 2c09e70cc9c6..c61b6b0e6dd9 100644 --- a/lib/Transforms/ObjCARC/ObjCARCAliasAnalysis.cpp +++ b/lib/Transforms/ObjCARC/ObjCARCAliasAnalysis.cpp @@ -62,8 +62,8 @@ ObjCARCAliasAnalysis::alias(const Location &LocA, const Location &LocB) { const Value *SA = StripPointerCastsAndObjCCalls(LocA.Ptr); const Value *SB = StripPointerCastsAndObjCCalls(LocB.Ptr); AliasResult Result = - AliasAnalysis::alias(Location(SA, LocA.Size, LocA.TBAATag), - Location(SB, LocB.Size, LocB.TBAATag)); + AliasAnalysis::alias(Location(SA, LocA.Size, LocA.AATags), + Location(SB, LocB.Size, LocB.AATags)); if (Result != MayAlias) return Result; @@ -93,7 +93,7 @@ ObjCARCAliasAnalysis::pointsToConstantMemory(const Location &Loc, // First, strip off no-ops, including ObjC-specific no-ops, and try making // a precise alias query. const Value *S = StripPointerCastsAndObjCCalls(Loc.Ptr); - if (AliasAnalysis::pointsToConstantMemory(Location(S, Loc.Size, Loc.TBAATag), + if (AliasAnalysis::pointsToConstantMemory(Location(S, Loc.Size, Loc.AATags), OrLocal)) return true; diff --git a/lib/Transforms/ObjCARC/ObjCARCAliasAnalysis.h b/lib/Transforms/ObjCARC/ObjCARCAliasAnalysis.h index 97b565be0d2a..3fcea4e9b86d 100644 --- a/lib/Transforms/ObjCARC/ObjCARCAliasAnalysis.h +++ b/lib/Transforms/ObjCARC/ObjCARCAliasAnalysis.h @@ -20,8 +20,8 @@ /// //===----------------------------------------------------------------------===// -#ifndef LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H -#define LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H +#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H +#define LLVM_LIB_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Pass.h" @@ -71,4 +71,4 @@ namespace objcarc { } // namespace objcarc } // namespace llvm -#endif // LLVM_TRANSFORMS_OBJCARC_OBJCARCALIASANALYSIS_H +#endif diff --git a/lib/Transforms/ObjCARC/ObjCARCContract.cpp b/lib/Transforms/ObjCARC/ObjCARCContract.cpp index f48d53d11b71..eb325eb9417f 100644 --- a/lib/Transforms/ObjCARC/ObjCARCContract.cpp +++ b/lib/Transforms/ObjCARC/ObjCARCContract.cpp @@ -72,9 +72,9 @@ namespace { bool ContractAutorelease(Function &F, Instruction *Autorelease, InstructionClass Class, - SmallPtrSet<Instruction *, 4> + SmallPtrSetImpl<Instruction *> &DependingInstructions, - SmallPtrSet<const BasicBlock *, 4> + SmallPtrSetImpl<const BasicBlock *> &Visited); void ContractRelease(Instruction *Release, @@ -150,9 +150,9 @@ ObjCARCContract::OptimizeRetainCall(Function &F, Instruction *Retain) { bool ObjCARCContract::ContractAutorelease(Function &F, Instruction *Autorelease, InstructionClass Class, - SmallPtrSet<Instruction *, 4> + SmallPtrSetImpl<Instruction *> &DependingInstructions, - SmallPtrSet<const BasicBlock *, 4> + SmallPtrSetImpl<const BasicBlock *> &Visited) { const Value *Arg = GetObjCArg(Autorelease); @@ -508,9 +508,8 @@ bool ObjCARCContract::runOnFunction(Function &F) { // If this function has no escaping allocas or suspicious vararg usage, // objc_storeStrong calls can be marked with the "tail" keyword. if (TailOkForStoreStrongs) - for (SmallPtrSet<CallInst *, 8>::iterator I = StoreStrongCalls.begin(), - E = StoreStrongCalls.end(); I != E; ++I) - (*I)->setTailCall(); + for (CallInst *CI : StoreStrongCalls) + CI->setTailCall(); StoreStrongCalls.clear(); return Changed; diff --git a/lib/Transforms/ObjCARC/ObjCARCOpts.cpp b/lib/Transforms/ObjCARC/ObjCARCOpts.cpp index dd4dd50f0ba5..76932e6b600b 100644 --- a/lib/Transforms/ObjCARC/ObjCARCOpts.cpp +++ b/lib/Transforms/ObjCARC/ObjCARCOpts.cpp @@ -188,7 +188,7 @@ static inline bool AreAnyUnderlyingObjectsAnAlloca(const Value *V) { if (isa<AllocaInst>(P)) return true; - if (!Visited.insert(P)) + if (!Visited.insert(P).second) continue; if (const SelectInst *SI = dyn_cast<const SelectInst>(P)) { @@ -411,10 +411,8 @@ bool RRInfo::Merge(const RRInfo &Other) { // Merge the insert point sets. If there are any differences, // that makes this a partial merge. bool Partial = ReverseInsertPts.size() != Other.ReverseInsertPts.size(); - for (SmallPtrSet<Instruction *, 2>::const_iterator - I = Other.ReverseInsertPts.begin(), - E = Other.ReverseInsertPts.end(); I != E; ++I) - Partial |= ReverseInsertPts.insert(*I); + for (Instruction *Inst : Other.ReverseInsertPts) + Partial |= ReverseInsertPts.insert(Inst).second; return Partial; } @@ -882,13 +880,10 @@ static void AppendMDNodeToInstForPtr(unsigned NodeId, Sequence OldSeq, Sequence NewSeq) { MDNode *Node = nullptr; - Value *tmp[3] = {PtrSourceMDNodeID, - SequenceToMDString(Inst->getContext(), - OldSeq), - SequenceToMDString(Inst->getContext(), - NewSeq)}; - Node = MDNode::get(Inst->getContext(), - ArrayRef<Value*>(tmp, 3)); + Metadata *tmp[3] = {PtrSourceMDNodeID, + SequenceToMDString(Inst->getContext(), OldSeq), + SequenceToMDString(Inst->getContext(), NewSeq)}; + Node = MDNode::get(Inst->getContext(), tmp); Inst->setMetadata(NodeId, Node); } @@ -908,8 +903,7 @@ static void GenerateARCBBEntranceAnnotation(const char *Name, BasicBlock *BB, Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C)); Type *I8XX = PointerType::getUnqual(I8X); Type *Params[] = {I8XX, I8XX}; - FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), - ArrayRef<Type*>(Params, 2), + FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), Params, /*isVarArg=*/false); Constant *Callee = M->getOrInsertFunction(Name, FTy); @@ -951,8 +945,7 @@ static void GenerateARCBBTerminatorAnnotation(const char *Name, BasicBlock *BB, Type *I8X = PointerType::getUnqual(Type::getInt8Ty(C)); Type *I8XX = PointerType::getUnqual(I8X); Type *Params[] = {I8XX, I8XX}; - FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), - ArrayRef<Type*>(Params, 2), + FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), Params, /*isVarArg=*/false); Constant *Callee = M->getOrInsertFunction(Name, FTy); @@ -2199,7 +2192,7 @@ ComputePostOrders(Function &F, while (SuccStack.back().second != SE) { BasicBlock *SuccBB = *SuccStack.back().second++; - if (Visited.insert(SuccBB)) { + if (Visited.insert(SuccBB).second) { TerminatorInst *TI = cast<TerminatorInst>(&SuccBB->back()); SuccStack.push_back(std::make_pair(SuccBB, succ_iterator(TI))); BBStates[CurrBB].addSucc(SuccBB); @@ -2240,7 +2233,7 @@ ComputePostOrders(Function &F, BBState::edge_iterator PE = BBStates[PredStack.back().first].pred_end(); while (PredStack.back().second != PE) { BasicBlock *BB = *PredStack.back().second++; - if (Visited.insert(BB)) { + if (Visited.insert(BB).second) { PredStack.push_back(std::make_pair(BB, BBStates[BB].pred_begin())); goto reverse_dfs_next_succ; } @@ -2299,10 +2292,7 @@ void ObjCARCOpt::MoveCalls(Value *Arg, DEBUG(dbgs() << "== ObjCARCOpt::MoveCalls ==\n"); // Insert the new retain and release calls. - for (SmallPtrSet<Instruction *, 2>::const_iterator - PI = ReleasesToMove.ReverseInsertPts.begin(), - PE = ReleasesToMove.ReverseInsertPts.end(); PI != PE; ++PI) { - Instruction *InsertPt = *PI; + for (Instruction *InsertPt : ReleasesToMove.ReverseInsertPts) { Value *MyArg = ArgTy == ParamTy ? Arg : new BitCastInst(Arg, ParamTy, "", InsertPt); Constant *Decl = EP.get(ARCRuntimeEntryPoints::EPT_Retain); @@ -2313,10 +2303,7 @@ void ObjCARCOpt::MoveCalls(Value *Arg, DEBUG(dbgs() << "Inserting new Retain: " << *Call << "\n" "At insertion point: " << *InsertPt << "\n"); } - for (SmallPtrSet<Instruction *, 2>::const_iterator - PI = RetainsToMove.ReverseInsertPts.begin(), - PE = RetainsToMove.ReverseInsertPts.end(); PI != PE; ++PI) { - Instruction *InsertPt = *PI; + for (Instruction *InsertPt : RetainsToMove.ReverseInsertPts) { Value *MyArg = ArgTy == ParamTy ? Arg : new BitCastInst(Arg, ParamTy, "", InsertPt); Constant *Decl = EP.get(ARCRuntimeEntryPoints::EPT_Release); @@ -2333,18 +2320,12 @@ void ObjCARCOpt::MoveCalls(Value *Arg, } // Delete the original retain and release calls. - for (SmallPtrSet<Instruction *, 2>::const_iterator - AI = RetainsToMove.Calls.begin(), - AE = RetainsToMove.Calls.end(); AI != AE; ++AI) { - Instruction *OrigRetain = *AI; + for (Instruction *OrigRetain : RetainsToMove.Calls) { Retains.blot(OrigRetain); DeadInsts.push_back(OrigRetain); DEBUG(dbgs() << "Deleting retain: " << *OrigRetain << "\n"); } - for (SmallPtrSet<Instruction *, 2>::const_iterator - AI = ReleasesToMove.Calls.begin(), - AE = ReleasesToMove.Calls.end(); AI != AE; ++AI) { - Instruction *OrigRelease = *AI; + for (Instruction *OrigRelease : ReleasesToMove.Calls) { Releases.erase(OrigRelease); DeadInsts.push_back(OrigRelease); DEBUG(dbgs() << "Deleting release: " << *OrigRelease << "\n"); @@ -2392,10 +2373,7 @@ ObjCARCOpt::ConnectTDBUTraversals(DenseMap<const BasicBlock *, BBState> KnownSafeTD &= NewRetainRRI.KnownSafe; MultipleOwners = MultipleOwners || MultiOwnersSet.count(GetObjCArg(NewRetain)); - for (SmallPtrSet<Instruction *, 2>::const_iterator - LI = NewRetainRRI.Calls.begin(), - LE = NewRetainRRI.Calls.end(); LI != LE; ++LI) { - Instruction *NewRetainRelease = *LI; + for (Instruction *NewRetainRelease : NewRetainRRI.Calls) { DenseMap<Value *, RRInfo>::const_iterator Jt = Releases.find(NewRetainRelease); if (Jt == Releases.end()) @@ -2410,7 +2388,7 @@ ObjCARCOpt::ConnectTDBUTraversals(DenseMap<const BasicBlock *, BBState> if (!NewRetainReleaseRRI.Calls.count(NewRetain)) return false; - if (ReleasesToMove.Calls.insert(NewRetainRelease)) { + if (ReleasesToMove.Calls.insert(NewRetainRelease).second) { // If we overflow when we compute the path count, don't remove/move // anything. @@ -2441,12 +2419,8 @@ ObjCARCOpt::ConnectTDBUTraversals(DenseMap<const BasicBlock *, BBState> // Collect the optimal insertion points. if (!KnownSafe) - for (SmallPtrSet<Instruction *, 2>::const_iterator - RI = NewRetainReleaseRRI.ReverseInsertPts.begin(), - RE = NewRetainReleaseRRI.ReverseInsertPts.end(); - RI != RE; ++RI) { - Instruction *RIP = *RI; - if (ReleasesToMove.ReverseInsertPts.insert(RIP)) { + for (Instruction *RIP : NewRetainReleaseRRI.ReverseInsertPts) { + if (ReleasesToMove.ReverseInsertPts.insert(RIP).second) { // If we overflow when we compute the path count, don't // remove/move anything. const BBState &RIPBBState = BBStates[RIP->getParent()]; @@ -2476,10 +2450,7 @@ ObjCARCOpt::ConnectTDBUTraversals(DenseMap<const BasicBlock *, BBState> const RRInfo &NewReleaseRRI = It->second; KnownSafeBU &= NewReleaseRRI.KnownSafe; CFGHazardAfflicted |= NewReleaseRRI.CFGHazardAfflicted; - for (SmallPtrSet<Instruction *, 2>::const_iterator - LI = NewReleaseRRI.Calls.begin(), - LE = NewReleaseRRI.Calls.end(); LI != LE; ++LI) { - Instruction *NewReleaseRetain = *LI; + for (Instruction *NewReleaseRetain : NewReleaseRRI.Calls) { MapVector<Value *, RRInfo>::const_iterator Jt = Retains.find(NewReleaseRetain); if (Jt == Retains.end()) @@ -2494,7 +2465,7 @@ ObjCARCOpt::ConnectTDBUTraversals(DenseMap<const BasicBlock *, BBState> if (!NewReleaseRetainRRI.Calls.count(NewRelease)) return false; - if (RetainsToMove.Calls.insert(NewReleaseRetain)) { + if (RetainsToMove.Calls.insert(NewReleaseRetain).second) { // If we overflow when we compute the path count, don't remove/move // anything. const BBState &NRRBBState = BBStates[NewReleaseRetain->getParent()]; @@ -2509,12 +2480,8 @@ ObjCARCOpt::ConnectTDBUTraversals(DenseMap<const BasicBlock *, BBState> // Collect the optimal insertion points. if (!KnownSafe) - for (SmallPtrSet<Instruction *, 2>::const_iterator - RI = NewReleaseRetainRRI.ReverseInsertPts.begin(), - RE = NewReleaseRetainRRI.ReverseInsertPts.end(); - RI != RE; ++RI) { - Instruction *RIP = *RI; - if (RetainsToMove.ReverseInsertPts.insert(RIP)) { + for (Instruction *RIP : NewReleaseRetainRRI.ReverseInsertPts) { + if (RetainsToMove.ReverseInsertPts.insert(RIP).second) { // If we overflow when we compute the path count, don't // remove/move anything. const BBState &RIPBBState = BBStates[RIP->getParent()]; @@ -2850,8 +2817,8 @@ bool ObjCARCOpt::OptimizeSequences(Function &F) { /// shared pointer argument. Note that Retain need not be in BB. static bool HasSafePathToPredecessorCall(const Value *Arg, Instruction *Retain, - SmallPtrSet<Instruction *, 4> &DepInsts, - SmallPtrSet<const BasicBlock *, 4> &Visited, + SmallPtrSetImpl<Instruction *> &DepInsts, + SmallPtrSetImpl<const BasicBlock *> &Visited, ProvenanceAnalysis &PA) { FindDependencies(CanChangeRetainCount, Arg, Retain->getParent(), Retain, DepInsts, Visited, PA); @@ -2879,8 +2846,8 @@ HasSafePathToPredecessorCall(const Value *Arg, Instruction *Retain, static CallInst * FindPredecessorRetainWithSafePath(const Value *Arg, BasicBlock *BB, Instruction *Autorelease, - SmallPtrSet<Instruction *, 4> &DepInsts, - SmallPtrSet<const BasicBlock *, 4> &Visited, + SmallPtrSetImpl<Instruction *> &DepInsts, + SmallPtrSetImpl<const BasicBlock *> &Visited, ProvenanceAnalysis &PA) { FindDependencies(CanChangeRetainCount, Arg, BB, Autorelease, DepInsts, Visited, PA); @@ -2906,8 +2873,8 @@ FindPredecessorRetainWithSafePath(const Value *Arg, BasicBlock *BB, static CallInst * FindPredecessorAutoreleaseWithSafePath(const Value *Arg, BasicBlock *BB, ReturnInst *Ret, - SmallPtrSet<Instruction *, 4> &DepInsts, - SmallPtrSet<const BasicBlock *, 4> &V, + SmallPtrSetImpl<Instruction *> &DepInsts, + SmallPtrSetImpl<const BasicBlock *> &V, ProvenanceAnalysis &PA) { FindDependencies(NeedsPositiveRetainCount, Arg, BB, Ret, DepInsts, V, PA); diff --git a/lib/Transforms/ObjCARC/ProvenanceAnalysis.cpp b/lib/Transforms/ObjCARC/ProvenanceAnalysis.cpp index 22be6fdf45f9..410abfc354a0 100644 --- a/lib/Transforms/ObjCARC/ProvenanceAnalysis.cpp +++ b/lib/Transforms/ObjCARC/ProvenanceAnalysis.cpp @@ -62,7 +62,7 @@ bool ProvenanceAnalysis::relatedPHI(const PHINode *A, SmallPtrSet<const Value *, 4> UniqueSrc; for (unsigned i = 0, e = A->getNumIncomingValues(); i != e; ++i) { const Value *PV1 = A->getIncomingValue(i); - if (UniqueSrc.insert(PV1) && related(PV1, B)) + if (UniqueSrc.insert(PV1).second && related(PV1, B)) return true; } @@ -94,7 +94,7 @@ static bool IsStoredObjCPointer(const Value *P) { if (isa<PtrToIntInst>(P)) // Assume the worst. return true; - if (Visited.insert(Ur)) + if (Visited.insert(Ur).second) Worklist.push_back(Ur); } } while (!Worklist.empty()); diff --git a/lib/Transforms/ObjCARC/ProvenanceAnalysis.h b/lib/Transforms/ObjCARC/ProvenanceAnalysis.h index a13fb9e9b029..782046812f05 100644 --- a/lib/Transforms/ObjCARC/ProvenanceAnalysis.h +++ b/lib/Transforms/ObjCARC/ProvenanceAnalysis.h @@ -22,8 +22,8 @@ /// //===----------------------------------------------------------------------===// -#ifndef LLVM_TRANSFORMS_OBJCARC_PROVENANCEANALYSIS_H -#define LLVM_TRANSFORMS_OBJCARC_PROVENANCEANALYSIS_H +#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_PROVENANCEANALYSIS_H +#define LLVM_LIB_TRANSFORMS_OBJCARC_PROVENANCEANALYSIS_H #include "llvm/ADT/DenseMap.h" @@ -77,4 +77,4 @@ public: } // end namespace objcarc } // end namespace llvm -#endif // LLVM_TRANSFORMS_OBJCARC_PROVENANCEANALYSIS_H +#endif diff --git a/lib/Transforms/ObjCARC/ProvenanceAnalysisEvaluator.cpp b/lib/Transforms/ObjCARC/ProvenanceAnalysisEvaluator.cpp new file mode 100644 index 000000000000..d836632dc617 --- /dev/null +++ b/lib/Transforms/ObjCARC/ProvenanceAnalysisEvaluator.cpp @@ -0,0 +1,92 @@ +//===- ProvenanceAnalysisEvaluator.cpp - ObjC ARC Optimization ------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "ProvenanceAnalysis.h" +#include "llvm/Pass.h" +#include "llvm/ADT/SetVector.h" +#include "llvm/Analysis/AliasAnalysis.h" +#include "llvm/Analysis/Passes.h" +#include "llvm/IR/InstIterator.h" +#include "llvm/IR/Function.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; +using namespace llvm::objcarc; + +namespace { +class PAEval : public FunctionPass { + +public: + static char ID; + PAEval(); + void getAnalysisUsage(AnalysisUsage &AU) const override; + bool runOnFunction(Function &F) override; +}; +} + +char PAEval::ID = 0; +PAEval::PAEval() : FunctionPass(ID) {} + +void PAEval::getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired<AliasAnalysis>(); +} + +static StringRef getName(Value *V) { + StringRef Name = V->getName(); + if (Name.startswith("\1")) + return Name.substr(1); + return Name; +} + +static void insertIfNamed(SetVector<Value *> &Values, Value *V) { + if (!V->hasName()) + return; + Values.insert(V); +} + +bool PAEval::runOnFunction(Function &F) { + SetVector<Value *> Values; + + for (auto &Arg : F.args()) + insertIfNamed(Values, &Arg); + + for (auto I = inst_begin(F), E = inst_end(F); I != E; ++I) { + insertIfNamed(Values, &*I); + + for (auto &Op : I->operands()) + insertIfNamed(Values, Op); + } + + ProvenanceAnalysis PA; + PA.setAA(&getAnalysis<AliasAnalysis>()); + + for (Value *V1 : Values) { + StringRef NameV1 = getName(V1); + for (Value *V2 : Values) { + StringRef NameV2 = getName(V2); + if (NameV1 >= NameV2) + continue; + errs() << NameV1 << " and " << NameV2; + if (PA.related(V1, V2)) + errs() << " are related.\n"; + else + errs() << " are not related.\n"; + } + } + + return false; +} + +FunctionPass *llvm::createPAEvalPass() { return new PAEval(); } + +INITIALIZE_PASS_BEGIN(PAEval, "pa-eval", + "Evaluate ProvenanceAnalysis on all pairs", false, true) +INITIALIZE_AG_DEPENDENCY(AliasAnalysis) +INITIALIZE_PASS_END(PAEval, "pa-eval", + "Evaluate ProvenanceAnalysis on all pairs", false, true) |