blob: 8b81a900bdef858dd14fb7e9e9bcdcbfc1c48078 [file] [log] [blame]
; 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
}