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