xref: /aosp_15_r20/external/clang/test/Profile/cxx-templates.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // Tests for instrumentation of templated code. Each instantiation of a template
2*67e74705SXin Li // should be instrumented separately.
3*67e74705SXin Li 
4*67e74705SXin Li // RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name cxx-templates.cpp -std=c++11 -o - -emit-llvm -fprofile-instrument=clang > %tgen
5*67e74705SXin Li // RUN: FileCheck --input-file=%tgen -check-prefix=T0GEN -check-prefix=ALL %s
6*67e74705SXin Li // RUN: FileCheck --input-file=%tgen -check-prefix=T100GEN -check-prefix=ALL %s
7*67e74705SXin Li 
8*67e74705SXin Li // RUN: llvm-profdata merge %S/Inputs/cxx-templates.proftext -o %t.profdata
9*67e74705SXin Li // RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name cxx-templates.cpp -std=c++11 -o - -emit-llvm -fprofile-instrument-use-path=%t.profdata > %tuse
10*67e74705SXin Li // RUN: FileCheck --input-file=%tuse -check-prefix=T0USE -check-prefix=ALL %s
11*67e74705SXin Li // RUN: FileCheck --input-file=%tuse -check-prefix=T100USE -check-prefix=ALL %s
12*67e74705SXin Li 
13*67e74705SXin Li // T0GEN: @[[T0C:__profc__Z4loopILj0EEvv]] = linkonce_odr hidden global [2 x i64] zeroinitializer
14*67e74705SXin Li // T100GEN: @[[T100C:__profc__Z4loopILj100EEvv]] = linkonce_odr hidden global [2 x i64] zeroinitializer
15*67e74705SXin Li 
16*67e74705SXin Li // T0GEN-LABEL: define linkonce_odr {{.*}}void @_Z4loopILj0EEvv()
17*67e74705SXin Li // T0USE-LABEL: define linkonce_odr {{.*}}void @_Z4loopILj0EEvv()
18*67e74705SXin Li // T100GEN-LABEL: define linkonce_odr {{.*}}void @_Z4loopILj100EEvv()
19*67e74705SXin Li // T100USE-LABEL: define linkonce_odr {{.*}}void @_Z4loopILj100EEvv()
loop()20*67e74705SXin Li template <unsigned N> void loop() {
21*67e74705SXin Li   // ALL-NOT: ret
22*67e74705SXin Li   // T0GEN: store {{.*}} @[[T0C]], i64 0, i64 0
23*67e74705SXin Li   // T100GEN: store {{.*}} @[[T100C]], i64 0, i64 0
24*67e74705SXin Li 
25*67e74705SXin Li   // ALL-NOT: ret
26*67e74705SXin Li   // T0GEN: store {{.*}} @[[T0C]], i64 0, i64 1
27*67e74705SXin Li   // T0USE: br {{.*}} !prof ![[T01:[0-9]+]]
28*67e74705SXin Li   // T100GEN: store {{.*}} @[[T100C]], i64 0, i64 1
29*67e74705SXin Li   // T100USE: br {{.*}} !prof ![[T1001:[0-9]+]]
30*67e74705SXin Li   for (unsigned I = 0; I < N; ++I) {}
31*67e74705SXin Li 
32*67e74705SXin Li   // ALL: ret
33*67e74705SXin Li }
34*67e74705SXin Li 
35*67e74705SXin Li // T0USE-DAG: ![[T01]] = !{!"branch_weights", i32 1, i32 2}
36*67e74705SXin Li // T100USE-DAG: ![[T1001]] = !{!"branch_weights", i32 101, i32 2}
37*67e74705SXin Li 
main(int argc,const char * argv[])38*67e74705SXin Li int main(int argc, const char *argv[]) {
39*67e74705SXin Li   loop<0>();
40*67e74705SXin Li   loop<100>();
41*67e74705SXin Li   return 0;
42*67e74705SXin Li }
43