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