forked from OSchip/llvm-project
Revert these. They may have been causing 483_xalancbmk to fail:
$ svn merge -c -91161 https://llvm.org/svn/llvm-project/llvm/trunk --- Reverse-merging r91161 into '.': U lib/CodeGen/BranchFolding.cpp U lib/CodeGen/MachineBasicBlock.cpp $ svn merge -c -91113 https://llvm.org/svn/llvm-project/llvm/trunk --- Reverse-merging r91113 into '.': G lib/CodeGen/MachineBasicBlock.cpp $ svn merge -c -91101 https://llvm.org/svn/llvm-project/llvm/trunk --- Reverse-merging r91101 into '.': U include/llvm/CodeGen/MachineBasicBlock.h G lib/CodeGen/MachineBasicBlock.cpp $ svn merge -c -91092 https://llvm.org/svn/llvm-project/llvm/trunk --- Reverse-merging r91092 into '.': G include/llvm/CodeGen/MachineBasicBlock.h G lib/CodeGen/MachineBasicBlock.cpp llvm-svn: 91376
This commit is contained in:
parent
e8c3b3eca4
commit
e8a525a196
|
@ -327,11 +327,6 @@ public:
|
|||
/// 'Old', change the code and CFG so that it branches to 'New' instead.
|
||||
void ReplaceUsesOfBlockWith(MachineBasicBlock *Old, MachineBasicBlock *New);
|
||||
|
||||
/// BranchesToLandingPad - The basic block is a landing pad or branches only
|
||||
/// to a landing pad. No other instructions are present other than the
|
||||
/// unconditional branch.
|
||||
bool BranchesToLandingPad(const MachineBasicBlock *MBB) const;
|
||||
|
||||
/// CorrectExtraCFGEdges - Various pieces of code can cause excess edges in
|
||||
/// the CFG to be inserted. If we have proven that MBB can only branch to
|
||||
/// DestA and DestB, remove any other MBB successors from the CFG. DestA and
|
||||
|
|
|
@ -1205,11 +1205,11 @@ ReoptimizeBlock:
|
|||
}
|
||||
}
|
||||
|
||||
// If the prior block doesn't fall through into this block and if this block
|
||||
// doesn't fall through into some other block and it's not branching only to a
|
||||
// landing pad, then see if we can find a place to move this block where a
|
||||
// fall-through will happen.
|
||||
if (!PrevBB.canFallThrough() && !MBB->BranchesToLandingPad(MBB)) {
|
||||
// If the prior block doesn't fall through into this block, and if this
|
||||
// block doesn't fall through into some other block, see if we can find a
|
||||
// place to move this block where a fall-through will happen.
|
||||
if (!PrevBB.canFallThrough()) {
|
||||
|
||||
// Now we know that there was no fall-through into this block, check to
|
||||
// see if it has a fall-through into its successor.
|
||||
bool CurFallsThru = MBB->canFallThrough();
|
||||
|
@ -1221,32 +1221,28 @@ ReoptimizeBlock:
|
|||
E = MBB->pred_end(); PI != E; ++PI) {
|
||||
// Analyze the branch at the end of the pred.
|
||||
MachineBasicBlock *PredBB = *PI;
|
||||
MachineFunction::iterator PredNextBB = PredBB; ++PredNextBB;
|
||||
MachineFunction::iterator PredFallthrough = PredBB; ++PredFallthrough;
|
||||
MachineBasicBlock *PredTBB, *PredFBB;
|
||||
SmallVector<MachineOperand, 4> PredCond;
|
||||
if (PredBB != MBB && !PredBB->canFallThrough()
|
||||
&& !TII->AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true)
|
||||
if (PredBB != MBB && !PredBB->canFallThrough() &&
|
||||
!TII->AnalyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true)
|
||||
&& (!CurFallsThru || !CurTBB || !CurFBB)
|
||||
&& (!CurFallsThru || MBB->getNumber() >= PredBB->getNumber())) {
|
||||
// If the current block doesn't fall through, just move it. If the
|
||||
// current block can fall through and does not end with a conditional
|
||||
// branch, we need to append an unconditional jump to the (current)
|
||||
// next block. To avoid a possible compile-time infinite loop, move
|
||||
// blocks only backward in this case.
|
||||
//
|
||||
// Also, if there are already 2 branches here, we cannot add a third.
|
||||
// I.e. we have the case:
|
||||
//
|
||||
// Bcc next
|
||||
// B elsewhere
|
||||
// next:
|
||||
// If the current block doesn't fall through, just move it.
|
||||
// If the current block can fall through and does not end with a
|
||||
// conditional branch, we need to append an unconditional jump to
|
||||
// the (current) next block. To avoid a possible compile-time
|
||||
// infinite loop, move blocks only backward in this case.
|
||||
// Also, if there are already 2 branches here, we cannot add a third;
|
||||
// this means we have the case
|
||||
// Bcc next
|
||||
// B elsewhere
|
||||
// next:
|
||||
if (CurFallsThru) {
|
||||
MachineBasicBlock *NextBB =
|
||||
llvm::next(MachineFunction::iterator(MBB));
|
||||
MachineBasicBlock *NextBB = llvm::next(MachineFunction::iterator(MBB));
|
||||
CurCond.clear();
|
||||
TII->InsertBranch(*MBB, NextBB, 0, CurCond);
|
||||
}
|
||||
|
||||
MBB->moveAfter(PredBB);
|
||||
MadeChange = true;
|
||||
goto ReoptimizeBlock;
|
||||
|
|
|
@ -13,16 +13,15 @@
|
|||
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/BasicBlock.h"
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
#include "llvm/Assembly/Writer.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Target/TargetInstrDesc.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Support/LeakDetector.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Assembly/Writer.h"
|
||||
#include <algorithm>
|
||||
using namespace llvm;
|
||||
|
||||
|
@ -449,28 +448,10 @@ void MachineBasicBlock::ReplaceUsesOfBlockWith(MachineBasicBlock *Old,
|
|||
addSuccessor(New);
|
||||
}
|
||||
|
||||
/// BranchesToLandingPad - The basic block is a landing pad or branches only to
|
||||
/// a landing pad. No other instructions are present other than the
|
||||
/// unconditional branch.
|
||||
bool
|
||||
MachineBasicBlock::BranchesToLandingPad(const MachineBasicBlock *MBB) const {
|
||||
SmallSet<const MachineBasicBlock*, 32> Visited;
|
||||
const MachineBasicBlock *CurMBB = MBB;
|
||||
|
||||
while (!CurMBB->isLandingPad()) {
|
||||
if (CurMBB->succ_size() != 1) break;
|
||||
if (!Visited.insert(CurMBB)) break;
|
||||
CurMBB = *CurMBB->succ_begin();
|
||||
}
|
||||
|
||||
return CurMBB->isLandingPad();
|
||||
}
|
||||
|
||||
/// CorrectExtraCFGEdges - Various pieces of code can cause excess edges in the
|
||||
/// CFG to be inserted. If we have proven that MBB can only branch to DestA and
|
||||
/// DestB, remove any other MBB successors from the CFG. DestA and DestB can
|
||||
/// be null.
|
||||
///
|
||||
/// Besides DestA and DestB, retain other edges leading to LandingPads
|
||||
/// (currently there can be only one; we don't check or require that here).
|
||||
/// Note it is possible that DestA and/or DestB are LandingPads.
|
||||
|
@ -500,17 +481,16 @@ bool MachineBasicBlock::CorrectExtraCFGEdges(MachineBasicBlock *DestA,
|
|||
}
|
||||
|
||||
MachineBasicBlock::succ_iterator SI = succ_begin();
|
||||
const MachineBasicBlock *OrigDestA = DestA, *OrigDestB = DestB;
|
||||
MachineBasicBlock *OrigDestA = DestA, *OrigDestB = DestB;
|
||||
while (SI != succ_end()) {
|
||||
const MachineBasicBlock *MBB = *SI;
|
||||
if (MBB == DestA) {
|
||||
if (*SI == DestA) {
|
||||
DestA = 0;
|
||||
++SI;
|
||||
} else if (MBB == DestB) {
|
||||
} else if (*SI == DestB) {
|
||||
DestB = 0;
|
||||
++SI;
|
||||
} else if (MBB != OrigDestA && MBB != OrigDestB &&
|
||||
BranchesToLandingPad(MBB)) {
|
||||
} else if ((*SI)->isLandingPad() &&
|
||||
*SI!=OrigDestA && *SI!=OrigDestB) {
|
||||
++SI;
|
||||
} else {
|
||||
// Otherwise, this is a superfluous edge, remove it.
|
||||
|
@ -518,14 +498,12 @@ bool MachineBasicBlock::CorrectExtraCFGEdges(MachineBasicBlock *DestA,
|
|||
MadeChange = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!AddedFallThrough) {
|
||||
assert(DestA == 0 && DestB == 0 &&
|
||||
"MachineCFG is missing edges!");
|
||||
} else if (isCond) {
|
||||
assert(DestA == 0 && "MachineCFG is missing edges!");
|
||||
}
|
||||
|
||||
return MadeChange;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue