projects
/
oota-llvm.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
When a load operand is promoted to an extload, replace other uses with uses of extloa...
[oota-llvm.git]
/
lib
/
CodeGen
/
IfConversion.cpp
diff --git
a/lib/CodeGen/IfConversion.cpp
b/lib/CodeGen/IfConversion.cpp
index 87d81ecf69da03d15ad35788c2d8bad0dfdbac53..c61fd17e7911e26a92f27559d1a5af08cb2e6dee 100644
(file)
--- a/
lib/CodeGen/IfConversion.cpp
+++ b/
lib/CodeGen/IfConversion.cpp
@@
-12,6
+12,7
@@
//===----------------------------------------------------------------------===//
#define DEBUG_TYPE "ifcvt"
//===----------------------------------------------------------------------===//
#define DEBUG_TYPE "ifcvt"
+#include "BranchFolding.h"
#include "llvm/Function.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/Function.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
@@
-21,6
+22,8
@@
#include "llvm/Target/TargetMachine.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/raw_ostream.h"
#include "llvm/ADT/DepthFirstIterator.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/DepthFirstIterator.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/STLExtras.h"
@@
-56,7
+59,7
@@
STATISTIC(NumIfConvBBs, "Number of if-converted blocks");
STATISTIC(NumDupBBs, "Number of duplicated blocks");
namespace {
STATISTIC(NumDupBBs, "Number of duplicated blocks");
namespace {
- class
VISIBILITY_HIDDEN
IfConverter : public MachineFunctionPass {
+ class IfConverter : public MachineFunctionPass {
enum IfcvtKind {
ICNotClassfied, // BB data valid, but not classified.
ICSimpleFalse, // Same as ICSimple, but on the false path.
enum IfcvtKind {
ICNotClassfied, // BB data valid, but not classified.
ICSimpleFalse, // Same as ICSimple, but on the false path.
@@
-144,9
+147,10
@@
namespace {
const TargetLowering *TLI;
const TargetInstrInfo *TII;
bool MadeChange;
const TargetLowering *TLI;
const TargetInstrInfo *TII;
bool MadeChange;
+ int FnNum;
public:
static char ID;
public:
static char ID;
- IfConverter() : MachineFunctionPass(&ID) {}
+ IfConverter() : MachineFunctionPass(&ID)
, FnNum(-1)
{}
virtual bool runOnMachineFunction(MachineFunction &MF);
virtual const char *getPassName() const { return "If Converter"; }
virtual bool runOnMachineFunction(MachineFunction &MF);
virtual const char *getPassName() const { return "If Converter"; }
@@
-225,15
+229,14
@@
bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
TII = MF.getTarget().getInstrInfo();
if (!TII) return false;
TII = MF.getTarget().getInstrInfo();
if (!TII) return false;
- static int FnNum = -1;
- DOUT << "\nIfcvt: function (" << ++FnNum << ") \'"
- << MF.getFunction()->getName() << "\'";
+ DEBUG(dbgs() << "\nIfcvt: function (" << ++FnNum << ") \'"
+ << MF.getFunction()->getName() << "\'");
if (FnNum < IfCvtFnStart || (IfCvtFnStop != -1 && FnNum > IfCvtFnStop)) {
if (FnNum < IfCvtFnStart || (IfCvtFnStop != -1 && FnNum > IfCvtFnStop)) {
- D
OUT << " skipped\n"
;
+ D
EBUG(dbgs() << " skipped\n")
;
return false;
}
return false;
}
- D
OUT << "\n"
;
+ D
EBUG(dbgs() << "\n")
;
MF.RenumberBlocks();
BBAnalysis.resize(MF.getNumBlockIDs());
MF.RenumberBlocks();
BBAnalysis.resize(MF.getNumBlockIDs());
@@
-278,13
+281,13
@@
bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
case ICSimpleFalse: {
bool isFalse = Kind == ICSimpleFalse;
if ((isFalse && DisableSimpleF) || (!isFalse && DisableSimple)) break;
case ICSimpleFalse: {
bool isFalse = Kind == ICSimpleFalse;
if ((isFalse && DisableSimpleF) || (!isFalse && DisableSimple)) break;
- D
OUT
<< "Ifcvt (Simple" << (Kind == ICSimpleFalse ? " false" :"")
- << "): BB#" << BBI.BB->getNumber() << " ("
- << ((Kind == ICSimpleFalse)
- ? BBI.FalseBB->getNumber()
-
: BBI.TrueBB->getNumber()) << ") "
;
+ D
EBUG(dbgs()
<< "Ifcvt (Simple" << (Kind == ICSimpleFalse ? " false" :"")
+
<< "): BB#" << BBI.BB->getNumber() << " ("
+
<< ((Kind == ICSimpleFalse)
+
? BBI.FalseBB->getNumber()
+
: BBI.TrueBB->getNumber()) << ") ")
;
RetVal = IfConvertSimple(BBI, Kind);
RetVal = IfConvertSimple(BBI, Kind);
- D
OUT << (RetVal ? "succeeded!" : "failed!") << "\n"
;
+ D
EBUG(dbgs() << (RetVal ? "succeeded!" : "failed!") << "\n")
;
if (RetVal) {
if (isFalse) NumSimpleFalse++;
else NumSimple++;
if (RetVal) {
if (isFalse) NumSimpleFalse++;
else NumSimple++;
@@
-301,16
+304,16
@@
bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
if (DisableTriangleR && !isFalse && isRev) break;
if (DisableTriangleF && isFalse && !isRev) break;
if (DisableTriangleFR && isFalse && isRev) break;
if (DisableTriangleR && !isFalse && isRev) break;
if (DisableTriangleF && isFalse && !isRev) break;
if (DisableTriangleFR && isFalse && isRev) break;
- D
OUT << "Ifcvt (Triangle"
;
+ D
EBUG(dbgs() << "Ifcvt (Triangle")
;
if (isFalse)
if (isFalse)
- D
OUT << " false"
;
+ D
EBUG(dbgs() << " false")
;
if (isRev)
if (isRev)
- D
OUT << " rev"
;
- D
OUT
<< "): BB#" << BBI.BB->getNumber() << " (T:"
- << BBI.TrueBB->getNumber() << ",F:"
-
<< BBI.FalseBB->getNumber() << ") "
;
+ D
EBUG(dbgs() << " rev")
;
+ D
EBUG(dbgs()
<< "): BB#" << BBI.BB->getNumber() << " (T:"
+
<< BBI.TrueBB->getNumber() << ",F:"
+
<< BBI.FalseBB->getNumber() << ") ")
;
RetVal = IfConvertTriangle(BBI, Kind);
RetVal = IfConvertTriangle(BBI, Kind);
- D
OUT << (RetVal ? "succeeded!" : "failed!") << "\n"
;
+ D
EBUG(dbgs() << (RetVal ? "succeeded!" : "failed!") << "\n")
;
if (RetVal) {
if (isFalse) {
if (isRev) NumTriangleFRev++;
if (RetVal) {
if (isFalse) {
if (isRev) NumTriangleFRev++;
@@
-324,11
+327,11
@@
bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
}
case ICDiamond: {
if (DisableDiamond) break;
}
case ICDiamond: {
if (DisableDiamond) break;
- D
OUT
<< "Ifcvt (Diamond): BB#" << BBI.BB->getNumber() << " (T:"
- << BBI.TrueBB->getNumber() << ",F:"
-
<< BBI.FalseBB->getNumber() << ") "
;
+ D
EBUG(dbgs()
<< "Ifcvt (Diamond): BB#" << BBI.BB->getNumber() << " (T:"
+
<< BBI.TrueBB->getNumber() << ",F:"
+
<< BBI.FalseBB->getNumber() << ") ")
;
RetVal = IfConvertDiamond(BBI, Kind, NumDups, NumDups2);
RetVal = IfConvertDiamond(BBI, Kind, NumDups, NumDups2);
- D
OUT << (RetVal ? "succeeded!" : "failed!") << "\n"
;
+ D
EBUG(dbgs() << (RetVal ? "succeeded!" : "failed!") << "\n")
;
if (RetVal) NumDiamonds++;
break;
}
if (RetVal) NumDiamonds++;
break;
}
@@
-358,6
+361,13
@@
bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
Roots.clear();
BBAnalysis.clear();
Roots.clear();
BBAnalysis.clear();
+ if (MadeChange) {
+ BranchFolder BF(false);
+ BF.OptimizeFunction(MF, TII,
+ MF.getTarget().getRegisterInfo(),
+ getAnalysisIfAvailable<MachineModuleInfo>());
+ }
+
return MadeChange;
}
return MadeChange;
}
@@
-547,7
+557,11
@@
void IfConverter::ScanInstructions(BBInfo &BBI) {
// fallthrough.
if (!BBI.FalseBB)
BBI.FalseBB = findFalseBlock(BBI.BB, BBI.TrueBB);
// fallthrough.
if (!BBI.FalseBB)
BBI.FalseBB = findFalseBlock(BBI.BB, BBI.TrueBB);
- assert(BBI.FalseBB && "Expected to find the fallthrough block!");
+ if (!BBI.FalseBB) {
+ // Malformed bcc? True and false blocks are the same?
+ BBI.IsUnpredicable = true;
+ return;
+ }
}
// Then scan all the instructions.
}
// Then scan all the instructions.
@@
-594,7
+608,7
@@
void IfConverter::ScanInstructions(BBInfo &BBI) {
if (TII->DefinesPredicate(I, PredDefs))
BBI.ClobbersPred = true;
if (TII->DefinesPredicate(I, PredDefs))
BBI.ClobbersPred = true;
- if (!TI
D.isPredicable(
)) {
+ if (!TI
I->isPredicable(I
)) {
BBI.IsUnpredicable = true;
return;
}
BBI.IsUnpredicable = true;
return;
}
@@
-663,6
+677,13
@@
IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
return BBI;
}
return BBI;
}
+ // Do not ifcvt if true and false fallthrough blocks are the same.
+ if (!BBI.FalseBB) {
+ BBI.IsBeingAnalyzed = false;
+ BBI.IsAnalyzed = true;
+ return BBI;
+ }
+
BBInfo &TrueBBI = AnalyzeBlock(BBI.TrueBB, Tokens);
BBInfo &FalseBBI = AnalyzeBlock(BBI.FalseBB, Tokens);
BBInfo &TrueBBI = AnalyzeBlock(BBI.TrueBB, Tokens);
BBInfo &FalseBBI = AnalyzeBlock(BBI.FalseBB, Tokens);
@@
-947,9
+968,7
@@
bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {
// Predicate the 'true' block after removing its branch.
CvtBBI->NonPredSize -= TII->RemoveBranch(*CvtBBI->BB);
PredicateBlock(*CvtBBI, CvtBBI->BB->end(), Cond);
// Predicate the 'true' block after removing its branch.
CvtBBI->NonPredSize -= TII->RemoveBranch(*CvtBBI->BB);
PredicateBlock(*CvtBBI, CvtBBI->BB->end(), Cond);
- }
- if (!DupBB) {
// Now merge the entry of the triangle with the true block.
BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
MergeBlocks(BBI, *CvtBBI);
// Now merge the entry of the triangle with the true block.
BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);
MergeBlocks(BBI, *CvtBBI);
@@
-1121,8
+1140,10
@@
void IfConverter::PredicateBlock(BBInfo &BBI,
if (TII->isPredicated(I))
continue;
if (!TII->PredicateInstruction(I, Cond)) {
if (TII->isPredicated(I))
continue;
if (!TII->PredicateInstruction(I, Cond)) {
- cerr << "Unable to predicate " << *I << "!\n";
- abort();
+#ifndef NDEBUG
+ dbgs() << "Unable to predicate " << *I << "!\n";
+#endif
+ llvm_unreachable(0);
}
}
}
}
@@
-1155,8
+1176,10
@@
void IfConverter::CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI,
if (!isPredicated)
if (!TII->PredicateInstruction(MI, Cond)) {
if (!isPredicated)
if (!TII->PredicateInstruction(MI, Cond)) {
- cerr << "Unable to predicate " << *MI << "!\n";
- abort();
+#ifndef NDEBUG
+ dbgs() << "Unable to predicate " << *I << "!\n";
+#endif
+ llvm_unreachable(0);
}
}
}
}
@@
-1214,7
+1237,7
@@
void IfConverter::MergeBlocks(BBInfo &ToBBI, BBInfo &FromBBI) {
}
// Now FromBBI always falls through to the next block!
}
// Now FromBBI always falls through to the next block!
- if (NBB)
+ if (NBB
&& !FromBBI.BB->isSuccessor(NBB)
)
FromBBI.BB->addSuccessor(NBB);
std::copy(FromBBI.Predicate.begin(), FromBBI.Predicate.end(),
FromBBI.BB->addSuccessor(NBB);
std::copy(FromBBI.Predicate.begin(), FromBBI.Predicate.end(),