xref: /llvm-project/llvm/test/Transforms/PGOProfile/profdata_priv_alias.ll (revision f2916becc572047915f537c9abc2b04562c4bdb8)
1; RUN: opt -S -passes=pgo-instr-gen,instrprof < %s | FileCheck %s
2
3target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
4target triple = "x86_64-unknown-linux-gnu"
5
6;; Test that we use private aliases to reference function addresses inside profile data
7; CHECK: @__profd_foo = private global {{.*}} ptr @foo.local
8; CHECK-NOT: @__profd_foo = private global {{.*}} ptr @foo
9
10; CHECK: @__profd_weak = private global {{.*}} ptr @weak.local
11; CHECK: @__profd_linkonce = private global {{.*}} ptr @linkonce.local
12; CHECK: @__profd_weakodr = private global {{.*}} ptr @weakodr.local
13; CHECK: @__profd_linkonceodr = private global {{.*}} ptr @linkonceodr.local
14
15; available_externally shouldn't have an alias, so make sure it doesn't appear here
16; CHECK: @__profc_available_externally.[[HASH:[#0-9]+]]
17; CHECK-NOT: @__profd_available_externally.[[HASH]] = {{.*}}ptr @available_externally.[[HASH]].local
18
19;; Ensure when not instrumenting a non-comdat function, then if we generate an
20;; alias, then it is private. We check comdat versions in comdat.ll
21; CHECK: @foo.local = private alias i32 (i32), ptr @foo
22; CHECK: @weak.local = private alias void (), ptr @weak
23; CHECK: @linkonce.local = private alias void (), ptr @linkonce
24; CHECK: @weakodr.local = private alias void (), ptr @weakodr
25; CHECK: @linkonceodr.local = private alias void (), ptr @linkonceodr
26
27;; We should never generate an alias for available_externally functions
28; CHECK-NOT: @available_externally{{.*}} = private alias void (), ptr @available_externally
29
30define i32 @foo(i32 %0) {
31; CHECK-LABEL: @foo(
32; CHECK-NEXT:  entry:
33; CHECK-NEXT:    [[PGOCOUNT:%.*]] = load i64, ptr @__profc_foo, align 8
34; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[PGOCOUNT]], 1
35; CHECK-NEXT:    store i64 [[TMP1]], ptr @__profc_foo, align 8
36; CHECK-NEXT:    ret i32 0
37entry:
38  ret i32 0
39}
40
41define weak void @weak() {
42; CHECK-LABEL: @weak(
43; CHECK-NEXT:    [[PGOCOUNT:%.*]] = load i64, ptr @__profc_weak, align 8
44; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[PGOCOUNT]], 1
45; CHECK-NEXT:    store i64 [[TMP1]], ptr @__profc_weak, align 8
46; CHECK-NEXT:    ret void
47  ret void
48}
49
50define linkonce void @linkonce() {
51; CHECK-LABEL: @linkonce(
52; CHECK-NEXT:    [[PGOCOUNT:%.*]] = load i64, ptr @__profc_linkonce, align 8
53; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[PGOCOUNT]], 1
54; CHECK-NEXT:    store i64 [[TMP1]], ptr @__profc_linkonce, align 8
55; CHECK-NEXT:    ret void
56  ret void
57}
58
59define weak_odr void @weakodr() {
60; CHECK-LABEL: @weakodr(
61; CHECK-NEXT:    [[PGOCOUNT:%.*]] = load i64, ptr @__profc_weakodr, align 8
62; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[PGOCOUNT]], 1
63; CHECK-NEXT:    store i64 [[TMP1]], ptr @__profc_weakodr, align 8
64; CHECK-NEXT:    ret void
65  ret void
66}
67
68define linkonce_odr void @linkonceodr() {
69; CHECK-LABEL: @linkonceodr(
70; CHECK-NEXT:    [[PGOCOUNT:%.*]] = load i64, ptr @__profc_linkonceodr, align 8
71; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[PGOCOUNT]], 1
72; CHECK-NEXT:    store i64 [[TMP1]], ptr @__profc_linkonceodr, align 8
73; CHECK-NEXT:    ret void
74  ret void
75}
76
77define available_externally void @available_externally(){
78; CHECK-LABEL: @available_externally(
79; CHECK-NEXT:    [[PGOCOUNT:%.*]] = load i64, ptr @__profc_available_externally.[[HASH]], align 8
80; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[PGOCOUNT]], 1
81; CHECK-NEXT:    store i64 [[TMP1]], ptr @__profc_available_externally.[[HASH]], align 8
82; CHECK-NEXT:    ret void
83  ret void
84}
85