| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals all --version 5 |
| ; RUN: opt -passes=norecurse-lto-inference -S %s | FileCheck %s |
| |
| ; This is a negative test which results in RefSCC with size > 1. |
| ; RefSCC : [(f2), (f1)] |
| ; --- SCC A (f1) --- size() = 1 |
| define internal void @f1() { |
| ; CHECK-LABEL: define internal void @f1() { |
| ; CHECK-NEXT: call void @f2() |
| ; CHECK-NEXT: ret void |
| ; |
| call void @f2() |
| ret void |
| } |
| |
| ; --- SCC B (f2) --- size() = 1 |
| ; f2 indirectly calls f1 using locally allocated function pointer |
| define internal void @f2() { |
| ; CHECK-LABEL: define internal void @f2() { |
| ; CHECK-NEXT: [[FP:%.*]] = alloca ptr, align 8 |
| ; CHECK-NEXT: store ptr @f1, ptr [[FP]], align 8 |
| ; CHECK-NEXT: [[TMP:%.*]] = load ptr, ptr [[FP]], align 8 |
| ; CHECK-NEXT: call void [[TMP]]() |
| ; CHECK-NEXT: ret void |
| ; |
| %fp = alloca void ()* |
| store void ()* @f1, void ()** %fp |
| %tmp = load void ()*, void ()** %fp |
| call void %tmp() |
| ret void |
| } |
| |
| define i32 @main() { |
| ; CHECK-LABEL: define i32 @main() { |
| ; CHECK-NEXT: call void @f1() |
| ; CHECK-NEXT: ret i32 0 |
| ; |
| call void @f1() |
| ret i32 0 |
| } |
| |