aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2008-05-16 07:55:50 +0000
committerEvan Cheng <evan.cheng@apple.com>2008-05-16 07:55:50 +0000
commit66ae104cd1cc558cb1cc68db581e271ed61db289 (patch)
tree2ca12e760fb91b6a81e2c6263e0a796d1f275a5d
parent62849be80d0baf159448d0e3f6a9747dfa9a6707 (diff)
Do not dup malloc, vector instructions, etc. Throttle the default theshold way down.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51183 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Scalar/TailDuplication.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/Transforms/Scalar/TailDuplication.cpp b/lib/Transforms/Scalar/TailDuplication.cpp
index 8cb28a3b06..3fd09f107c 100644
--- a/lib/Transforms/Scalar/TailDuplication.cpp
+++ b/lib/Transforms/Scalar/TailDuplication.cpp
@@ -39,8 +39,9 @@ using namespace llvm;
STATISTIC(NumEliminated, "Number of unconditional branches eliminated");
static cl::opt<unsigned>
-Threshold("taildup-threshold", cl::desc("Max block size to tail duplicate"),
- cl::init(6), cl::Hidden);
+TailDupThreshold("taildup-threshold",
+ cl::desc("Max block size to tail duplicate"),
+ cl::init(1), cl::Hidden);
namespace {
class VISIBILITY_HIDDEN TailDup : public FunctionPass {
@@ -50,7 +51,7 @@ namespace {
TailDup() : FunctionPass((intptr_t)&ID) {}
private:
- inline bool shouldEliminateUnconditionalBranch(TerminatorInst *TI);
+ inline bool shouldEliminateUnconditionalBranch(TerminatorInst *, unsigned);
inline void eliminateUnconditionalBranch(BranchInst *BI);
SmallPtrSet<BasicBlock*, 4> CycleDetector;
};
@@ -70,7 +71,8 @@ bool TailDup::runOnFunction(Function &F) {
bool Changed = false;
CycleDetector.clear();
for (Function::iterator I = F.begin(), E = F.end(); I != E; ) {
- if (shouldEliminateUnconditionalBranch(I->getTerminator())) {
+ if (shouldEliminateUnconditionalBranch(I->getTerminator(),
+ TailDupThreshold)) {
eliminateUnconditionalBranch(cast<BranchInst>(I->getTerminator()));
Changed = true;
} else {
@@ -90,7 +92,8 @@ bool TailDup::runOnFunction(Function &F) {
/// We don't count PHI nodes in the count since they will be removed when the
/// contents of the block are copied over.
///
-bool TailDup::shouldEliminateUnconditionalBranch(TerminatorInst *TI) {
+bool TailDup::shouldEliminateUnconditionalBranch(TerminatorInst *TI,
+ unsigned Threshold) {
BranchInst *BI = dyn_cast<BranchInst>(TI);
if (!BI || !BI->isUnconditional()) return false; // Not an uncond branch!
@@ -124,6 +127,13 @@ bool TailDup::shouldEliminateUnconditionalBranch(TerminatorInst *TI) {
// Don't tail duplicate call instructions. They are very large compared to
// other instructions.
if (isa<CallInst>(I) || isa<InvokeInst>(I)) return false;
+
+ // Allso alloca and malloc.
+ if (isa<AllocationInst>(I)) return false;
+
+ // Some vector instructions can expand into a number of instructions.
+ if (isa<ShuffleVectorInst>(I) || isa<ExtractElementInst>(I) ||
+ isa<InsertElementInst>(I)) return false;
// Only count instructions that are not debugger intrinsics.
if (!isa<DbgInfoIntrinsic>(I)) ++Size;