| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- ; Test that functions with dynamic allocas get inlined in a case where
- ; naively inlining it would result in a miscompilation.
- ; Functions with dynamic allocas can only be inlined into functions that
- ; already have dynamic allocas.
- ; RUN: opt < %s -inline -S | FileCheck %s
- ;
- ; FIXME: This test is xfailed because the inline cost rewrite disabled *all*
- ; inlining of functions which contain a dynamic alloca. It should be re-enabled
- ; once that functionality is restored.
- ; XFAIL: *
- declare void @ext(i32*)
- define internal void @callee(i32 %N) {
- %P = alloca i32, i32 %N
- call void @ext(i32* %P)
- ret void
- }
- define void @foo(i32 %N) {
- ; CHECK-LABEL: @foo(
- ; CHECK: alloca i32, i32 %{{.*}}
- ; CHECK: call i8* @llvm.stacksave()
- ; CHECK: alloca i32, i32 %{{.*}}
- ; CHECK: call void @ext
- ; CHECK: call void @llvm.stackrestore
- ; CHECK: ret
- entry:
- %P = alloca i32, i32 %N
- call void @ext(i32* %P)
- br label %loop
- loop:
- %count = phi i32 [ 0, %entry ], [ %next, %loop ]
- %next = add i32 %count, 1
- call void @callee(i32 %N)
- %cond = icmp eq i32 %count, 100000
- br i1 %cond, label %out, label %loop
- out:
- ret void
- }
|