| // REQUIRES: shell |
| |
| // Check that all of the hashes in this file are unique (i.e, that none of the |
| // profiles for these functions are mutually interchangeable). |
| // |
| // RUN: llvm-profdata show -all-functions %S/Inputs/cxx-hash-v2.profdata.v5 | grep "Hash: 0x" | sort > %t.hashes |
| // RUN: uniq %t.hashes > %t.hashes.unique |
| // RUN: diff %t.hashes %t.hashes.unique |
| |
| // RUN: llvm-profdata merge %S/Inputs/cxx-hash-v2.proftext -o %t.profdata |
| // RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -triple x86_64-apple-macosx10.9 -main-file-name cxx-hash-v2.mm %s -o /dev/null -emit-llvm -fprofile-instrument-use-path=%t.profdata 2>&1 | FileCheck %s -allow-empty |
| // RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -triple x86_64-apple-macosx10.9 -main-file-name cxx-hash-v2.mm %s -o /dev/null -emit-llvm -fprofile-instrument-use-path=%S/Inputs/cxx-hash-v2.profdata.v5 2>&1 | FileCheck %s -allow-empty |
| |
| // CHECK-NOT: warning: profile data may be out of date |
| |
| int x; |
| int arr[1] = {0}; |
| |
| void loop_after_if_else() { |
| if (1) |
| x = 1; |
| else |
| x = 2; |
| while (0) |
| ++x; |
| } |
| |
| void loop_in_then_block() { |
| if (1) { |
| while (0) |
| ++x; |
| } else { |
| x = 2; |
| } |
| } |
| |
| void loop_in_else_block() { |
| if (1) { |
| x = 1; |
| } else { |
| while (0) |
| ++x; |
| } |
| } |
| |
| void if_inside_of_for() { |
| for (x = 0; x < 0; ++x) { |
| x = 1; |
| if (1) |
| x = 2; |
| } |
| } |
| |
| void if_outside_of_for() { |
| for (x = 0; x < 0; ++x) |
| x = 1; |
| if (1) |
| x = 2; |
| } |
| |
| void if_inside_of_while() { |
| while (0) { |
| x = 1; |
| if (1) |
| x = 2; |
| } |
| } |
| |
| void if_outside_of_while() { |
| while (0) |
| x = 1; |
| if (1) |
| x = 2; |
| } |
| |
| void nested_dos() { |
| do { |
| do { |
| ++x; |
| } while (0); |
| } while (0); |
| } |
| |
| void consecutive_dos() { |
| do { |
| } while (0); |
| do { |
| ++x; |
| } while (0); |
| } |
| |
| void loop_empty() { |
| for (x = 0; x < 5; ++x) {} |
| } |
| |
| void loop_return() { |
| for (x = 0; x < 5; ++x) |
| return; |
| } |
| |
| void loop_continue() { |
| for (x = 0; x < 5; ++x) |
| continue; |
| } |
| |
| void loop_break() { |
| for (x = 0; x < 5; ++x) |
| break; |
| } |
| |
| void no_gotos() { |
| static void *dispatch[] = {&&done}; |
| x = 0; |
| done: |
| ++x; |
| } |
| |
| void direct_goto() { |
| static void *dispatch[] = {&&done}; |
| x = 0; |
| goto done; |
| done: |
| ++x; |
| } |
| |
| void indirect_goto() { |
| static void *dispatch[] = {&&done}; |
| x = 0; |
| goto *dispatch[x]; |
| done: |
| ++x; |
| } |
| |
| void nested_for_ranges() { |
| for (int a : arr) |
| for (int b : arr) |
| ++x; |
| } |
| |
| void consecutive_for_ranges() { |
| for (int a : arr) {} |
| for (int b : arr) |
| ++x; |
| } |
| |
| void nested_try_catch() { |
| try { |
| try { |
| ++x; |
| } catch (...) {} |
| } catch (...) {} |
| } |
| |
| void consecutive_try_catch() { |
| try {} catch (...) {} |
| try { |
| ++x; |
| } catch (...) {} |
| } |
| |
| void no_throw() {} |
| |
| void has_throw() { |
| throw 0; |
| } |
| |
| void single_lnot() { |
| if (!x) {} |
| } |
| |
| void double_lnot() { |
| if (!!x) {} |
| } |
| |
| int main() { |
| return 0; |
| } |