diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-05-16 21:54:37 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-05-16 21:54:37 +0000 |
commit | d6ddc308f0320f1c35618cca29edcbf9418d65de (patch) | |
tree | 177224f4f76a93fb0af1765d215b9f90e11c78ed /lib/CodeGen/IfConversion.cpp | |
parent | 3f8602cf20146e9b7953c56d4fcdc586d52aa6f1 (diff) |
isBlockPredicable() always ignore terminal instructions; add comments.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37126 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/IfConversion.cpp')
-rw-r--r-- | lib/CodeGen/IfConversion.cpp | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/lib/CodeGen/IfConversion.cpp b/lib/CodeGen/IfConversion.cpp index 33ed7e9220..37c729d341 100644 --- a/lib/CodeGen/IfConversion.cpp +++ b/lib/CodeGen/IfConversion.cpp @@ -68,8 +68,7 @@ namespace { std::vector<int> &Candidates); bool IfConvertDiamond(BBInfo &BBI); bool IfConvertTriangle(BBInfo &BBI); - bool isBlockPredicable(MachineBasicBlock *BB, - bool IgnoreTerm = false) const; + bool isBlockPredicable(MachineBasicBlock *BB) const; void PredicateBlock(MachineBasicBlock *BB, std::vector<MachineOperand> &Cond, bool IgnoreTerm = false); @@ -134,15 +133,19 @@ void IfConverter::AnalyzeBlock(MachineBasicBlock *BB) { if (TII->AnalyzeBranch(*BB, BBI.TBB, BBI.FBB, BBI.Cond) || !BBI.TBB || BBI.Cond.size() == 0) return; + // Can't do it if 'true' block is already marked as to be if-converted. AnalyzeBlock(BBI.TBB); BBInfo &TBBI = BBAnalysis[BBI.TBB->getNumber()]; if (TBBI.Kind != ICNotClassfied) return; - + + // No false branch. This BB must end with a conditional branch and a + // fallthrough. if (!BBI.FBB) BBI.FBB = findFalseBlock(BB, BBI.TBB); assert(BBI.FBB && "Expected to find the fallthrough block!"); + // Can't do it if 'false' block is already marked as to be if-converted. AnalyzeBlock(BBI.FBB); BBInfo &FBBI = BBAnalysis[BBI.FBB->getNumber()]; if (FBBI.Kind != ICNotClassfied) @@ -178,6 +181,8 @@ void IfConverter::AnalyzeBlock(MachineBasicBlock *BB) { return; } +/// InitialFunctionAnalysis - Analyze all blocks and find entries for all +/// if-conversion candidates. void IfConverter::InitialFunctionAnalysis(MachineFunction &MF, std::vector<int> &Candidates) { for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) { @@ -189,8 +194,10 @@ void IfConverter::InitialFunctionAnalysis(MachineFunction &MF, } } +/// IfConvertTriangle - If convert a triangle sub-CFG. +/// bool IfConverter::IfConvertTriangle(BBInfo &BBI) { - if (isBlockPredicable(BBI.TBB, true)) { + if (isBlockPredicable(BBI.TBB)) { // Predicate the 'true' block after removing its branch. TII->RemoveBranch(*BBI.TBB); PredicateBlock(BBI.TBB, BBI.Cond); @@ -213,9 +220,10 @@ bool IfConverter::IfConvertTriangle(BBInfo &BBI) { return false; } +/// IfConvertDiamond - If convert a diamond sub-CFG. +/// bool IfConverter::IfConvertDiamond(BBInfo &BBI) { - if (isBlockPredicable(BBI.TBB, true) && - isBlockPredicable(BBI.FBB, true)) { + if (isBlockPredicable(BBI.TBB) && isBlockPredicable(BBI.FBB)) { std::vector<MachineInstr*> Dups; if (!BBI.CMBB) { // No common merge block. Check if the terminators (e.g. return) are @@ -230,7 +238,8 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI) { ++TT; ++FT; } - + // One of the two pathes have more terminators, make sure they are all + // predicable. while (TT != BBI.TBB->end()) if (!TT->isPredicable()) return false; // Can't if-convert. Abort! @@ -272,13 +281,11 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI) { /// isBlockPredicable - Returns true if the block is predicable. In most /// cases, that means all the instructions in the block has M_PREDICABLE flag. -/// If IgnoreTerm is true, assume all the terminator instructions can be -/// converted or deleted. -bool IfConverter::isBlockPredicable(MachineBasicBlock *BB, - bool IgnoreTerm) const { +/// It assume all the terminator instructions can be converted or deleted. +bool IfConverter::isBlockPredicable(MachineBasicBlock *BB) const { for (MachineBasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) { - if (IgnoreTerm && TII->isTerminatorInstr(I->getOpcode())) + if (TII->isTerminatorInstr(I->getOpcode())) continue; if (!I->isPredicable()) return false; @@ -295,7 +302,10 @@ void IfConverter::PredicateBlock(MachineBasicBlock *BB, I != E; ++I) { if (IgnoreTerm && TII->isTerminatorInstr(I->getOpcode())) continue; - TII->PredicateInstruction(&*I, Cond); + if (!TII->PredicateInstruction(&*I, Cond)) { + cerr << "Unable to predication " << *I << "!\n"; + abort(); + } } } |