xref: /llvm-project/llvm/test/Transforms/GlobalOpt/resolve-static-ifunc.ll (revision 7c946f04cf363a8c581529907be8ee9f735591c7)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function caller --check-globals all --version 4
2; RUN: opt --passes=globalopt -o - -S < %s | FileCheck %s --implicit-check-not=trivial\.ifunc --implicit-check-not=dead_ifunc
3
4target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
5target triple = "aarch64-unknown-linux-gnu"
6
7@trivial.ifunc = internal ifunc void (), ptr @trivial.resolver
8;.
9; CHECK: @unknown_condition = external local_unnamed_addr global i1
10; CHECK: @alias_decl = weak_odr alias void (), ptr @aliased_decl.ifunc
11; CHECK: @alias_def = weak_odr alias void (), ptr @aliased_def._Msimd
12; CHECK: @external_ifunc.ifunc = dso_local ifunc void (), ptr @external_ifunc.resolver
13; CHECK: @complex.ifunc = internal ifunc void (), ptr @complex.resolver
14; CHECK: @sideeffects.ifunc = internal ifunc void (), ptr @sideeffects.resolver
15; CHECK: @interposable_ifunc.ifunc = internal ifunc void (), ptr @interposable_ifunc.resolver
16; CHECK: @interposable_resolver.ifunc = weak ifunc void (), ptr @interposable_resolver.resolver
17; CHECK: @aliased_decl.ifunc = weak_odr ifunc void (), ptr @aliased_decl.resolver
18; CHECK: @aliased_def.ifunc = weak_odr ifunc void (), ptr @aliased_def.resolver
19;.
20define ptr @trivial.resolver() {
21  ret ptr @trivial._Msimd
22}
23define void @trivial._Msimd() {
24  ret void
25}
26define void @trivial.default() {
27  ret void
28}
29
30
31@dead_ifunc.ifunc = internal ifunc void (), ptr @trivial.resolver
32
33@external_ifunc.ifunc = dso_local ifunc void (), ptr @external_ifunc.resolver
34define ptr @external_ifunc.resolver() {
35  ret ptr @external_ifunc._Msimd
36}
37define void @external_ifunc._Msimd() {
38  ret void
39}
40define void @external_ifunc.default() {
41  ret void
42}
43
44@unknown_condition = external global i1
45@complex.ifunc = internal ifunc void (), ptr @complex.resolver
46define ptr @complex.resolver() {
47entry:
48  %v = load i1, ptr @unknown_condition
49  br i1 %v, label %fast, label %slow
50fast:
51  ret ptr @complex._Msimd
52slow:
53  ret ptr @complex._Msimd
54}
55define void @complex._Msimd() {
56  ret void
57}
58define void @complex.default() {
59  ret void
60}
61
62@sideeffects.ifunc = internal ifunc void (), ptr @sideeffects.resolver
63define ptr @sideeffects.resolver() {
64  store i1 0, ptr @unknown_condition
65  ret ptr @sideeffects.default
66}
67define void @sideeffects._Msimd() {
68  ret void
69}
70define void @sideeffects.default() {
71  ret void
72}
73
74@interposable_ifunc.ifunc = internal ifunc void (), ptr @interposable_ifunc.resolver
75define weak ptr @interposable_ifunc.resolver() {
76  ret ptr @interposable_ifunc.resolver
77}
78define void @interposable_ifunc._Msimd() {
79  ret void
80}
81define void @interposable_ifunc.default() {
82  ret void
83}
84
85@interposable_resolver.ifunc = weak ifunc void (), ptr @interposable_resolver.resolver
86define ptr @interposable_resolver.resolver() {
87  ret ptr @interposable_resolver.resolver
88}
89define void @interposable_resolver._Msimd() {
90  ret void
91}
92define void @interposable_resolver.default() {
93  ret void
94}
95
96@alias_decl = weak_odr alias void (), ptr @aliased_decl.ifunc
97@aliased_decl.ifunc = weak_odr ifunc void (), ptr @aliased_decl.resolver
98declare void @aliased_decl._Msimd()
99define ptr @aliased_decl.resolver() {
100  ret ptr @aliased_decl._Msimd
101}
102
103@alias_def = weak_odr alias void (), ptr @aliased_def.ifunc
104@aliased_def.ifunc = weak_odr ifunc void (), ptr @aliased_def.resolver
105define void @aliased_def._Msimd() { ret void }
106define ptr @aliased_def.resolver() {
107  ret ptr @aliased_def._Msimd
108}
109
110define void @caller() {
111; CHECK-LABEL: define void @caller() local_unnamed_addr {
112; CHECK-NEXT:    call void @trivial._Msimd()
113; CHECK-NEXT:    call void @external_ifunc._Msimd()
114; CHECK-NEXT:    call void @complex.ifunc()
115; CHECK-NEXT:    call void @sideeffects.ifunc()
116; CHECK-NEXT:    call void @interposable_ifunc.ifunc()
117; CHECK-NEXT:    call void @interposable_resolver.ifunc()
118; CHECK-NEXT:    call void @aliased_decl.ifunc()
119; CHECK-NEXT:    call void @aliased_def._Msimd()
120; CHECK-NEXT:    ret void
121;
122  call void @trivial.ifunc()
123  call void @external_ifunc.ifunc()
124  call void @complex.ifunc()
125  call void @sideeffects.ifunc()
126  call void @interposable_ifunc.ifunc()
127  call void @interposable_resolver.ifunc()
128  call void @aliased_decl.ifunc()
129  call void @aliased_def.ifunc()
130  ret void
131}
132