| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | |
| ; RUN: opt -passes=argpromotion,inline -S %s | FileCheck %s | |
| ; argpromo removes @b's parameter (removing @c's reference to @a without updating the ref edge in the call graph), then the inliner inlines @a into @d and attempts to remove @a. | |
| define internal void @a() alwaysinline { | |
| call void @e(ptr @c) | |
| ret void | |
| } | |
| define internal void @b(ptr) noinline { | |
| ; CHECK-LABEL: @b( | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define internal void @c() noinline { | |
| ; CHECK-LABEL: @c( | |
| ; CHECK-NEXT: call void @b() | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @b(ptr @a) | |
| ret void | |
| } | |
| define void @d() { | |
| ; CHECK-LABEL: @d( | |
| ; CHECK-NEXT: call void @e(ptr @c) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @a() | |
| ret void | |
| } | |
| declare void @e(ptr); |