Skip to content

Commit

Permalink
Change ambiguous uses of term 'funclet' to 'EH scopes'. NFC.
Browse files Browse the repository at this point in the history
Summary:
`getEHScopeMembership()` function is used not only for funclet-based
EHs; they apply to all EH schemes that use the scoped IR
(catchpad/cleanuppad/...). D47005 (rL333045) changed some of the uses of
the term 'funclet' to 'EH scopes' in case they apply to all scoped EH,
and this fixes more of them. For `FuncletLayout` pass, I left it as is
because the pass is only used for funclet-based EH.

Reviewers: majnemer

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D47611

llvm-svn: 333711
  • Loading branch information
aheejin committed Jun 1, 2018
1 parent d51fbfc commit d69acf3
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 48 deletions.
36 changes: 18 additions & 18 deletions llvm/lib/CodeGen/Analysis.cpp
Expand Up @@ -629,9 +629,9 @@ bool llvm::returnTypeIsEligibleForTailCall(const Function *F,
return true;
}

static void
collectEHScopeMembers(DenseMap<const MachineBasicBlock *, int> &ScopeMembership,
int Scope, const MachineBasicBlock *MBB) {
static void collectEHScopeMembers(
DenseMap<const MachineBasicBlock *, int> &EHScopeMembership, int EHScope,
const MachineBasicBlock *MBB) {
SmallVector<const MachineBasicBlock *, 16> Worklist = {MBB};
while (!Worklist.empty()) {
const MachineBasicBlock *Visiting = Worklist.pop_back_val();
Expand All @@ -640,11 +640,11 @@ collectEHScopeMembers(DenseMap<const MachineBasicBlock *, int> &ScopeMembership,
continue;

// Add this MBB to our scope.
auto P = ScopeMembership.insert(std::make_pair(Visiting, Scope));
auto P = EHScopeMembership.insert(std::make_pair(Visiting, EHScope));

// Don't revisit blocks.
if (!P.second) {
assert(P.first->second == Scope && "MBB is part of two scopes!");
assert(P.first->second == EHScope && "MBB is part of two scopes!");
continue;
}

Expand All @@ -660,24 +660,24 @@ collectEHScopeMembers(DenseMap<const MachineBasicBlock *, int> &ScopeMembership,

DenseMap<const MachineBasicBlock *, int>
llvm::getEHScopeMembership(const MachineFunction &MF) {
DenseMap<const MachineBasicBlock *, int> ScopeMembership;
DenseMap<const MachineBasicBlock *, int> EHScopeMembership;

// We don't have anything to do if there aren't any EH pads.
if (!MF.hasEHScopes())
return ScopeMembership;
return EHScopeMembership;

int EntryBBNumber = MF.front().getNumber();
bool IsSEH = isAsynchronousEHPersonality(
classifyEHPersonality(MF.getFunction().getPersonalityFn()));

const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
SmallVector<const MachineBasicBlock *, 16> ScopeBlocks;
SmallVector<const MachineBasicBlock *, 16> EHScopeBlocks;
SmallVector<const MachineBasicBlock *, 16> UnreachableBlocks;
SmallVector<const MachineBasicBlock *, 16> SEHCatchPads;
SmallVector<std::pair<const MachineBasicBlock *, int>, 16> CatchRetSuccessors;
for (const MachineBasicBlock &MBB : MF) {
if (MBB.isEHScopeEntry()) {
ScopeBlocks.push_back(&MBB);
EHScopeBlocks.push_back(&MBB);
} else if (IsSEH && MBB.isEHPad()) {
SEHCatchPads.push_back(&MBB);
} else if (MBB.pred_empty()) {
Expand All @@ -700,24 +700,24 @@ llvm::getEHScopeMembership(const MachineFunction &MF) {
}

// We don't have anything to do if there aren't any EH pads.
if (ScopeBlocks.empty())
return ScopeMembership;
if (EHScopeBlocks.empty())
return EHScopeMembership;

// Identify all the basic blocks reachable from the function entry.
collectEHScopeMembers(ScopeMembership, EntryBBNumber, &MF.front());
collectEHScopeMembers(EHScopeMembership, EntryBBNumber, &MF.front());
// All blocks not part of a scope are in the parent function.
for (const MachineBasicBlock *MBB : UnreachableBlocks)
collectEHScopeMembers(ScopeMembership, EntryBBNumber, MBB);
collectEHScopeMembers(EHScopeMembership, EntryBBNumber, MBB);
// Next, identify all the blocks inside the scopes.
for (const MachineBasicBlock *MBB : ScopeBlocks)
collectEHScopeMembers(ScopeMembership, MBB->getNumber(), MBB);
for (const MachineBasicBlock *MBB : EHScopeBlocks)
collectEHScopeMembers(EHScopeMembership, MBB->getNumber(), MBB);
// SEH CatchPads aren't really scopes, handle them separately.
for (const MachineBasicBlock *MBB : SEHCatchPads)
collectEHScopeMembers(ScopeMembership, EntryBBNumber, MBB);
collectEHScopeMembers(EHScopeMembership, EntryBBNumber, MBB);
// Finally, identify all the targets of a catchret.
for (std::pair<const MachineBasicBlock *, int> CatchRetPair :
CatchRetSuccessors)
collectEHScopeMembers(ScopeMembership, CatchRetPair.second,
collectEHScopeMembers(EHScopeMembership, CatchRetPair.second,
CatchRetPair.first);
return ScopeMembership;
return EHScopeMembership;
}
58 changes: 29 additions & 29 deletions llvm/lib/CodeGen/BranchFolding.cpp
Expand Up @@ -164,7 +164,7 @@ void BranchFolder::RemoveDeadBlock(MachineBasicBlock *MBB) {

// Remove the block.
MF->erase(MBB);
FuncletMembership.erase(MBB);
EHScopeMembership.erase(MBB);
if (MLI)
MLI->removeBlock(MBB);
}
Expand Down Expand Up @@ -199,8 +199,8 @@ bool BranchFolder::OptimizeFunction(MachineFunction &MF,
MadeChange |= MBB.CorrectExtraCFGEdges(TBB, FBB, !Cond.empty());
}

// Recalculate funclet membership.
FuncletMembership = getEHScopeMembership(MF);
// Recalculate EH scope membership.
EHScopeMembership = getEHScopeMembership(MF);

bool MadeChangeThisIteration = true;
while (MadeChangeThisIteration) {
Expand Down Expand Up @@ -475,11 +475,11 @@ MachineBasicBlock *BranchFolder::SplitMBBAt(MachineBasicBlock &CurMBB,
if (UpdateLiveIns)
computeAndAddLiveIns(LiveRegs, *NewMBB);

// Add the new block to the funclet.
const auto &FuncletI = FuncletMembership.find(&CurMBB);
if (FuncletI != FuncletMembership.end()) {
auto n = FuncletI->second;
FuncletMembership[NewMBB] = n;
// Add the new block to the EH scope.
const auto &EHScopeI = EHScopeMembership.find(&CurMBB);
if (EHScopeI != EHScopeMembership.end()) {
auto n = EHScopeI->second;
EHScopeMembership[NewMBB] = n;
}

return NewMBB;
Expand Down Expand Up @@ -626,7 +626,7 @@ static bool blockEndsInUnreachable(const MachineBasicBlock *MBB) {
/// SuccBB A common successor of MBB1, MBB2 which are in a canonical form
/// relative to SuccBB
/// PredBB The layout predecessor of SuccBB, if any.
/// FuncletMembership map from block to funclet #.
/// EHScopeMembership map from block to EH scope #.
/// AfterPlacement True if we are merging blocks after layout. Stricter
/// thresholds apply to prevent undoing tail-duplication.
static bool
Expand All @@ -635,15 +635,15 @@ ProfitableToMerge(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2,
MachineBasicBlock::iterator &I1,
MachineBasicBlock::iterator &I2, MachineBasicBlock *SuccBB,
MachineBasicBlock *PredBB,
DenseMap<const MachineBasicBlock *, int> &FuncletMembership,
DenseMap<const MachineBasicBlock *, int> &EHScopeMembership,
bool AfterPlacement) {
// It is never profitable to tail-merge blocks from two different funclets.
if (!FuncletMembership.empty()) {
auto Funclet1 = FuncletMembership.find(MBB1);
assert(Funclet1 != FuncletMembership.end());
auto Funclet2 = FuncletMembership.find(MBB2);
assert(Funclet2 != FuncletMembership.end());
if (Funclet1->second != Funclet2->second)
// It is never profitable to tail-merge blocks from two different EH scopes.
if (!EHScopeMembership.empty()) {
auto EHScope1 = EHScopeMembership.find(MBB1);
assert(EHScope1 != EHScopeMembership.end());
auto EHScope2 = EHScopeMembership.find(MBB2);
assert(EHScope2 != EHScopeMembership.end());
if (EHScope1->second != EHScope2->second)
return false;
}

Expand Down Expand Up @@ -743,7 +743,7 @@ unsigned BranchFolder::ComputeSameTails(unsigned CurHash,
MinCommonTailLength,
CommonTailLen, TrialBBI1, TrialBBI2,
SuccBB, PredBB,
FuncletMembership,
EHScopeMembership,
AfterBlockPlacement)) {
if (CommonTailLen > maxCommonTailLength) {
SameTails.clear();
Expand Down Expand Up @@ -1292,8 +1292,8 @@ bool BranchFolder::OptimizeBranches(MachineFunction &MF) {

// Make sure blocks are numbered in order
MF.RenumberBlocks();
// Renumbering blocks alters funclet membership, recalculate it.
FuncletMembership = getEHScopeMembership(MF);
// Renumbering blocks alters EH scope membership, recalculate it.
EHScopeMembership = getEHScopeMembership(MF);

for (MachineFunction::iterator I = std::next(MF.begin()), E = MF.end();
I != E; ) {
Expand Down Expand Up @@ -1412,22 +1412,22 @@ bool BranchFolder::OptimizeBlock(MachineBasicBlock *MBB) {
MachineFunction::iterator FallThrough = MBB->getIterator();
++FallThrough;

// Make sure MBB and FallThrough belong to the same funclet.
bool SameFunclet = true;
if (!FuncletMembership.empty() && FallThrough != MF.end()) {
auto MBBFunclet = FuncletMembership.find(MBB);
assert(MBBFunclet != FuncletMembership.end());
auto FallThroughFunclet = FuncletMembership.find(&*FallThrough);
assert(FallThroughFunclet != FuncletMembership.end());
SameFunclet = MBBFunclet->second == FallThroughFunclet->second;
// Make sure MBB and FallThrough belong to the same EH scope.
bool SameEHScope = true;
if (!EHScopeMembership.empty() && FallThrough != MF.end()) {
auto MBBEHScope = EHScopeMembership.find(MBB);
assert(MBBEHScope != EHScopeMembership.end());
auto FallThroughEHScope = EHScopeMembership.find(&*FallThrough);
assert(FallThroughEHScope != EHScopeMembership.end());
SameEHScope = MBBEHScope->second == FallThroughEHScope->second;
}

// If this block is empty, make everyone use its fall-through, not the block
// explicitly. Landing pads should not do this since the landing-pad table
// points to this block. Blocks with their addresses taken shouldn't be
// optimized away.
if (IsEmptyBlock(MBB) && !MBB->isEHPad() && !MBB->hasAddressTaken() &&
SameFunclet) {
SameEHScope) {
salvageDebugInfoFromEmptyBlock(TII, *MBB);
// Dead block? Leave for cleanup later.
if (MBB->pred_empty()) return MadeChange;
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/BranchFolding.h
Expand Up @@ -75,7 +75,7 @@ class TargetRegisterInfo;

std::vector<MergePotentialsElt> MergePotentials;
SmallPtrSet<const MachineBasicBlock*, 2> TriedMerging;
DenseMap<const MachineBasicBlock *, int> FuncletMembership;
DenseMap<const MachineBasicBlock *, int> EHScopeMembership;

class SameTailElt {
MPIterator MPIter;
Expand Down
3 changes: 3 additions & 0 deletions llvm/lib/CodeGen/FuncletLayout.cpp
Expand Up @@ -41,6 +41,9 @@ INITIALIZE_PASS(FuncletLayout, DEBUG_TYPE,
"Contiguously Lay Out Funclets", false, false)

bool FuncletLayout::runOnMachineFunction(MachineFunction &F) {
// Even though this gets information from getEHScopeMembership(), this pass is
// only necessary for funclet-based EH personalities, in which these EH scopes
// are outlined at the end.
DenseMap<const MachineBasicBlock *, int> FuncletMembership =
getEHScopeMembership(F);
if (FuncletMembership.empty())
Expand Down

0 comments on commit d69acf3

Please sign in to comment.