brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.6 KiB · 1992f08 Raw
195 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals all --include-generated-funcs --global-value-regex ".*" --version 52// RUN: %clang_cc1 -std=c++11 -triple aarch64-linux-gnu -emit-llvm %s -o - | FileCheck %s3 4int __attribute__((target_clones("fp16", "default"))) foo_ovl(int) { return 1; }5int __attribute__((target_clones("fp16"))) foo_ovl(void) { return 2; }6 7int bar() {8  return foo_ovl(1) + foo_ovl();9}10 11template <typename T1, typename T2> struct MyClass {12  int __attribute__((target_clones("frintts", "ssbs+sme-f64f64", "default"))) foo_tml() { return 1; }13};14 15template <typename T> struct MyClass<int, T> {16  int __attribute__((target_clones("frintts", "ssbs+sme-f64f64"))) foo_tml() { return 2; }17};18 19template <typename T> struct MyClass<float, T> {20  int foo_tml() { return 3; }21};22 23template <> struct MyClass<double, float> {24  int __attribute__((target_clones("default"))) foo_tml() { return 4; }25};26 27void run_foo_tml() {28  MyClass<short, short> Mc1;29  Mc1.foo_tml();30  MyClass<int, short> Mc2;31  Mc2.foo_tml();32  MyClass<float, short> Mc3;33  Mc3.foo_tml();34  MyClass<double, float> Mc4;35  Mc4.foo_tml();36}37 38 39 40 41//.42// CHECK: @__aarch64_cpu_features = external dso_local global { i64 }43// CHECK: @_Z7foo_ovli = weak_odr ifunc i32 (i32), ptr @_Z7foo_ovli.resolver44// CHECK: @_ZN7MyClassIssE7foo_tmlEv = weak_odr ifunc i32 (ptr), ptr @_ZN7MyClassIssE7foo_tmlEv.resolver45//.46// CHECK-LABEL: define dso_local noundef i32 @_Z7foo_ovli._Mfp16(47// CHECK-SAME: i32 noundef [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] {48// CHECK-NEXT:  [[ENTRY:.*:]]49// CHECK-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 450// CHECK-NEXT:    store i32 [[TMP0]], ptr [[DOTADDR]], align 451// CHECK-NEXT:    ret i32 152//53//54// CHECK-LABEL: define dso_local noundef i32 @_Z7foo_ovli.default(55// CHECK-SAME: i32 noundef [[TMP0:%.*]]) #[[ATTR1:[0-9]+]] {56// CHECK-NEXT:  [[ENTRY:.*:]]57// CHECK-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 458// CHECK-NEXT:    store i32 [[TMP0]], ptr [[DOTADDR]], align 459// CHECK-NEXT:    ret i32 160//61//62// CHECK-LABEL: define dso_local noundef i32 @_Z7foo_ovlv._Mfp16(63// CHECK-SAME: ) #[[ATTR0]] {64// CHECK-NEXT:  [[ENTRY:.*:]]65// CHECK-NEXT:    ret i32 266//67//68// CHECK-LABEL: define dso_local noundef i32 @_Z3barv(69// CHECK-SAME: ) #[[ATTR2:[0-9]+]] {70// CHECK-NEXT:  [[ENTRY:.*:]]71// CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 @_Z7foo_ovli(i32 noundef 1)72// CHECK-NEXT:    [[CALL1:%.*]] = call noundef i32 @_Z7foo_ovlv()73// CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[CALL]], [[CALL1]]74// CHECK-NEXT:    ret i32 [[ADD]]75//76//77// CHECK-LABEL: define dso_local void @_Z11run_foo_tmlv(78// CHECK-SAME: ) #[[ATTR2]] {79// CHECK-NEXT:  [[ENTRY:.*:]]80// CHECK-NEXT:    [[MC1:%.*]] = alloca [[STRUCT_MYCLASS:%.*]], align 181// CHECK-NEXT:    [[MC2:%.*]] = alloca [[STRUCT_MYCLASS_0:%.*]], align 182// CHECK-NEXT:    [[MC3:%.*]] = alloca [[STRUCT_MYCLASS_1:%.*]], align 183// CHECK-NEXT:    [[MC4:%.*]] = alloca [[STRUCT_MYCLASS_2:%.*]], align 184// CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 @_ZN7MyClassIssE7foo_tmlEv(ptr noundef nonnull align 1 dereferenceable(1) [[MC1]])85// CHECK-NEXT:    [[CALL1:%.*]] = call noundef i32 @_ZN7MyClassIisE7foo_tmlEv(ptr noundef nonnull align 1 dereferenceable(1) [[MC2]])86// CHECK-NEXT:    [[CALL2:%.*]] = call noundef i32 @_ZN7MyClassIfsE7foo_tmlEv(ptr noundef nonnull align 1 dereferenceable(1) [[MC3]])87// CHECK-NEXT:    [[CALL3:%.*]] = call noundef i32 @_ZN7MyClassIdfE7foo_tmlEv(ptr noundef nonnull align 1 dereferenceable(1) [[MC4]])88// CHECK-NEXT:    ret void89//90//91// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIfsE7foo_tmlEv(92// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR2]] comdat {93// CHECK-NEXT:  [[ENTRY:.*:]]94// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 895// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 896// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 897// CHECK-NEXT:    ret i32 398//99//100// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIdfE7foo_tmlEv(101// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR2]] comdat {102// CHECK-NEXT:  [[ENTRY:.*:]]103// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8104// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8105// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8106// CHECK-NEXT:    ret i32 4107//108//109// CHECK-LABEL: define weak_odr ptr @_Z7foo_ovli.resolver(110// CHECK-SAME: ) #[[ATTR_RESOLVER:[0-9]+]] comdat {111// CHECK-NEXT:  [[RESOLVER_ENTRY:.*:]]112// CHECK-NEXT:    call void @__init_cpu_features_resolver()113// CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8114// CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 65792115// CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 65792116// CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]117// CHECK-NEXT:    br i1 [[TMP3]], label %[[RESOLVER_RETURN:.*]], label %[[RESOLVER_ELSE:.*]]118// CHECK:       [[RESOLVER_RETURN]]:119// CHECK-NEXT:    ret ptr @_Z7foo_ovli._Mfp16120// CHECK:       [[RESOLVER_ELSE]]:121// CHECK-NEXT:    ret ptr @_Z7foo_ovli.default122//123//124// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIssE7foo_tmlEv._Mfrintts(125// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR5:[0-9]+]] comdat {126// CHECK-NEXT:  [[ENTRY:.*:]]127// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8128// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8129// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8130// CHECK-NEXT:    ret i32 1131//132//133// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIssE7foo_tmlEv._Msme-f64f64Mssbs(134// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR6:[0-9]+]] comdat {135// CHECK-NEXT:  [[ENTRY:.*:]]136// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8137// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8138// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8139// CHECK-NEXT:    ret i32 1140//141//142// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIssE7foo_tmlEv.default(143// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR1]] comdat {144// CHECK-NEXT:  [[ENTRY:.*:]]145// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8146// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8147// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8148// CHECK-NEXT:    ret i32 1149//150//151// CHECK-LABEL: define weak_odr ptr @_ZN7MyClassIssE7foo_tmlEv.resolver(152// CHECK-SAME: ) #[[ATTR_RESOLVER]] comdat {153// CHECK-NEXT:  [[RESOLVER_ENTRY:.*:]]154// CHECK-NEXT:    call void @__init_cpu_features_resolver()155// CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8156// CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[TMP0]], 36596145153180416157// CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 36596145153180416158// CHECK-NEXT:    [[TMP3:%.*]] = and i1 true, [[TMP2]]159// CHECK-NEXT:    br i1 [[TMP3]], label %[[RESOLVER_RETURN:.*]], label %[[RESOLVER_ELSE:.*]]160// CHECK:       [[RESOLVER_RETURN]]:161// CHECK-NEXT:    ret ptr @_ZN7MyClassIssE7foo_tmlEv._Msme-f64f64Mssbs162// CHECK:       [[RESOLVER_ELSE]]:163// CHECK-NEXT:    [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8164// CHECK-NEXT:    [[TMP5:%.*]] = and i64 [[TMP4]], 16777472165// CHECK-NEXT:    [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 16777472166// CHECK-NEXT:    [[TMP7:%.*]] = and i1 true, [[TMP6]]167// CHECK-NEXT:    br i1 [[TMP7]], label %[[RESOLVER_RETURN1:.*]], label %[[RESOLVER_ELSE2:.*]]168// CHECK:       [[RESOLVER_RETURN1]]:169// CHECK-NEXT:    ret ptr @_ZN7MyClassIssE7foo_tmlEv._Mfrintts170// CHECK:       [[RESOLVER_ELSE2]]:171// CHECK-NEXT:    ret ptr @_ZN7MyClassIssE7foo_tmlEv.default172//173//174// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIisE7foo_tmlEv._Mfrintts(175// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR5]] comdat {176// CHECK-NEXT:  [[ENTRY:.*:]]177// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8178// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8179// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8180// CHECK-NEXT:    ret i32 2181//182//183// CHECK-LABEL: define linkonce_odr noundef i32 @_ZN7MyClassIisE7foo_tmlEv._Msme-f64f64Mssbs(184// CHECK-SAME: ptr noundef nonnull align 1 dereferenceable(1) [[THIS:%.*]]) #[[ATTR6]] comdat {185// CHECK-NEXT:  [[ENTRY:.*:]]186// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8187// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8188// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8189// CHECK-NEXT:    ret i32 2190//191//.192// CHECK: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}193// CHECK: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}194//.195