Disable inlining of recursive calls. It can complicate tailcallelim and
dependent analyses, and increase code size, so doing it profitably would
require more complex heuristics.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101471 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/InlineCost.cpp b/lib/Analysis/InlineCost.cpp
index 6650a68..b3ce42c 100644
--- a/lib/Analysis/InlineCost.cpp
+++ b/lib/Analysis/InlineCost.cpp
@@ -263,6 +263,13 @@
       CS.isNoInline())
     return llvm::InlineCost::getNever();
 
+  // Don't inline directly recursive calls, for now. Inlining a directly
+  // recursive call is effectively unrolling a loop, so it calls for different
+  // heuristics, which aren't implemented yet. Until then, err on the
+  // conservative side.
+  if (Callee == Caller)
+    return llvm::InlineCost::getNever();
+
   // InlineCost - This value measures how good of an inline candidate this call
   // site is to inline.  A lower inline cost make is more likely for the call to
   // be inlined.  This value may go negative.