| ; RUN: opt -passes=inline -S < %s | FileCheck %s |
| |
| ; This will inline @f1 into @a, causing two new calls to @f2, which will get inlined for two calls to @f1. |
| ; The inline history should stop recursive inlining here, and make sure to mark the inlined calls as noinline so we don't repeat the inlining later on when @a gets inlined into @b. |
| |
| define internal void @f1(ptr %p) { |
| call void %p(ptr @f1) |
| ret void |
| } |
| |
| define internal void @f2(ptr %p) { |
| call void %p(ptr @f2) |
| call void %p(ptr @f2) |
| ret void |
| } |
| |
| define void @b() { |
| ; CHECK-LABEL: define void @b() { |
| ; CHECK-NEXT: call void @f1(ptr @f2) #[[NOINLINE:[0-9]+]] |
| ; CHECK-NEXT: call void @f1(ptr @f2) #[[NOINLINE]] |
| ; CHECK-NEXT: ret void |
| ; |
| call void @a() |
| ret void |
| } |
| |
| define internal void @a() { |
| call void @f1(ptr @f2) |
| ret void |
| } |
| |
| ; CHECK: [[NOINLINE]] = { noinline } |