1191ec63bSJustin Bogner // Tests for instrumentation of C++11 lambdas 2191ec63bSJustin Bogner 39837ef56SRong Xu // RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name cxx-lambda.cpp -std=c++11 -o - -emit-llvm -fprofile-instrument=clang > %tgen 472c27830SJoel E. Denny // RUN: FileCheck -allow-deprecated-dag-overlap --input-file=%tgen -check-prefix=PGOGEN %s 572c27830SJoel E. Denny // RUN: FileCheck -allow-deprecated-dag-overlap --input-file=%tgen -check-prefix=LMBGEN %s 6191ec63bSJustin Bogner 7534f14abSJustin Bogner // RUN: llvm-profdata merge %S/Inputs/cxx-lambda.proftext -o %t.profdata 89c6f1538SRong Xu // RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name cxx-lambda.cpp -std=c++11 -o - -emit-llvm -fprofile-instrument-use-path=%t.profdata > %tuse 972c27830SJoel E. Denny // RUN: FileCheck -allow-deprecated-dag-overlap --input-file=%tuse -check-prefix=PGOUSE %s 1072c27830SJoel E. Denny // RUN: FileCheck -allow-deprecated-dag-overlap --input-file=%tuse -check-prefix=LMBUSE %s 11191ec63bSJustin Bogner 12*5bbdfeacSReid Kleckner // PGOGEN: @[[LWC:__profc__Z7lambdasv]] = {{(private|internal)}} global [4 x i64] zeroinitializer 13*5bbdfeacSReid Kleckner // PGOGEN: @[[MAC:__profc_main]] = {{(private|internal)}} global [1 x i64] zeroinitializer 14*5bbdfeacSReid Kleckner // LMBGEN: @[[LFC:"__profc_cxx_lambda.cpp__ZZ7lambdasvENK3\$_0clEi"]] = {{(private|internal)}} global [3 x i64] zeroinitializer 15191ec63bSJustin Bogner 16ea3e51d7SDavid Blaikie // PGOGEN-LABEL: define {{.*}}void @_Z7lambdasv() 17ea3e51d7SDavid Blaikie // PGOUSE-LABEL: define {{.*}}void @_Z7lambdasv() 18191ec63bSJustin Bogner // PGOGEN: store {{.*}} @[[LWC]], i64 0, i64 0 19191ec63bSJustin Bogner void lambdas() { 20191ec63bSJustin Bogner int i = 1; 21191ec63bSJustin Bogner 22886fbad4SNAKAMURA Takumi // LMBGEN-LABEL: define internal{{( [0-9_a-z]*cc)?( zeroext)?}} i1 @"_ZZ7lambdasvENK3$_0clEi"( 23886fbad4SNAKAMURA Takumi // LMBUSE-LABEL: define internal{{( [0-9_a-z]*cc)?( zeroext)?}} i1 @"_ZZ7lambdasvENK3$_0clEi"( 24191ec63bSJustin Bogner // LMBGEN: store {{.*}} @[[LFC]], i64 0, i64 0 25191ec63bSJustin Bogner auto f = [&i](int k) { 26191ec63bSJustin Bogner // LMBGEN: store {{.*}} @[[LFC]], i64 0, i64 1 27191ec63bSJustin Bogner // LMBUSE: br {{.*}} !prof ![[LF1:[0-9]+]] 28191ec63bSJustin Bogner if (i > 0) {} 29191ec63bSJustin Bogner // LMBGEN: store {{.*}} @[[LFC]], i64 0, i64 2 30191ec63bSJustin Bogner // LMBUSE: br {{.*}} !prof ![[LF2:[0-9]+]] 31191ec63bSJustin Bogner return k && i; 32191ec63bSJustin Bogner }; 33191ec63bSJustin Bogner 34191ec63bSJustin Bogner // PGOGEN: store {{.*}} @[[LWC]], i64 0, i64 1 35191ec63bSJustin Bogner // PGOUSE: br {{.*}} !prof ![[LW1:[0-9]+]] 36191ec63bSJustin Bogner if (i) {} 37191ec63bSJustin Bogner 38191ec63bSJustin Bogner // PGOGEN: store {{.*}} @[[LWC]], i64 0, i64 2 39191ec63bSJustin Bogner // PGOUSE: br {{.*}} !prof ![[LW2:[0-9]+]] 40191ec63bSJustin Bogner for (i = 0; i < 10; ++i) 41191ec63bSJustin Bogner f(9 - i); 42191ec63bSJustin Bogner 43191ec63bSJustin Bogner // PGOGEN: store {{.*}} @[[LWC]], i64 0, i64 3 44191ec63bSJustin Bogner // PGOUSE: br {{.*}} !prof ![[LW3:[0-9]+]] 45191ec63bSJustin Bogner if (i) {} 46191ec63bSJustin Bogner } 47191ec63bSJustin Bogner 48b3a66691SDuncan P. N. Exon Smith // PGOUSE-DAG: ![[LW1]] = !{!"branch_weights", i32 2, i32 1} 49b3a66691SDuncan P. N. Exon Smith // PGOUSE-DAG: ![[LW2]] = !{!"branch_weights", i32 11, i32 2} 50b3a66691SDuncan P. N. Exon Smith // PGOUSE-DAG: ![[LW3]] = !{!"branch_weights", i32 2, i32 1} 51191ec63bSJustin Bogner 52b3a66691SDuncan P. N. Exon Smith // LMBUSE-DAG: ![[LF1]] = !{!"branch_weights", i32 10, i32 2} 53b3a66691SDuncan P. N. Exon Smith // LMBUSE-DAG: ![[LF2]] = !{!"branch_weights", i32 10, i32 2} 54191ec63bSJustin Bogner 55191ec63bSJustin Bogner int main(int argc, const char *argv[]) { 56191ec63bSJustin Bogner lambdas(); 57191ec63bSJustin Bogner return 0; 58191ec63bSJustin Bogner } 59