diff options
author | Nadav Rotem <nrotem@apple.com> | 2012-09-19 08:08:04 +0000 |
---|---|---|
committer | Nadav Rotem <nrotem@apple.com> | 2012-09-19 08:08:04 +0000 |
commit | 92df026f0da91dc65ef6186e97ff87b1f53e8cd0 (patch) | |
tree | 3234226bbf5d5452d9ae30dad950408a61de4757 /test/Transforms/Inline | |
parent | 93ba133906da4b12a7c732b897e64541cc570120 (diff) |
Prevent inlining of callees which allocate lots of memory into a recursive caller.
Example:
void foo() {
... foo(); // I'm recursive!
bar();
}
bar() { int a[1000]; // large stack size }
rdar://10853263
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164207 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/Inline')
-rw-r--r-- | test/Transforms/Inline/recurseive.ll | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/test/Transforms/Inline/recurseive.ll b/test/Transforms/Inline/recurseive.ll new file mode 100644 index 0000000000..5fe8d1639c --- /dev/null +++ b/test/Transforms/Inline/recurseive.ll @@ -0,0 +1,38 @@ +; RUN: opt %s -inline -S | FileCheck %s + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" +target triple = "i386-apple-darwin10.0" + +; rdar://10853263 + +; Make sure that the callee is still here. +; CHECK: define i32 @callee +define i32 @callee(i32 %param) { + %yyy = alloca [100000 x i8] + %r = bitcast [100000 x i8]* %yyy to i8* + call void @foo2(i8* %r) + ret i32 4 +} + +; CHECK: define i32 @caller +; CHECK-NEXT: entry: +; CHECK-NOT: alloca +; CHECK: ret +define i32 @caller(i32 %param) { +entry: + %t = call i32 @foo(i32 %param) + %cmp = icmp eq i32 %t, -1 + br i1 %cmp, label %exit, label %cont + +cont: + %r = call i32 @caller(i32 %t) + %f = call i32 @callee(i32 %r) + br label %cont +exit: + ret i32 4 +} + +declare void @foo2(i8* %in) + +declare i32 @foo(i32 %param) + |