diff options
author | Bob Wilson <bob.wilson@apple.com> | 2009-10-28 22:10:20 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@apple.com> | 2009-10-28 22:10:20 +0000 |
commit | 2c04dae715b05017d7d2c19ab4f8cb37c1e650ae (patch) | |
tree | 7302c827c3bf5c86d4afc419d97268738dc4d2e2 /lib/CodeGen/BranchFolding.cpp | |
parent | e841d2f8679f603ec453fe56a3bf9bea97aef303 (diff) |
Reimplement BranchFolding change to avoid tail merging for a 1 instruction
common tail, except when the OptimizeForSize function attribute is present.
Radar 7338114.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85441 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/BranchFolding.cpp')
-rw-r--r-- | lib/CodeGen/BranchFolding.cpp | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/lib/CodeGen/BranchFolding.cpp b/lib/CodeGen/BranchFolding.cpp index 66c5aa5ff7..7bc25ab9e9 100644 --- a/lib/CodeGen/BranchFolding.cpp +++ b/lib/CodeGen/BranchFolding.cpp @@ -18,6 +18,7 @@ #define DEBUG_TYPE "branchfolding" #include "BranchFolding.h" +#include "llvm/Function.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/CodeGen/MachineFunctionPass.h" @@ -465,22 +466,23 @@ unsigned BranchFolder::ComputeSameTails(unsigned CurHash, CurMPIter!=B && CurMPIter->first==CurHash; --CurMPIter) { for (MPIterator I = prior(CurMPIter); I->first==CurHash ; --I) { - unsigned CommonTailLen = ComputeCommonTailLength( - CurMPIter->second, - I->second, - TrialBBI1, TrialBBI2); + unsigned CommonTailLen = ComputeCommonTailLength(CurMPIter->second, + I->second, + TrialBBI1, TrialBBI2); // If we will have to split a block, there should be at least - // minCommonTailLength instructions in common; if not, at worst - // we will be replacing a fallthrough into the common tail with a - // branch, which at worst breaks even with falling through into - // the duplicated common tail, so 1 instruction in common is enough. - // We will always pick a block we do not have to split as the common - // tail if there is one. - // (Empty blocks will get forwarded and need not be considered.) + // minCommonTailLength instructions in common. Otherwise, if we are + // optimizing for code size, 1 instruction in common is enough. At + // worst we will be replacing a fallthrough into the common tail with a + // branch, which at worst breaks even with falling through into the + // duplicated common tail. We will always pick a block we do not have + // to split as the common tail if there is one. (Empty blocks will get + // forwarded and need not be considered.) + MachineFunction *MF = CurMPIter->second->getParent(); if (CommonTailLen >= minCommonTailLength || (CommonTailLen > 0 && - (TrialBBI1==CurMPIter->second->begin() || - TrialBBI2==I->second->begin()))) { + MF->getFunction()->hasFnAttr(Attribute::OptimizeForSize) && + (TrialBBI1 == CurMPIter->second->begin() || + TrialBBI2 == I->second->begin()))) { if (CommonTailLen > maxCommonTailLength) { SameTails.clear(); maxCommonTailLength = CommonTailLen; |