mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-13 01:15:32 +00:00
Not every predicable block can be safely duplicated.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37607 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d42e56e166
commit
a2acf840a7
@ -100,6 +100,7 @@ namespace {
|
|||||||
bool IsBrAnalyzable : 1;
|
bool IsBrAnalyzable : 1;
|
||||||
bool HasFallThrough : 1;
|
bool HasFallThrough : 1;
|
||||||
bool IsUnpredicable : 1;
|
bool IsUnpredicable : 1;
|
||||||
|
bool CannotBeCopied : 1;
|
||||||
bool ClobbersPred : 1;
|
bool ClobbersPred : 1;
|
||||||
unsigned NonPredSize;
|
unsigned NonPredSize;
|
||||||
MachineBasicBlock *BB;
|
MachineBasicBlock *BB;
|
||||||
@ -111,7 +112,7 @@ namespace {
|
|||||||
BBInfo() : Kind(ICNotClassfied), IsDone(false), IsBeingAnalyzed(false),
|
BBInfo() : Kind(ICNotClassfied), IsDone(false), IsBeingAnalyzed(false),
|
||||||
IsAnalyzed(false), IsEnqueued(false), IsBrAnalyzable(false),
|
IsAnalyzed(false), IsEnqueued(false), IsBrAnalyzable(false),
|
||||||
HasFallThrough(false), IsUnpredicable(false),
|
HasFallThrough(false), IsUnpredicable(false),
|
||||||
ClobbersPred(false), NonPredSize(0),
|
CannotBeCopied(false), ClobbersPred(false), NonPredSize(0),
|
||||||
BB(0), TrueBB(0), FalseBB(0), TailBB(0) {}
|
BB(0), TrueBB(0), FalseBB(0), TailBB(0) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -334,8 +335,9 @@ bool IfConverter::ValidSimple(BBInfo &TrueBBI) const {
|
|||||||
if (TrueBBI.IsBeingAnalyzed)
|
if (TrueBBI.IsBeingAnalyzed)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (TrueBBI.BB->pred_size() != 1) {
|
if (TrueBBI.BB->pred_size() > 1) {
|
||||||
if (TrueBBI.NonPredSize > TLI->getIfCvtDupBlockSizeLimit())
|
if (TrueBBI.CannotBeCopied ||
|
||||||
|
TrueBBI.NonPredSize > TLI->getIfCvtDupBlockSizeLimit())
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,7 +351,10 @@ bool IfConverter::ValidTriangle(BBInfo &TrueBBI, BBInfo &FalseBBI,
|
|||||||
if (TrueBBI.IsBeingAnalyzed)
|
if (TrueBBI.IsBeingAnalyzed)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (TrueBBI.BB->pred_size() != 1) {
|
if (TrueBBI.BB->pred_size() > 1) {
|
||||||
|
if (TrueBBI.CannotBeCopied)
|
||||||
|
return false;
|
||||||
|
|
||||||
unsigned Size = TrueBBI.NonPredSize;
|
unsigned Size = TrueBBI.NonPredSize;
|
||||||
if (TrueBBI.FalseBB)
|
if (TrueBBI.FalseBB)
|
||||||
++Size;
|
++Size;
|
||||||
@ -420,6 +425,9 @@ void IfConverter::ScanInstructions(BBInfo &BBI) {
|
|||||||
bool SeenCondBr = false;
|
bool SeenCondBr = false;
|
||||||
for (MachineBasicBlock::iterator I = BBI.BB->begin(), E = BBI.BB->end();
|
for (MachineBasicBlock::iterator I = BBI.BB->begin(), E = BBI.BB->end();
|
||||||
I != E; ++I) {
|
I != E; ++I) {
|
||||||
|
if (!BBI.CannotBeCopied && !TII->CanBeDuplicated(I))
|
||||||
|
BBI.CannotBeCopied = true;
|
||||||
|
|
||||||
const TargetInstrDescriptor *TID = I->getInstrDescriptor();
|
const TargetInstrDescriptor *TID = I->getInstrDescriptor();
|
||||||
bool isPredicated = TII->isPredicated(I);
|
bool isPredicated = TII->isPredicated(I);
|
||||||
bool isCondBr = BBI.IsBrAnalyzable &&
|
bool isCondBr = BBI.IsBrAnalyzable &&
|
||||||
@ -721,11 +729,20 @@ bool IfConverter::IfConvertSimple(BBInfo &BBI) {
|
|||||||
BBInfo *NextBBI = &FalseBBI;
|
BBInfo *NextBBI = &FalseBBI;
|
||||||
|
|
||||||
std::vector<MachineOperand> Cond(BBI.BrCond);
|
std::vector<MachineOperand> Cond(BBI.BrCond);
|
||||||
if (BBI.Kind == ICSimpleFalse) {
|
if (BBI.Kind == ICSimpleFalse)
|
||||||
std::swap(CvtBBI, NextBBI);
|
std::swap(CvtBBI, NextBBI);
|
||||||
TII->ReverseBranchCondition(Cond);
|
|
||||||
|
if (CvtBBI->CannotBeCopied && CvtBBI->BB->pred_size() > 1) {
|
||||||
|
// Something has changed. It's no longer safe to predicate this block.
|
||||||
|
BBI.Kind = ICNotClassfied;
|
||||||
|
BBI.IsAnalyzed = false;
|
||||||
|
CvtBBI->IsAnalyzed = false;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (BBI.Kind == ICSimpleFalse)
|
||||||
|
TII->ReverseBranchCondition(Cond);
|
||||||
|
|
||||||
if (CvtBBI->BB->pred_size() > 1) {
|
if (CvtBBI->BB->pred_size() > 1) {
|
||||||
BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
|
BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
|
||||||
// Copy instructions in the true block, predicate them add them to
|
// Copy instructions in the true block, predicate them add them to
|
||||||
@ -777,10 +794,20 @@ bool IfConverter::IfConvertTriangle(BBInfo &BBI) {
|
|||||||
BBInfo *NextBBI = &FalseBBI;
|
BBInfo *NextBBI = &FalseBBI;
|
||||||
|
|
||||||
std::vector<MachineOperand> Cond(BBI.BrCond);
|
std::vector<MachineOperand> Cond(BBI.BrCond);
|
||||||
if (BBI.Kind == ICTriangleFalse || BBI.Kind == ICTriangleFRev) {
|
if (BBI.Kind == ICTriangleFalse || BBI.Kind == ICTriangleFRev)
|
||||||
std::swap(CvtBBI, NextBBI);
|
std::swap(CvtBBI, NextBBI);
|
||||||
TII->ReverseBranchCondition(Cond);
|
|
||||||
|
if (CvtBBI->CannotBeCopied && CvtBBI->BB->pred_size() > 1) {
|
||||||
|
// Something has changed. It's no longer safe to predicate this block.
|
||||||
|
BBI.Kind = ICNotClassfied;
|
||||||
|
BBI.IsAnalyzed = false;
|
||||||
|
CvtBBI->IsAnalyzed = false;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (BBI.Kind == ICTriangleFalse || BBI.Kind == ICTriangleFRev)
|
||||||
|
TII->ReverseBranchCondition(Cond);
|
||||||
|
|
||||||
if (BBI.Kind == ICTriangleRev || BBI.Kind == ICTriangleFRev) {
|
if (BBI.Kind == ICTriangleRev || BBI.Kind == ICTriangleFRev) {
|
||||||
ReverseBranchCondition(*CvtBBI);
|
ReverseBranchCondition(*CvtBBI);
|
||||||
// BB has been changed, modify its predecessors (except for this
|
// BB has been changed, modify its predecessors (except for this
|
||||||
|
Loading…
x
Reference in New Issue
Block a user