From a69ebdbebc9a4c53f7172bd084682b6a299594ef Mon Sep 17 00:00:00 2001 From: Dale Johannesen Date: Tue, 29 May 2007 23:47:50 +0000 Subject: [PATCH] Make stable_sort in tail merging actually be stable (it never was, but didn't matter until my last change). Reenable tail merging by default. llvm-svn: 37354 --- llvm/include/llvm/Target/TargetMachine.h | 4 ++-- llvm/lib/CodeGen/BranchFolding.cpp | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/Target/TargetMachine.h b/llvm/include/llvm/Target/TargetMachine.h index 01cbe7d3106a..e7f211bf1513 100644 --- a/llvm/include/llvm/Target/TargetMachine.h +++ b/llvm/include/llvm/Target/TargetMachine.h @@ -187,7 +187,7 @@ public: /// getEnableTailMergeDefault - the default setting for -enable-tail-merge /// on this target. User flag overrides. - virtual const bool getEnableTailMergeDefault() const { return false; } + virtual const bool getEnableTailMergeDefault() const { return true; } /// addPassesToEmitFile - Add passes to the specified pass manager to get the /// specified file emitted. Typically this will involve several steps of code @@ -322,7 +322,7 @@ public: /// getEnableTailMergeDefault - the default setting for -enable-tail-merge /// on this target. User flag overrides. - virtual const bool getEnableTailMergeDefault() const { return false; } + virtual const bool getEnableTailMergeDefault() const { return true; } }; } // End llvm namespace diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp index 1fe2962a365c..c34aeebe0ee0 100644 --- a/llvm/lib/CodeGen/BranchFolding.cpp +++ b/llvm/lib/CodeGen/BranchFolding.cpp @@ -420,6 +420,21 @@ static void FixTail(MachineBasicBlock* CurMBB, MachineBasicBlock *SuccBB, TII->InsertBranch(*CurMBB, SuccBB, NULL, std::vector()); } +static bool MergeCompare(std::pair p, + std::pair q) { + + if (p.first < q.first) + return true; + else if (p.first > q.first) + return false; + else if (p.second->getNumber() < q.second->getNumber()) + return true; + else if (p.second->getNumber() > q.second->getNumber()) + return false; + else + assert(0 && "Predecessor appears twice"); +} + // See if any of the blocks in MergePotentials (which all have a common single // successor, or all have no successor) can be tail-merged. If there is a // successor, any blocks in MergePotentials that are not tail-merged and @@ -435,7 +450,7 @@ bool BranchFolder::TryMergeBlocks(MachineBasicBlock *SuccBB, // Sort by hash value so that blocks with identical end sequences sort // together. - std::stable_sort(MergePotentials.begin(), MergePotentials.end()); + std::stable_sort(MergePotentials.begin(), MergePotentials.end(), MergeCompare); // Walk through equivalence sets looking for actual exact matches. while (MergePotentials.size() > 1) {