summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/Inline/noinline-recursive-fn.ll
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-04-30 22:37:22 +0000
committerChris Lattner <sabre@nondot.org>2010-04-30 22:37:22 +0000
commita9bac86d16a9026a2f9671bcff9660609247a780 (patch)
tree6e2c37612ca5486821572ed2fdde67780ecc6953 /llvm/test/Transforms/Inline/noinline-recursive-fn.ll
parentbc1416dcad1010601ea7ae403ad811eee139890a (diff)
downloadbcm5719-llvm-a9bac86d16a9026a2f9671bcff9660609247a780.tar.gz
bcm5719-llvm-a9bac86d16a9026a2f9671bcff9660609247a780.zip
Dan recently disabled recursive inlining within a function, but we
were still inlining self-recursive functions into other functions. Inlining a recursive function into itself has the potential to reduce recursion depth by a factor of 2, inlining a recursive function into something else reduces recursion depth by exactly 1. Since inlining a recursive function into something else is a weird form of loop peeling, turn this off. The deleted testcase was added by Dale in r62107, since then we're leaning towards not inlining recursive stuff ever. In any case, if we like inlining recursive stuff, it should be done within the recursive function itself to get the algorithm recursion depth win. llvm-svn: 102798
Diffstat (limited to 'llvm/test/Transforms/Inline/noinline-recursive-fn.ll')
-rw-r--r--llvm/test/Transforms/Inline/noinline-recursive-fn.ll32
1 files changed, 32 insertions, 0 deletions
diff --git a/llvm/test/Transforms/Inline/noinline-recursive-fn.ll b/llvm/test/Transforms/Inline/noinline-recursive-fn.ll
new file mode 100644
index 00000000000..dcae0243300
--- /dev/null
+++ b/llvm/test/Transforms/Inline/noinline-recursive-fn.ll
@@ -0,0 +1,32 @@
+; The inliner should never inline recursive functions into other functions.
+; This effectively is just peeling off the first iteration of a loop, and the
+; inliner heuristics are not set up for this.
+
+; RUN: opt -inline %s -S | grep "call void @foo(i32 42)"
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+target triple = "x86_64-apple-darwin10.3"
+
+@g = common global i32 0 ; <i32*> [#uses=1]
+
+define internal void @foo(i32 %x) nounwind ssp {
+entry:
+ %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
+ %0 = icmp slt i32 %x, 0 ; <i1> [#uses=1]
+ br i1 %0, label %return, label %bb
+
+bb: ; preds = %entry
+ %1 = sub nsw i32 %x, 1 ; <i32> [#uses=1]
+ call void @foo(i32 %1) nounwind ssp
+ volatile store i32 1, i32* @g, align 4
+ ret void
+
+return: ; preds = %entry
+ ret void
+}
+
+define void @bonk() nounwind ssp {
+entry:
+ call void @foo(i32 42) nounwind ssp
+ ret void
+}
OpenPOWER on IntegriCloud