diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-05-08 01:08:43 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-05-08 01:08:43 +0000 |
commit | 4983b992ab866f65e029019d47d157af5b2bb4f2 (patch) | |
tree | 9a621607666fee50df32b17063bab9105566903c | |
parent | b19c087aa7efac4bd11f0d49a5c37b09e1c4708e (diff) | |
download | llvm-4983b992ab866f65e029019d47d157af5b2bb4f2.tar.gz llvm-4983b992ab866f65e029019d47d157af5b2bb4f2.tar.bz2 llvm-4983b992ab866f65e029019d47d157af5b2bb4f2.tar.xz |
Simplify and fix incorrect comment. No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208272 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/TailRecursionElimination.cpp | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/lib/Transforms/Scalar/TailRecursionElimination.cpp b/lib/Transforms/Scalar/TailRecursionElimination.cpp index 65427f261e..afc8fc0a29 100644 --- a/lib/Transforms/Scalar/TailRecursionElimination.cpp +++ b/lib/Transforms/Scalar/TailRecursionElimination.cpp @@ -136,18 +136,20 @@ void TailCallElim::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired<TargetTransformInfo>(); } -/// CanTRE - Scan the specified basic block for alloca instructions. -/// If it contains any that are variable-sized or not in the entry block, -/// returns false. -static bool CanTRE(AllocaInst *AI) { - // Because of PR962, we don't TRE allocas outside the entry block. - - // If this alloca is in the body of the function, or if it is a variable - // sized allocation, we cannot tail call eliminate calls marked 'tail' - // with this mechanism. - BasicBlock *BB = AI->getParent(); - return BB == &BB->getParent()->getEntryBlock() && - isa<ConstantInt>(AI->getArraySize()); +/// \brief Scan the specified function for alloca instructions. +/// If it contains any dynamic allocas, returns false. +static bool CanTRE(Function &F) { + // Because of PR962, we don't TRE dynamic allocas. + for (auto &BB : F) { + for (auto &I : BB) { + if (AllocaInst *AI = dyn_cast<AllocaInst>(&I)) { + if (!AI->isStaticAlloca()) + return false; + } + } + } + + return true; } bool TailCallElim::runOnFunction(Function &F) { @@ -390,16 +392,7 @@ bool TailCallElim::runTRE(Function &F) { // marked with the 'tail' attribute, because doing so would cause the stack // size to increase (real TRE would deallocate variable sized allocas, TRE // doesn't). - bool CanTRETailMarkedCall = true; - - // Find dynamic allocas. - for (Function::iterator BB = F.begin(), EE = F.end(); BB != EE; ++BB) { - for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) { - if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) { - CanTRETailMarkedCall &= CanTRE(AI); - } - } - } + bool CanTRETailMarkedCall = CanTRE(F); // Change any tail recursive calls to loops. // |