aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/IfConversion.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2007-06-01 00:12:12 +0000
committerEvan Cheng <evan.cheng@apple.com>2007-06-01 00:12:12 +0000
commit5f70218c7534d7214cc23b7151ab25771bd3151b (patch)
tree123f6daf0f2245e28fd24d7c2fe9a3c835b78843 /lib/CodeGen/IfConversion.cpp
parent243f348c2af54fd973a3d3dd936f8085167549f0 (diff)
Allow multiple ifcvt candidates to share children blocks; add some debugging code.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37379 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/IfConversion.cpp')
-rw-r--r--lib/CodeGen/IfConversion.cpp27
1 files changed, 20 insertions, 7 deletions
diff --git a/lib/CodeGen/IfConversion.cpp b/lib/CodeGen/IfConversion.cpp
index 637990971e..80b86b8458 100644
--- a/lib/CodeGen/IfConversion.cpp
+++ b/lib/CodeGen/IfConversion.cpp
@@ -11,7 +11,8 @@
//
//===----------------------------------------------------------------------===//
-#define DEBUG_TYPE "ifconversion"
+#define DEBUG_TYPE "ifcvt"
+#include "llvm/Function.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
@@ -105,6 +106,12 @@ namespace {
std::vector<MachineOperand> &Cond,
bool IgnoreTerm = false);
void MergeBlocks(BBInfo &TrueBBI, BBInfo &FalseBBI);
+
+ // IfcvtCandidateCmp - Used to sort if-conversion candidates.
+ static bool IfcvtCandidateCmp(BBInfo* C1, BBInfo* C2){
+ // Favor diamond over triangle, etc.
+ return (unsigned)C1->Kind < (unsigned)C2->Kind;
+ }
};
char IfConverter::ID = 0;
}
@@ -116,9 +123,10 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
TII = MF.getTarget().getInstrInfo();
if (!TII) return false;
+ DOUT << "\nIfcvt: function \'" << MF.getFunction()->getName() << "\'\n";
+
MF.RenumberBlocks();
- unsigned NumBBs = MF.getNumBlockIDs();
- BBAnalysis.resize(NumBBs);
+ BBAnalysis.resize(MF.getNumBlockIDs());
// Look for root nodes, i.e. blocks without successors.
for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I)
@@ -139,13 +147,19 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
switch (BBI.Kind) {
default: assert(false && "Unexpected!");
break;
+ case ICReAnalyze:
+ // One or more of 'childrean' have been modified, abort!
+ break;
case ICEarlyExit:
+ DOUT << "Ifcvt (Early exit): BB#" << BBI.BB->getNumber() << "\n";
Change |= IfConvertEarlyExit(BBI);
break;
case ICTriangle:
+ DOUT << "Ifcvt (Triangle): BB#" << BBI.BB->getNumber() << "\n";
Change |= IfConvertTriangle(BBI);
break;
case ICDiamond:
+ DOUT << "Ifcvt (Diamond): BB#" << BBI.BB->getNumber() << "\n";
Change |= IfConvertDiamond(BBI);
break;
}
@@ -198,8 +212,6 @@ void IfConverter::StructuralAnalysis(MachineBasicBlock *BB) {
// Not a candidate if 'true' block is going to be if-converted.
StructuralAnalysis(BBI.TrueBB);
BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()];
- if (TrueBBI.Kind != ICNotClassfied)
- return;
// TODO: Only handle very simple cases for now.
if (TrueBBI.FalseBB || TrueBBI.BrCond.size())
@@ -214,8 +226,6 @@ void IfConverter::StructuralAnalysis(MachineBasicBlock *BB) {
// Not a candidate if 'false' block is going to be if-converted.
StructuralAnalysis(BBI.FalseBB);
BBInfo &FalseBBI = BBAnalysis[BBI.FalseBB->getNumber()];
- if (FalseBBI.Kind != ICNotClassfied)
- return;
// TODO: Only handle very simple cases for now.
if (FalseBBI.FalseBB || FalseBBI.BrCond.size())
@@ -338,6 +348,9 @@ bool IfConverter::AnalyzeBlocks(MachineFunction &MF,
}
}
+ // Sort to favor more complex ifcvt scheme.
+ std::stable_sort(Candidates.begin(), Candidates.end(), IfcvtCandidateCmp);
+
return Change;
}