cxx-lambda.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // Tests for instrumentation of C++11 lambdas
  2. // RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name cxx-lambda.cpp -std=c++11 -o - -emit-llvm -fprofile-instr-generate > %tgen
  3. // RUN: FileCheck --input-file=%tgen -check-prefix=PGOGEN %s
  4. // RUN: FileCheck --input-file=%tgen -check-prefix=LMBGEN %s
  5. // RUN: llvm-profdata merge %S/Inputs/cxx-lambda.proftext -o %t.profdata
  6. // RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name cxx-lambda.cpp -std=c++11 -o - -emit-llvm -fprofile-instr-use=%t.profdata > %tuse
  7. // RUN: FileCheck --input-file=%tuse -check-prefix=PGOUSE %s
  8. // RUN: FileCheck --input-file=%tuse -check-prefix=LMBUSE %s
  9. // PGOGEN: @[[LWC:__llvm_profile_counters__Z7lambdasv]] = private global [4 x i64] zeroinitializer
  10. // PGOGEN: @[[MAC:__llvm_profile_counters_main]] = private global [1 x i64] zeroinitializer
  11. // LMBGEN: @[[LFC:"__llvm_profile_counters_cxx-lambda.cpp:_ZZ7lambdasvENK3\$_0clEi"]] = private global [3 x i64] zeroinitializer
  12. // PGOGEN-LABEL: define {{.*}}void @_Z7lambdasv()
  13. // PGOUSE-LABEL: define {{.*}}void @_Z7lambdasv()
  14. // PGOGEN: store {{.*}} @[[LWC]], i64 0, i64 0
  15. void lambdas() {
  16. int i = 1;
  17. // LMBGEN-LABEL: define internal{{( [0-9_a-z]*cc)?( zeroext)?}} i1 @"_ZZ7lambdasvENK3$_0clEi"(
  18. // LMBUSE-LABEL: define internal{{( [0-9_a-z]*cc)?( zeroext)?}} i1 @"_ZZ7lambdasvENK3$_0clEi"(
  19. // LMBGEN: store {{.*}} @[[LFC]], i64 0, i64 0
  20. auto f = [&i](int k) {
  21. // LMBGEN: store {{.*}} @[[LFC]], i64 0, i64 1
  22. // LMBUSE: br {{.*}} !prof ![[LF1:[0-9]+]]
  23. if (i > 0) {}
  24. // LMBGEN: store {{.*}} @[[LFC]], i64 0, i64 2
  25. // LMBUSE: br {{.*}} !prof ![[LF2:[0-9]+]]
  26. return k && i;
  27. };
  28. // PGOGEN: store {{.*}} @[[LWC]], i64 0, i64 1
  29. // PGOUSE: br {{.*}} !prof ![[LW1:[0-9]+]]
  30. if (i) {}
  31. // PGOGEN: store {{.*}} @[[LWC]], i64 0, i64 2
  32. // PGOUSE: br {{.*}} !prof ![[LW2:[0-9]+]]
  33. for (i = 0; i < 10; ++i)
  34. f(9 - i);
  35. // PGOGEN: store {{.*}} @[[LWC]], i64 0, i64 3
  36. // PGOUSE: br {{.*}} !prof ![[LW3:[0-9]+]]
  37. if (i) {}
  38. }
  39. // PGOUSE-DAG: ![[LW1]] = !{!"branch_weights", i32 2, i32 1}
  40. // PGOUSE-DAG: ![[LW2]] = !{!"branch_weights", i32 11, i32 2}
  41. // PGOUSE-DAG: ![[LW3]] = !{!"branch_weights", i32 2, i32 1}
  42. // LMBUSE-DAG: ![[LF1]] = !{!"branch_weights", i32 10, i32 2}
  43. // LMBUSE-DAG: ![[LF2]] = !{!"branch_weights", i32 10, i32 2}
  44. int main(int argc, const char *argv[]) {
  45. lambdas();
  46. return 0;
  47. }