Changes in directory llvm/lib/CodeGen:
BranchFolding.cpp updated: 1.16 -> 1.17 --- Log message: Transform code like: jle FOO jmp BAR BAR: into: jle FOO BAR: ... whoa! --- Diffs of the changes: (+13 -2) BranchFolding.cpp | 15 +++++++++++++-- 1 files changed, 13 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/BranchFolding.cpp diff -u llvm/lib/CodeGen/BranchFolding.cpp:1.16 llvm/lib/CodeGen/BranchFolding.cpp:1.17 --- llvm/lib/CodeGen/BranchFolding.cpp:1.16 Sat Oct 21 00:08:28 2006 +++ llvm/lib/CodeGen/BranchFolding.cpp Sat Oct 21 00:43:30 2006 @@ -30,7 +30,7 @@ static Statistic<> NumDeadBlocks("branchfold", "Number of dead blocks removed"); static Statistic<> NumBranchOpts("branchfold", "Number of branches optimized"); static Statistic<> NumTailMerge ("branchfold", "Number of block tails merged"); -static cl::opt<bool> EnableTailMerge("enable-tail-merge"); +static cl::opt<bool> EnableTailMerge("enable-tail-merge", cl::init(false)); namespace { struct BranchFolder : public MachineFunctionPass { @@ -442,7 +442,8 @@ !PriorCond.empty(), MBB); // If the previous branch is conditional and both conditions go to the same - // destination, remove the branch, replacing it with an unconditional one. + // destination, remove the branch, replacing it with an unconditional one or + // a fall-through. if (PriorTBB && PriorTBB == PriorFBB) { TII->RemoveBranch(PrevBB); PriorCond.clear(); @@ -461,6 +462,16 @@ ++NumBranchOpts; return OptimizeBlock(MBB); } + + // If the prior block branches somewhere else on the condition and here if + // the condition is false, remove the uncond second branch. + if (PriorFBB == &*MBB) { + TII->RemoveBranch(PrevBB); + TII->InsertBranch(PrevBB, PriorTBB, 0, PriorCond); + MadeChange = true; + ++NumBranchOpts; + return OptimizeBlock(MBB); + } } // Analyze the branch in the current block. _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits