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:
Evan Cheng 2007-06-15 21:18:05 +00:00
parent d42e56e166
commit a2acf840a7

View File

@ -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