mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-19 10:53:55 +00:00
[objc-arc] Fix indentation of debug logging so it is easy to read the output.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232352 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6bc127e1dd
commit
12509308c1
@ -99,5 +99,10 @@ public:
|
||||
Map.clear();
|
||||
Vector.clear();
|
||||
}
|
||||
|
||||
bool empty() const {
|
||||
assert(Map.empty() == Vector.empty());
|
||||
return Map.empty();
|
||||
}
|
||||
};
|
||||
} //
|
||||
|
@ -218,6 +218,9 @@ namespace {
|
||||
const_top_down_ptr_iterator top_down_ptr_end() const {
|
||||
return PerPtrTopDown.end();
|
||||
}
|
||||
bool hasTopDownPtrs() const {
|
||||
return !PerPtrTopDown.empty();
|
||||
}
|
||||
|
||||
typedef decltype(PerPtrBottomUp)::iterator bottom_up_ptr_iterator;
|
||||
typedef decltype(
|
||||
@ -233,6 +236,9 @@ namespace {
|
||||
const_bottom_up_ptr_iterator bottom_up_ptr_end() const {
|
||||
return PerPtrBottomUp.end();
|
||||
}
|
||||
bool hasBottomUpPtrs() const {
|
||||
return !PerPtrBottomUp.empty();
|
||||
}
|
||||
|
||||
/// Mark this block as being an entry block, which has one path from the
|
||||
/// entry by definition.
|
||||
@ -309,6 +315,11 @@ namespace {
|
||||
const unsigned BBState::OverflowOccurredValue = 0xffffffff;
|
||||
}
|
||||
|
||||
namespace llvm {
|
||||
raw_ostream &operator<<(raw_ostream &OS,
|
||||
BBState &BBState) __attribute__ ((used));
|
||||
}
|
||||
|
||||
void BBState::InitFromPred(const BBState &Other) {
|
||||
PerPtrTopDown = Other.PerPtrTopDown;
|
||||
TopDownPathCount = Other.TopDownPathCount;
|
||||
@ -406,6 +417,51 @@ void BBState::MergeSucc(const BBState &Other) {
|
||||
MI->second.Merge(BottomUpPtrState(), /*TopDown=*/false);
|
||||
}
|
||||
|
||||
raw_ostream &llvm::operator<<(raw_ostream &OS, BBState &BBInfo) {
|
||||
// Dump the pointers we are tracking.
|
||||
OS << " TopDown State:\n";
|
||||
if (!BBInfo.hasTopDownPtrs()) {
|
||||
DEBUG(llvm::dbgs() << " NONE!\n");
|
||||
} else {
|
||||
for (auto I = BBInfo.top_down_ptr_begin(), E = BBInfo.top_down_ptr_end();
|
||||
I != E; ++I) {
|
||||
const PtrState &P = I->second;
|
||||
OS << " Ptr: " << *I->first
|
||||
<< "\n KnownSafe: " << (P.IsKnownSafe()?"true":"false")
|
||||
<< "\n ImpreciseRelease: "
|
||||
<< (P.IsTrackingImpreciseReleases()?"true":"false") << "\n"
|
||||
<< " HasCFGHazards: "
|
||||
<< (P.IsCFGHazardAfflicted()?"true":"false") << "\n"
|
||||
<< " KnownPositive: "
|
||||
<< (P.HasKnownPositiveRefCount()?"true":"false") << "\n"
|
||||
<< " Seq: "
|
||||
<< P.GetSeq() << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
OS << " BottomUp State:\n";
|
||||
if (!BBInfo.hasBottomUpPtrs()) {
|
||||
DEBUG(llvm::dbgs() << " NONE!\n");
|
||||
} else {
|
||||
for (auto I = BBInfo.bottom_up_ptr_begin(), E = BBInfo.bottom_up_ptr_end();
|
||||
I != E; ++I) {
|
||||
const PtrState &P = I->second;
|
||||
OS << " Ptr: " << *I->first
|
||||
<< "\n KnownSafe: " << (P.IsKnownSafe()?"true":"false")
|
||||
<< "\n ImpreciseRelease: "
|
||||
<< (P.IsTrackingImpreciseReleases()?"true":"false") << "\n"
|
||||
<< " HasCFGHazards: "
|
||||
<< (P.IsCFGHazardAfflicted()?"true":"false") << "\n"
|
||||
<< " KnownPositive: "
|
||||
<< (P.HasKnownPositiveRefCount()?"true":"false") << "\n"
|
||||
<< " Seq: "
|
||||
<< P.GetSeq() << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
return OS;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
/// \brief The main ARC optimization pass.
|
||||
@ -1043,7 +1099,7 @@ bool ObjCARCOpt::VisitInstructionBottomUp(
|
||||
ARCInstKind Class = GetARCInstKind(Inst);
|
||||
const Value *Arg = nullptr;
|
||||
|
||||
DEBUG(dbgs() << "Class: " << Class << "\n");
|
||||
DEBUG(dbgs() << " Class: " << Class << "\n");
|
||||
|
||||
switch (Class) {
|
||||
case ARCInstKind::Release: {
|
||||
@ -1065,8 +1121,10 @@ bool ObjCARCOpt::VisitInstructionBottomUp(
|
||||
if (S.MatchWithRetain()) {
|
||||
// Don't do retain+release tracking for ARCInstKind::RetainRV, because
|
||||
// it's better to let it remain as the first instruction after a call.
|
||||
if (Class != ARCInstKind::RetainRV)
|
||||
if (Class != ARCInstKind::RetainRV) {
|
||||
DEBUG(llvm::dbgs() << " Matching with: " << *Inst << "\n");
|
||||
Retains[Inst] = S.GetRRInfo();
|
||||
}
|
||||
S.ClearSequenceProgress();
|
||||
}
|
||||
// A retain moving bottom up can be a use.
|
||||
@ -1153,6 +1211,9 @@ bool ObjCARCOpt::VisitBottomUp(BasicBlock *BB,
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG(llvm::dbgs() << "Before:\n" << BBStates[BB] << "\n"
|
||||
<< "Performing Dataflow:\n");
|
||||
|
||||
// Visit all the instructions, bottom-up.
|
||||
for (BasicBlock::iterator I = BB->end(), E = BB->begin(); I != E; --I) {
|
||||
Instruction *Inst = std::prev(I);
|
||||
@ -1161,7 +1222,7 @@ bool ObjCARCOpt::VisitBottomUp(BasicBlock *BB,
|
||||
if (isa<InvokeInst>(Inst))
|
||||
continue;
|
||||
|
||||
DEBUG(dbgs() << "Visiting " << *Inst << "\n");
|
||||
DEBUG(dbgs() << " Visiting " << *Inst << "\n");
|
||||
|
||||
NestingDetected |= VisitInstructionBottomUp(Inst, BB, Retains, MyStates);
|
||||
}
|
||||
@ -1176,6 +1237,8 @@ bool ObjCARCOpt::VisitBottomUp(BasicBlock *BB,
|
||||
NestingDetected |= VisitInstructionBottomUp(II, BB, Retains, MyStates);
|
||||
}
|
||||
|
||||
DEBUG(llvm::dbgs() << "\nFinal State:\n" << BBStates[BB] << "\n");
|
||||
|
||||
return NestingDetected;
|
||||
}
|
||||
|
||||
@ -1187,6 +1250,8 @@ ObjCARCOpt::VisitInstructionTopDown(Instruction *Inst,
|
||||
ARCInstKind Class = GetARCInstKind(Inst);
|
||||
const Value *Arg = nullptr;
|
||||
|
||||
DEBUG(llvm::dbgs() << " Class: " << Class << "\n");
|
||||
|
||||
switch (Class) {
|
||||
case ARCInstKind::RetainBlock:
|
||||
// In OptimizeIndividualCalls, we have strength reduced all optimizable
|
||||
@ -1211,6 +1276,7 @@ ObjCARCOpt::VisitInstructionTopDown(Instruction *Inst,
|
||||
if (S.MatchWithRelease(MDKindCache, Inst)) {
|
||||
// If we succeed, copy S's RRInfo into the Release -> {Retain Set
|
||||
// Map}. Then we clear S.
|
||||
DEBUG(llvm::dbgs() << " Matching with: " << *Inst << "\n");
|
||||
Releases[Inst] = S.GetRRInfo();
|
||||
S.ClearSequenceProgress();
|
||||
}
|
||||
@ -1272,16 +1338,22 @@ ObjCARCOpt::VisitTopDown(BasicBlock *BB,
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG(llvm::dbgs() << "Before:\n" << BBStates[BB] << "\n"
|
||||
<< "Performing Dataflow:\n");
|
||||
|
||||
// Visit all the instructions, top-down.
|
||||
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
|
||||
Instruction *Inst = I;
|
||||
|
||||
DEBUG(dbgs() << "Visiting " << *Inst << "\n");
|
||||
DEBUG(dbgs() << " Visiting " << *Inst << "\n");
|
||||
|
||||
NestingDetected |= VisitInstructionTopDown(Inst, Releases, MyStates);
|
||||
}
|
||||
|
||||
DEBUG(llvm::dbgs() << "\nState Before Checking for CFG Hazards:\n"
|
||||
<< BBStates[BB] << "\n\n");
|
||||
CheckForCFGHazards(BB, BBStates, MyStates);
|
||||
DEBUG(llvm::dbgs() << "Final State:\n" << BBStates[BB] << "\n");
|
||||
return NestingDetected;
|
||||
}
|
||||
|
||||
|
@ -112,22 +112,22 @@ bool RRInfo::Merge(const RRInfo &Other) {
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
void PtrState::SetKnownPositiveRefCount() {
|
||||
DEBUG(dbgs() << "Setting Known Positive.\n");
|
||||
DEBUG(dbgs() << " Setting Known Positive.\n");
|
||||
KnownPositiveRefCount = true;
|
||||
}
|
||||
|
||||
void PtrState::ClearKnownPositiveRefCount() {
|
||||
DEBUG(dbgs() << "Clearing Known Positive.\n");
|
||||
DEBUG(dbgs() << " Clearing Known Positive.\n");
|
||||
KnownPositiveRefCount = false;
|
||||
}
|
||||
|
||||
void PtrState::SetSeq(Sequence NewSeq) {
|
||||
DEBUG(dbgs() << "Old: " << Seq << "; New: " << NewSeq << "\n");
|
||||
DEBUG(dbgs() << " Old: " << GetSeq() << "; New: " << NewSeq << "\n");
|
||||
Seq = NewSeq;
|
||||
}
|
||||
|
||||
void PtrState::ResetSequenceProgress(Sequence NewSeq) {
|
||||
DEBUG(dbgs() << "Resetting sequence progress.\n");
|
||||
DEBUG(dbgs() << " Resetting sequence progress.\n");
|
||||
SetSeq(NewSeq);
|
||||
Partial = false;
|
||||
RRI.clear();
|
||||
@ -170,7 +170,7 @@ bool BottomUpPtrState::InitBottomUp(ARCMDKindCache &Cache, Instruction *I) {
|
||||
// simple and avoids adding overhead for the non-nested case.
|
||||
bool NestingDetected = false;
|
||||
if (GetSeq() == S_Release || GetSeq() == S_MovableRelease) {
|
||||
DEBUG(dbgs() << "Found nested releases (i.e. a release pair)\n");
|
||||
DEBUG(dbgs() << " Found nested releases (i.e. a release pair)\n");
|
||||
NestingDetected = true;
|
||||
}
|
||||
|
||||
@ -214,14 +214,15 @@ bool BottomUpPtrState::HandlePotentialAlterRefCount(Instruction *Inst,
|
||||
const Value *Ptr,
|
||||
ProvenanceAnalysis &PA,
|
||||
ARCInstKind Class) {
|
||||
Sequence Seq = GetSeq();
|
||||
Sequence S = GetSeq();
|
||||
|
||||
// Check for possible releases.
|
||||
if (!CanAlterRefCount(Inst, Ptr, PA, Class))
|
||||
return false;
|
||||
|
||||
DEBUG(dbgs() << "CanAlterRefCount: Seq: " << Seq << "; " << *Ptr << "\n");
|
||||
switch (Seq) {
|
||||
DEBUG(dbgs() << " CanAlterRefCount: Seq: " << S << "; " << *Ptr
|
||||
<< "\n");
|
||||
switch (S) {
|
||||
case S_Use:
|
||||
SetSeq(S_CanRelease);
|
||||
return true;
|
||||
@ -246,7 +247,8 @@ void BottomUpPtrState::HandlePotentialUse(BasicBlock *BB, Instruction *Inst,
|
||||
case S_Release:
|
||||
case S_MovableRelease:
|
||||
if (CanUse(Inst, Ptr, PA, Class)) {
|
||||
DEBUG(dbgs() << "CanUse: Seq: " << Seq << "; " << *Ptr << "\n");
|
||||
DEBUG(dbgs() << " CanUse: Seq: " << GetSeq() << "; " << *Ptr
|
||||
<< "\n");
|
||||
assert(!HasReverseInsertPts());
|
||||
// If this is an invoke instruction, we're scanning it as part of
|
||||
// one of its successor blocks, since we can't insert code after it
|
||||
@ -257,8 +259,8 @@ void BottomUpPtrState::HandlePotentialUse(BasicBlock *BB, Instruction *Inst,
|
||||
InsertReverseInsertPt(std::next(BasicBlock::iterator(Inst)));
|
||||
SetSeq(S_Use);
|
||||
} else if (Seq == S_Release && IsUser(Class)) {
|
||||
DEBUG(dbgs() << "PreciseReleaseUse: Seq: " << Seq << "; " << *Ptr
|
||||
<< "\n");
|
||||
DEBUG(dbgs() << " PreciseReleaseUse: Seq: " << GetSeq() << "; "
|
||||
<< *Ptr << "\n");
|
||||
// Non-movable releases depend on any possible objc pointer use.
|
||||
SetSeq(S_Stop);
|
||||
assert(!HasReverseInsertPts());
|
||||
@ -271,7 +273,8 @@ void BottomUpPtrState::HandlePotentialUse(BasicBlock *BB, Instruction *Inst,
|
||||
break;
|
||||
case S_Stop:
|
||||
if (CanUse(Inst, Ptr, PA, Class)) {
|
||||
DEBUG(dbgs() << "PreciseStopUse: Seq: " << Seq << "; " << *Ptr << "\n");
|
||||
DEBUG(dbgs() << " PreciseStopUse: Seq: " << GetSeq() << "; "
|
||||
<< *Ptr << "\n");
|
||||
SetSeq(S_Use);
|
||||
}
|
||||
break;
|
||||
@ -350,9 +353,10 @@ bool TopDownPtrState::HandlePotentialAlterRefCount(Instruction *Inst,
|
||||
if (!CanAlterRefCount(Inst, Ptr, PA, Class))
|
||||
return false;
|
||||
|
||||
DEBUG(dbgs() << "CanAlterRefCount: Seq: " << Seq << "; " << *Ptr << "\n");
|
||||
DEBUG(dbgs() << " CanAlterRefCount: Seq: " << GetSeq() << "; " << *Ptr
|
||||
<< "\n");
|
||||
ClearKnownPositiveRefCount();
|
||||
switch (Seq) {
|
||||
switch (GetSeq()) {
|
||||
case S_Retain:
|
||||
SetSeq(S_CanRelease);
|
||||
assert(!HasReverseInsertPts());
|
||||
@ -382,7 +386,8 @@ void TopDownPtrState::HandlePotentialUse(Instruction *Inst, const Value *Ptr,
|
||||
case S_CanRelease:
|
||||
if (!CanUse(Inst, Ptr, PA, Class))
|
||||
return;
|
||||
DEBUG(dbgs() << "CanUse: Seq: " << Seq << "; " << *Ptr << "\n");
|
||||
DEBUG(dbgs() << " CanUse: Seq: " << GetSeq() << "; " << *Ptr
|
||||
<< "\n");
|
||||
SetSeq(S_Use);
|
||||
return;
|
||||
case S_Retain:
|
||||
|
Loading…
x
Reference in New Issue
Block a user