mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 22:04:55 +00:00
Revert my if-conversion cleanup since it caused a bunch of nightly test
regressions. --- Reverse-merging r106939 into '.': U test/CodeGen/Thumb2/thumb2-ifcvt3.ll U lib/CodeGen/IfConversion.cpp git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106951 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d50e9e2566
commit
de4fe23139
@ -186,7 +186,7 @@ namespace {
|
||||
SmallVectorImpl<MachineOperand> &Cond,
|
||||
SmallSet<unsigned, 4> &Redefs,
|
||||
bool IgnoreBr = false);
|
||||
void MergeBlocks(BBInfo &ToBBI, BBInfo &FromBBI, bool AddEdges = true);
|
||||
void MergeBlocks(BBInfo &ToBBI, BBInfo &FromBBI);
|
||||
|
||||
bool MeetIfcvtSizeLimit(MachineBasicBlock &BB, unsigned Size) const {
|
||||
return Size > 0 && TII->isProfitableToIfCvt(BB, Size);
|
||||
@ -1036,10 +1036,6 @@ bool IfConverter::IfConvertSimple(BBInfo &BBI, IfcvtKind Kind) {
|
||||
IterIfcvt = false;
|
||||
}
|
||||
|
||||
// RemoveExtraEdges won't work if the block has an unanalyzable branch,
|
||||
// which is typically the case for IfConvertSimple, so explicitly remove
|
||||
// CvtBBI as a successor.
|
||||
BBI.BB->removeSuccessor(CvtBBI->BB);
|
||||
RemoveExtraEdges(BBI);
|
||||
|
||||
// Update block info. BB can be iteratively if-converted.
|
||||
@ -1102,7 +1098,8 @@ bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {
|
||||
InitPredRedefs(NextBBI->BB, Redefs, TRI);
|
||||
|
||||
bool HasEarlyExit = CvtBBI->FalseBB != NULL;
|
||||
if (CvtBBI->BB->pred_size() > 1) {
|
||||
bool DupBB = CvtBBI->BB->pred_size() > 1;
|
||||
if (DupBB) {
|
||||
BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
|
||||
// Copy instructions in the true block, predicate them, and add them to
|
||||
// the entry block.
|
||||
@ -1114,7 +1111,7 @@ bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {
|
||||
|
||||
// Now merge the entry of the triangle with the true block.
|
||||
BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
|
||||
MergeBlocks(BBI, *CvtBBI, false);
|
||||
MergeBlocks(BBI, *CvtBBI);
|
||||
}
|
||||
|
||||
// If 'true' block has a 'false' successor, add an exit branch to it.
|
||||
@ -1187,9 +1184,9 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
|
||||
return false;
|
||||
}
|
||||
|
||||
// Put the predicated instructions from the 'true' block before the
|
||||
// instructions from the 'false' block, unless the true block would clobber
|
||||
// the predicate, in which case, do the opposite.
|
||||
// Merge the 'true' and 'false' blocks by copying the instructions
|
||||
// from the 'false' block to the 'true' block. That is, unless the true
|
||||
// block would clobber the predicate, in that case, do the opposite.
|
||||
BBInfo *BBI1 = &TrueBBI;
|
||||
BBInfo *BBI2 = &FalseBBI;
|
||||
SmallVector<MachineOperand, 4> RevCond(BBI.BrCond.begin(), BBI.BrCond.end());
|
||||
@ -1279,8 +1276,8 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
|
||||
PredicateBlock(*BBI2, DI2, *Cond2, Redefs);
|
||||
|
||||
// Merge the true block into the entry of the diamond.
|
||||
MergeBlocks(BBI, *BBI1, TailBB == 0);
|
||||
MergeBlocks(BBI, *BBI2, TailBB == 0);
|
||||
MergeBlocks(BBI, *BBI1);
|
||||
MergeBlocks(BBI, *BBI2);
|
||||
|
||||
// If the if-converted block falls through or unconditionally branches into
|
||||
// the tail block, and the tail block does not have other predecessors, then
|
||||
@ -1289,20 +1286,15 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
|
||||
if (TailBB) {
|
||||
BBInfo TailBBI = BBAnalysis[TailBB->getNumber()];
|
||||
if (TailBB->pred_size() == 1 && !TailBBI.HasFallThrough) {
|
||||
BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
|
||||
MergeBlocks(BBI, TailBBI);
|
||||
TailBBI.IsDone = true;
|
||||
} else {
|
||||
BBI.BB->addSuccessor(TailBB);
|
||||
InsertUncondBranch(BBI.BB, TailBB, TII);
|
||||
BBI.HasFallThrough = false;
|
||||
}
|
||||
}
|
||||
|
||||
// RemoveExtraEdges won't work if the block has an unanalyzable branch,
|
||||
// which can happen here if TailBB is unanalyzable and is merged, so
|
||||
// explicitly remove BBI1 and BBI2 as successors.
|
||||
BBI.BB->removeSuccessor(BBI1->BB);
|
||||
BBI.BB->removeSuccessor(BBI2->BB);
|
||||
RemoveExtraEdges(BBI);
|
||||
|
||||
// Update block info.
|
||||
@ -1375,19 +1367,17 @@ void IfConverter::CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI,
|
||||
UpdatePredRedefs(MI, Redefs, TRI, true);
|
||||
}
|
||||
|
||||
if (!IgnoreBr) {
|
||||
std::vector<MachineBasicBlock *> Succs(FromBBI.BB->succ_begin(),
|
||||
FromBBI.BB->succ_end());
|
||||
MachineBasicBlock *NBB = getNextBlock(FromBBI.BB);
|
||||
MachineBasicBlock *FallThrough = FromBBI.HasFallThrough ? NBB : NULL;
|
||||
std::vector<MachineBasicBlock *> Succs(FromBBI.BB->succ_begin(),
|
||||
FromBBI.BB->succ_end());
|
||||
MachineBasicBlock *NBB = getNextBlock(FromBBI.BB);
|
||||
MachineBasicBlock *FallThrough = FromBBI.HasFallThrough ? NBB : NULL;
|
||||
|
||||
for (unsigned i = 0, e = Succs.size(); i != e; ++i) {
|
||||
MachineBasicBlock *Succ = Succs[i];
|
||||
// Fallthrough edge can't be transferred.
|
||||
if (Succ == FallThrough)
|
||||
continue;
|
||||
ToBBI.BB->addSuccessor(Succ);
|
||||
}
|
||||
for (unsigned i = 0, e = Succs.size(); i != e; ++i) {
|
||||
MachineBasicBlock *Succ = Succs[i];
|
||||
// Fallthrough edge can't be transferred.
|
||||
if (Succ == FallThrough)
|
||||
continue;
|
||||
ToBBI.BB->addSuccessor(Succ);
|
||||
}
|
||||
|
||||
std::copy(FromBBI.Predicate.begin(), FromBBI.Predicate.end(),
|
||||
@ -1401,14 +1391,21 @@ void IfConverter::CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI,
|
||||
}
|
||||
|
||||
/// MergeBlocks - Move all instructions from FromBB to the end of ToBB.
|
||||
/// This will leave FromBB as an empty block, so remove all of its
|
||||
/// successor edges except for the fall-through edge. If AddEdges is true,
|
||||
/// i.e., when FromBBI's branch is being moved, add those successor edges to
|
||||
/// ToBBI.
|
||||
void IfConverter::MergeBlocks(BBInfo &ToBBI, BBInfo &FromBBI, bool AddEdges) {
|
||||
///
|
||||
void IfConverter::MergeBlocks(BBInfo &ToBBI, BBInfo &FromBBI) {
|
||||
ToBBI.BB->splice(ToBBI.BB->end(),
|
||||
FromBBI.BB, FromBBI.BB->begin(), FromBBI.BB->end());
|
||||
|
||||
// Redirect all branches to FromBB to ToBB.
|
||||
std::vector<MachineBasicBlock *> Preds(FromBBI.BB->pred_begin(),
|
||||
FromBBI.BB->pred_end());
|
||||
for (unsigned i = 0, e = Preds.size(); i != e; ++i) {
|
||||
MachineBasicBlock *Pred = Preds[i];
|
||||
if (Pred == ToBBI.BB)
|
||||
continue;
|
||||
Pred->ReplaceUsesOfBlockWith(FromBBI.BB, ToBBI.BB);
|
||||
}
|
||||
|
||||
std::vector<MachineBasicBlock *> Succs(FromBBI.BB->succ_begin(),
|
||||
FromBBI.BB->succ_end());
|
||||
MachineBasicBlock *NBB = getNextBlock(FromBBI.BB);
|
||||
@ -1420,8 +1417,7 @@ void IfConverter::MergeBlocks(BBInfo &ToBBI, BBInfo &FromBBI, bool AddEdges) {
|
||||
if (Succ == FallThrough)
|
||||
continue;
|
||||
FromBBI.BB->removeSuccessor(Succ);
|
||||
if (AddEdges)
|
||||
ToBBI.BB->addSuccessor(Succ);
|
||||
ToBBI.BB->addSuccessor(Succ);
|
||||
}
|
||||
|
||||
// Now FromBBI always falls through to the next block!
|
||||
|
@ -23,7 +23,7 @@ bb52: ; preds = %newFuncRoot
|
||||
; CHECK: movne
|
||||
; CHECK: moveq
|
||||
; CHECK: pop
|
||||
; CHECK-NEXT: @ BB#1:
|
||||
; CHECK-NEXT: LBB0_1:
|
||||
%0 = load i64* @posed, align 4 ; <i64> [#uses=3]
|
||||
%1 = sub i64 %0, %.reload78 ; <i64> [#uses=1]
|
||||
%2 = ashr i64 %1, 1 ; <i64> [#uses=3]
|
||||
|
Loading…
Reference in New Issue
Block a user