From cb19438f63019eb557c1fbaeae8a6de78b03c584 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Sat, 7 Nov 2009 07:42:38 +0000 Subject: [PATCH] Oops, FunctionContainsEscapingAllocas is really used to mean two different things. Back out part of r86349 for a moment. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86353 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/TailRecursionElimination.cpp | 12 ++++++++++-- test/Transforms/TailCallElim/nocapture.ll | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/Transforms/Scalar/TailRecursionElimination.cpp b/lib/Transforms/Scalar/TailRecursionElimination.cpp index 1b8ed4127c4..e05991373a8 100644 --- a/lib/Transforms/Scalar/TailRecursionElimination.cpp +++ b/lib/Transforms/Scalar/TailRecursionElimination.cpp @@ -91,6 +91,15 @@ FunctionPass *llvm::createTailCallEliminationPass() { return new TailCallElim(); } +/// AllocaMightEscapeToCalls - Return true if this alloca may be accessed by +/// callees of this function. We only do very simple analysis right now, this +/// could be expanded in the future to use mod/ref information for particular +/// call sites if desired. +static bool AllocaMightEscapeToCalls(AllocaInst *AI) { + // FIXME: do simple 'address taken' analysis. + return true; +} + /// CheckForEscapingAllocas - Scan the specified basic block for alloca /// instructions. If it contains any that might be accessed by calls, return /// true. @@ -99,7 +108,7 @@ static bool CheckForEscapingAllocas(BasicBlock *BB, bool RetVal = false; for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) if (AllocaInst *AI = dyn_cast(I)) { - RetVal |= PointerMayBeCaptured(AI, true); + RetVal |= AllocaMightEscapeToCalls(AI); // 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' @@ -145,7 +154,6 @@ bool TailCallElim::runOnFunction(Function &F) { /// happen. This bug is PR962. if (FunctionContainsEscapingAllocas) return false; - // Second pass, change any tail calls to loops. for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) diff --git a/test/Transforms/TailCallElim/nocapture.ll b/test/Transforms/TailCallElim/nocapture.ll index 92dc374a93c..87cb9dd427b 100644 --- a/test/Transforms/TailCallElim/nocapture.ll +++ b/test/Transforms/TailCallElim/nocapture.ll @@ -1,4 +1,5 @@ ; RUN: opt %s -tailcallelim -S | FileCheck %s +; XFAIL: * declare void @use(i8* nocapture, i8* nocapture) -- 2.34.1