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