forked from OSchip/llvm-project
Refactor code to create getFallThrough method in MachineBasicBlock.
Differential Revision: https://reviews.llvm.org/D27264 llvm-svn: 299227
This commit is contained in:
parent
7d7e1e0218
commit
f1a30f1800
|
@ -455,10 +455,19 @@ public:
|
|||
/// other block.
|
||||
bool isLayoutSuccessor(const MachineBasicBlock *MBB) const;
|
||||
|
||||
/// Return true if the block can implicitly transfer control to the block
|
||||
/// after it by falling off the end of it. This should return false if it can
|
||||
/// reach the block after it, but it uses an explicit branch to do so (e.g., a
|
||||
/// table jump). True is a conservative answer.
|
||||
|
||||
/// Return the fallthrough block if the block can implicitly
|
||||
/// transfer control to the block after it by falling off the end of
|
||||
/// it. This should return null if it can reach the block after
|
||||
/// it, but it uses an explicit branch to do so (e.g., a table
|
||||
/// jump). Non-null return is a conservative answer.
|
||||
MachineBasicBlock *getFallThrough();
|
||||
|
||||
/// Return true if the block can implicitly transfer control to the
|
||||
/// block after it by falling off the end of it. This should return
|
||||
/// false if it can reach the block after it, but it uses an
|
||||
/// explicit branch to do so (e.g., a table jump). True is a
|
||||
/// conservative answer.
|
||||
bool canFallThrough();
|
||||
|
||||
/// Returns a pointer to the first instruction in this block that is not a
|
||||
|
|
|
@ -688,16 +688,16 @@ bool MachineBasicBlock::isLayoutSuccessor(const MachineBasicBlock *MBB) const {
|
|||
return std::next(I) == MachineFunction::const_iterator(MBB);
|
||||
}
|
||||
|
||||
bool MachineBasicBlock::canFallThrough() {
|
||||
MachineBasicBlock *MachineBasicBlock::getFallThrough() {
|
||||
MachineFunction::iterator Fallthrough = getIterator();
|
||||
++Fallthrough;
|
||||
// If FallthroughBlock is off the end of the function, it can't fall through.
|
||||
if (Fallthrough == getParent()->end())
|
||||
return false;
|
||||
return nullptr;
|
||||
|
||||
// If FallthroughBlock isn't a successor, no fallthrough is possible.
|
||||
if (!isSuccessor(&*Fallthrough))
|
||||
return false;
|
||||
return nullptr;
|
||||
|
||||
// Analyze the branches, if any, at the end of the block.
|
||||
MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
|
||||
|
@ -709,25 +709,31 @@ bool MachineBasicBlock::canFallThrough() {
|
|||
// is possible. The isPredicated check is needed because this code can be
|
||||
// called during IfConversion, where an instruction which is normally a
|
||||
// Barrier is predicated and thus no longer an actual control barrier.
|
||||
return empty() || !back().isBarrier() || TII->isPredicated(back());
|
||||
return (empty() || !back().isBarrier() || TII->isPredicated(back()))
|
||||
? &*Fallthrough
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
// If there is no branch, control always falls through.
|
||||
if (!TBB) return true;
|
||||
if (!TBB) return &*Fallthrough;
|
||||
|
||||
// If there is some explicit branch to the fallthrough block, it can obviously
|
||||
// reach, even though the branch should get folded to fall through implicitly.
|
||||
if (MachineFunction::iterator(TBB) == Fallthrough ||
|
||||
MachineFunction::iterator(FBB) == Fallthrough)
|
||||
return true;
|
||||
return &*Fallthrough;
|
||||
|
||||
// If it's an unconditional branch to some block not the fall through, it
|
||||
// doesn't fall through.
|
||||
if (Cond.empty()) return false;
|
||||
if (Cond.empty()) return nullptr;
|
||||
|
||||
// Otherwise, if it is conditional and has no explicit false block, it falls
|
||||
// through.
|
||||
return FBB == nullptr;
|
||||
return (FBB == nullptr) ? &*Fallthrough : nullptr;
|
||||
}
|
||||
|
||||
bool MachineBasicBlock::canFallThrough() {
|
||||
return getFallThrough() != nullptr;
|
||||
}
|
||||
|
||||
MachineBasicBlock *MachineBasicBlock::SplitCriticalEdge(MachineBasicBlock *Succ,
|
||||
|
|
Loading…
Reference in New Issue