| ; 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); |