xref: /llvm-project/llvm/test/CodeGen/PowerPC/pgo-ref-directive.ll (revision b1acb7a315e903ee340a33dbc9b2b61b0450bb67)
1; RUN: rm -rf %t && split-file %s %t
2
3; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
4; RUN:     -xcoff-traceback-table=false < %t/no-ref.ll | FileCheck %s --check-prefixes=NOREF
5; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
6; RUN:     -xcoff-traceback-table=false --filetype=obj < %t/no-ref.ll -o %t/no-ref.o
7; RUN: llvm-objdump %t/no-ref.o -r | FileCheck %s --check-prefix=NOREF-OBJ
8
9; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
10; RUN:     -xcoff-traceback-table=false < %t/no-vnds.ll | FileCheck %s --check-prefixes=NOVNDS
11; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
12; RUN:     -xcoff-traceback-table=false --filetype=obj < %t/no-vnds.ll -o %t/no-vnds.o
13; RUN: llvm-objdump %t/no-vnds.o -r | FileCheck %s --check-prefix=NOVNDS-OBJ
14
15; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
16; RUN:     -xcoff-traceback-table=false < %t/with-vnds.ll | FileCheck %s --check-prefixes=WITHVNDS
17; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
18; RUN:     -xcoff-traceback-table=false --filetype=obj < %t/with-vnds.ll -o %t/with-vnds.o
19; RUN: llvm-objdump %t/with-vnds.o -tr | FileCheck %s --check-prefix=WITHVNDS-OBJ
20
21; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
22; RUN:     -xcoff-traceback-table=false < %t/zero-size-cnts-section.ll | FileCheck %s --check-prefixes=ZERO-SIZE-CNTS
23; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
24; RUN:     -xcoff-traceback-table=false --filetype=obj < %t/zero-size-cnts-section.ll -o %t/zero-size-cnts-section.o
25; RUN: llvm-objdump %t/zero-size-cnts-section.o -tr | FileCheck %s --check-prefix=ZERO-SIZE-CNTS-OBJ
26
27; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
28; RUN:     -xcoff-traceback-table=false < %t/zero-size-other-section.ll | FileCheck %s --check-prefixes=ZERO-SIZE-OTHER
29; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
30; RUN:     -xcoff-traceback-table=false < %t/zero-size-other-section.ll | FileCheck %s --check-prefixes=ZERO-SIZE-OTHER
31; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
32; RUN:     -xcoff-traceback-table=false --filetype=obj < %t/zero-size-other-section.ll -o %t/zero-size-other-section.o
33; RUN: llvm-objdump %t/zero-size-other-section.o -tr | FileCheck %s --check-prefix=ZERO-SIZE-OTHER-OBJ
34; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
35; RUN:     -xcoff-traceback-table=false --filetype=obj < %t/zero-size-other-section.ll -o %t/zero-size-other-section.o
36; RUN: llvm-objdump %t/zero-size-other-section.o -tr | FileCheck %s --check-prefix=ZERO-SIZE-OTHER-OBJ
37
38
39;--- no-ref.ll
40; The absence of a __llvm_prf_cnts section should stop generating the .refs.
41;
42target datalayout = "E-m:a-p:32:32-i64:64-n32"
43target triple = "powerpc-ibm-aix7.2.0.0"
44
45@__profd_main = private global i64 zeroinitializer, section "__llvm_prf_data", align 8
46@__llvm_prf_nm = private constant [6 x i8] c"\04\00main", section "__llvm_prf_names", align 1
47
48@llvm.used = appending global [2 x ptr]
49  [ptr @__profd_main,
50   ptr @__llvm_prf_nm], section "llvm.metadata"
51
52define i32 @main() #0 {
53entry:
54  ret i32 1
55}
56
57; NOREF-NOT:  .ref __llvm_prf_data
58; NOREF-NOT:  .ref __llvm_prf_names
59; NOREF-NOT:  .ref __llvm_prf_vnds
60
61; NOREF-OBJ-NOT: R_REF  __llvm_prf_data
62; NOREF-OBJ-NOT: R_REF  __llvm_prf_names
63; NOREF-OBJ-NOT: R_REF  __llvm_prf_vnds
64
65;--- no-vnds.ll
66; This is the most common case. When -fprofile-generate is used and there exists executable code, we generate the __llvm_prf_cnts, __llvm_prf_data, and __llvm_prf_names sections.
67;
68target datalayout = "E-m:a-p:32:32-i64:64-n32"
69target triple = "powerpc-ibm-aix7.2.0.0"
70
71@__profc_main = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", align 8
72@__profd_main = private global i64 zeroinitializer, section "__llvm_prf_data", align 8
73@__llvm_prf_nm = private constant [6 x i8] c"\04\00main", section "__llvm_prf_names", align 1
74
75@llvm.used = appending global [3 x ptr]
76  [ptr @__profc_main,
77   ptr @__profd_main,
78   ptr @__llvm_prf_nm], section "llvm.metadata"
79
80define i32 @main() #0 {
81entry:
82  ret i32 1
83}
84; There will be two __llvm_prf_cnts .csects, one to represent the actual csect
85; that holds @__profc_main, and one generated to hold the .ref directives. In
86; XCOFF, a csect can be defined in pieces, so this is is legal assembly.
87;
88; NOVNDS:      .csect __llvm_prf_cnts[RW],3
89; NOVNDS:      .csect __llvm_prf_cnts[RW],3
90; NOVNDS-NEXT: .ref __llvm_prf_data[RW]
91; NOVNDS-NEXT: .ref __llvm_prf_names[RO]
92; NOVNDS-NOT:  .ref __llvm_prf_vnds
93
94; NOVNDS-OBJ: 00000000 R_REF  __llvm_prf_data
95; NOVNDS-OBJ: 00000000 R_REF  __llvm_prf_names
96; NOVNDS-OBJ-NOT: R_REF  __llvm_prf_vnds
97
98;--- with-vnds.ll
99; When value profiling is needed, the PGO instrumentation generates variables in the __llvm_prf_vnds section, so we generate a .ref for them too.
100;
101@__profc_main = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", align 8
102@__profd_main = private global i64 zeroinitializer, section "__llvm_prf_data", align 8
103@__llvm_prf_nm = private constant [6 x i8] c"\04\00main", section "__llvm_prf_names", align 1
104@__llvm_prf_vnodes = private global [10 x { i64, i64, ptr }] zeroinitializer, section "__llvm_prf_vnds"
105
106@llvm.used = appending global [4 x ptr]
107  [ptr @__profc_main,
108   ptr @__profd_main,
109   ptr @__llvm_prf_nm,
110   ptr @__llvm_prf_vnodes], section "llvm.metadata"
111
112define i32 @main() #0 {
113entry:
114  ret i32 1
115}
116
117; WITHVNDS:      .csect __llvm_prf_cnts[RW],3
118; WITHVNDS:      .csect __llvm_prf_cnts[RW],3
119; WITHVNDS-NEXT: .ref __llvm_prf_data[RW]
120; WITHVNDS-NEXT: .ref __llvm_prf_names[RO]
121; WITHVNDS-NEXT: .ref __llvm_prf_vnds[RW]
122
123; WITHVNDS-OBJ:      SYMBOL TABLE:
124; WITHVNDS-OBJ-NEXT: 00000000      df *DEBUG*	00000000 .file
125; WITHVNDS-OBJ-NEXT: 00000000 l       .text	00000008
126; WITHVNDS-OBJ-NEXT: 00000000 g     F .text (csect: ) 	00000000 .main
127; WITHVNDS-OBJ-NEXT: 00000008 l       .text	00000006 __llvm_prf_names
128; WITHVNDS-OBJ-NEXT: 00000010 l     O .data	00000008 __llvm_prf_cnts
129; WITHVNDS-OBJ-NEXT: 00000018 l     O .data	00000008 __llvm_prf_data
130; WITHVNDS-OBJ-NEXT: 00000020 l     O .data	000000f0 __llvm_prf_vnds
131; WITHVNDS-OBJ-NEXT: 00000110 g     O .data	0000000c main
132; WITHVNDS-OBJ-NEXT: 0000011c l       .data	00000000 TOC
133
134; WITHVNDS-OBJ:      RELOCATION RECORDS FOR [.data]:
135; WITHVNDS-OBJ-NEXT: OFFSET   TYPE                     VALUE
136; WITHVNDS-OBJ-NEXT: 00000000 R_REF                    __llvm_prf_data
137; WITHVNDS-OBJ-NEXT: 00000000 R_REF                    __llvm_prf_names
138; WITHVNDS-OBJ-NEXT: 00000000 R_REF                    __llvm_prf_vnds
139; WITHVNDS-OBJ-NEXT: 00000100 R_POS                    .main
140; WITHVNDS-OBJ-NEXT: 00000104 R_POS                    TOC
141
142;--- zero-size-cnts-section.ll
143; If __llvm_prf_cnts is of zero size, do not generate the .ref directive.
144; The size of the other sections does not matter.
145
146@dummy_cnts = private global [0 x i32] zeroinitializer, section "__llvm_prf_cnts", align 4
147@dummy_data = private global [1 x i64] zeroinitializer, section "__llvm_prf_data", align 8
148@dummy_name = private constant [0 x i32] zeroinitializer, section "__llvm_prf_names", align 4
149
150@llvm.used = appending global [3 x ptr]
151  [ptr @dummy_cnts,
152   ptr @dummy_data,
153   ptr @dummy_name], section "llvm.metadata"
154
155define i32 @main() #0 {
156entry:
157  ret i32 1
158}
159
160; ZERO-SIZE-CNTS-NOT: .ref __llvm_prf_data[RW]
161; ZERO-SIZE-CNTS-NOT: .ref __llvm_prf_names[RO]
162; ZERO-SIZE-CNTS-NOT: .ref __llvm_prf_vnds
163
164; ZERO-SIZE-CNTS-OBJ-NOT: R_REF  __llvm_prf_data
165; ZERO-SIZE-CNTS-OBJ-NOT: R_REF  __llvm_prf_names
166; ZERO-SIZE-CNTS-OBJ-NOT: R_REF  __llvm_prf_vnds
167
168;--- zero-size-other-section.ll
169; If __llvm_prf_cnts is of non-zero size, generate the .ref directive even if other sections
170; are zero-sized;
171
172@__profc_main = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", align 8
173@__profd_main = private global [0 x i64] zeroinitializer, section "__llvm_prf_data", align 8
174@__llvm_prf_nm = private constant [0 x i8] zeroinitializer, section "__llvm_prf_names", align 1
175@__llvm_prf_vnodes = private global [0 x { i64, i64, ptr }] zeroinitializer, section "__llvm_prf_vnds"
176
177@llvm.used = appending global [4 x ptr]
178  [ptr @__profc_main,
179   ptr @__profd_main,
180   ptr @__llvm_prf_nm,
181   ptr @__llvm_prf_vnodes], section "llvm.metadata"
182
183define i32 @main() #0 {
184entry:
185  ret i32 1
186}
187
188; ZERO-SIZE-OTHER:      .csect __llvm_prf_cnts[RW],3
189; ZERO-SIZE-OTHER:      .csect __llvm_prf_cnts[RW],3
190; ZERO-SIZE-OTHER-NEXT: .ref __llvm_prf_data[RW]
191; ZERO-SIZE-OTHER-NEXT: .ref __llvm_prf_names[RO]
192; ZERO-SIZE-OTHER-NEXT: .ref __llvm_prf_vnds[RW]
193
194; ZERO-SIZE-OTHER-OBJ:      R_REF __llvm_prf_data
195; ZERO-SIZE-OTHER-OBJ-NEXT: R_REF __llvm_prf_names
196; ZERO-SIZE-OTHER-OBJ-NEXT: R_REF __llvm_prf_vnds
197
198