Changes in directory llvm/lib/CodeGen:
IfConversion.cpp updated: 1.8 -> 1.9 --- Log message: Change to depth-first traversal. --- Diffs of the changes: (+22 -11) IfConversion.cpp | 33 ++++++++++++++++++++++----------- 1 files changed, 22 insertions(+), 11 deletions(-) Index: llvm/lib/CodeGen/IfConversion.cpp diff -u llvm/lib/CodeGen/IfConversion.cpp:1.8 llvm/lib/CodeGen/IfConversion.cpp:1.9 --- llvm/lib/CodeGen/IfConversion.cpp:1.8 Fri May 18 13:14:37 2007 +++ llvm/lib/CodeGen/IfConversion.cpp Fri May 18 14:26:33 2007 @@ -19,6 +19,7 @@ #include "llvm/Target/TargetLowering.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Support/Debug.h" +#include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/Statistic.h" using namespace llvm; @@ -237,8 +238,11 @@ /// if-conversion candidates. void IfConverter::InitialFunctionAnalysis(MachineFunction &MF, std::vector<int> &Candidates) { - for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) { - MachineBasicBlock *BB = I; + std::set<MachineBasicBlock*> Visited; + MachineBasicBlock *Entry = MF.begin(); + for (df_ext_iterator<MachineBasicBlock*> DFI = df_ext_begin(Entry, Visited), + E = df_ext_end(Entry, Visited); DFI != E; ++DFI) { + MachineBasicBlock *BB = *DFI; StructuralAnalysis(BB); BBInfo &BBI = BBAnalysis[BB->getNumber()]; if (BBI.Kind == ICTriangleEntry || BBI.Kind == ICDiamondEntry) @@ -379,23 +383,30 @@ TII->InsertBranch(*BBI.FalseBB, *BBI.FalseBB->succ_begin(), NULL,NewCond); // Merge the 'true' and 'false' blocks by copying the instructions - // from the 'false' block to the 'true' block. - MergeBlocks(TrueBBI, FalseBBI); + // from the 'false' block to the 'true' block. That is, unless the true + // block would clobber the predicate, in that case, do the opposite. + BBInfo *CvtBBI; + if (!TrueBBI.ClobbersPred) { + MergeBlocks(TrueBBI, FalseBBI); + CvtBBI = &TrueBBI; + } else { + MergeBlocks(FalseBBI, TrueBBI); + CvtBBI = &FalseBBI; + } // Remove the conditional branch from entry to the blocks. BBI.Size -= TII->RemoveBranch(*BBI.BB); // Merge the combined block into the entry of the diamond if the entry - // block is the only predecessor. Otherwise, insert an unconditional - // branch. - BBInfo *CvtBBI = &TrueBBI; - if (BBI.TrueBB->pred_size() == 1) { - BBI.BB->removeSuccessor(BBI.TrueBB); - MergeBlocks(BBI, TrueBBI); + // block is its only predecessor. Otherwise, insert an unconditional + // branch from entry to the if-converted block. + if (CvtBBI->BB->pred_size() == 1) { + BBI.BB->removeSuccessor(CvtBBI->BB); + MergeBlocks(BBI, *CvtBBI); CvtBBI = &BBI; } else { std::vector<MachineOperand> NoCond; - TII->InsertBranch(*BBI.BB, BBI.TrueBB, NULL, NoCond); + TII->InsertBranch(*BBI.BB, CvtBBI->BB, NULL, NoCond); } // If the if-converted block fallthrough into the tail block, then _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits