Prevent tailcallelim from breaking "recursive" calls to builtins.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41804 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2007-09-10 20:58:55 +00:00
parent b0869ed44d
commit 8d9455d4e4
2 changed files with 19 additions and 0 deletions

View File

@ -302,6 +302,15 @@ bool TailCallElim::ProcessReturningBlock(ReturnInst *Ret, BasicBlock *&OldEntry,
if (&BB->front() == Ret) // Make sure there is something before the ret...
return false;
// If the return is in the entry block, then making this transformation would
// turn infinite recursion into an infinite loop. This transformation is ok
// in theory, but breaks some code like:
// double fabs(double f) { return __builtin_fabs(f); } // a 'fabs' call
// disable this xform in this case, because the code generator will lower the
// call to fabs into inline code.
if (BB == &F->getEntryBlock())
return false;
// Scan backwards from the return, checking to see if there is a tail call in
// this block. If so, set CI to it.

View File

@ -0,0 +1,10 @@
; RUN: llvm-as < %s | opt -tailcallelim | grep call
; Don't turn this into an infinite loop, this is probably the implementation
; of fabs and we expect the codegen to lower fabs.
define double @fabs(double %f) {
entry:
%tmp2 = call double @fabs( double %f ) ; <double> [#uses=1]
ret double %tmp2
}