• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // REQUIRES: shell
2 
3 // Check that all of the hashes in this file are unique (i.e, that none of the
4 // profiles for these functions are mutually interchangeable).
5 //
6 // RUN: llvm-profdata show -all-functions %S/Inputs/cxx-hash-v2.profdata.v5 | grep "Hash: 0x" | sort > %t.hashes
7 // RUN: uniq %t.hashes > %t.hashes.unique
8 // RUN: diff %t.hashes %t.hashes.unique
9 
10 // RUN: llvm-profdata merge %S/Inputs/cxx-hash-v2.proftext -o %t.profdata
11 // 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
12 // 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
13 
14 // CHECK-NOT: warning: profile data may be out of date
15 
16 int x;
17 int arr[1] = {0};
18 
loop_after_if_else()19 void loop_after_if_else() {
20   if (1)
21     x = 1;
22   else
23     x = 2;
24   while (0)
25     ++x;
26 }
27 
loop_in_then_block()28 void loop_in_then_block() {
29   if (1) {
30     while (0)
31       ++x;
32   } else {
33     x = 2;
34   }
35 }
36 
loop_in_else_block()37 void loop_in_else_block() {
38   if (1) {
39     x = 1;
40   } else {
41     while (0)
42       ++x;
43   }
44 }
45 
if_inside_of_for()46 void if_inside_of_for() {
47   for (x = 0; x < 0; ++x) {
48     x = 1;
49     if (1)
50       x = 2;
51   }
52 }
53 
if_outside_of_for()54 void if_outside_of_for() {
55   for (x = 0; x < 0; ++x)
56     x = 1;
57   if (1)
58     x = 2;
59 }
60 
if_inside_of_while()61 void if_inside_of_while() {
62   while (0) {
63     x = 1;
64     if (1)
65       x = 2;
66   }
67 }
68 
if_outside_of_while()69 void if_outside_of_while() {
70   while (0)
71     x = 1;
72   if (1)
73     x = 2;
74 }
75 
nested_dos()76 void nested_dos() {
77   do {
78     do {
79       ++x;
80     } while (0);
81   } while (0);
82 }
83 
consecutive_dos()84 void consecutive_dos() {
85   do {
86   } while (0);
87   do {
88     ++x;
89   } while (0);
90 }
91 
loop_empty()92 void loop_empty() {
93   for (x = 0; x < 5; ++x) {}
94 }
95 
loop_return()96 void loop_return() {
97   for (x = 0; x < 5; ++x)
98     return;
99 }
100 
loop_continue()101 void loop_continue() {
102   for (x = 0; x < 5; ++x)
103     continue;
104 }
105 
loop_break()106 void loop_break() {
107   for (x = 0; x < 5; ++x)
108     break;
109 }
110 
no_gotos()111 void no_gotos() {
112   static void *dispatch[] = {&&done};
113   x = 0;
114 done:
115   ++x;
116 }
117 
direct_goto()118 void direct_goto() {
119   static void *dispatch[] = {&&done};
120   x = 0;
121   goto done;
122 done:
123   ++x;
124 }
125 
indirect_goto()126 void indirect_goto() {
127   static void *dispatch[] = {&&done};
128   x = 0;
129   goto *dispatch[x];
130 done:
131   ++x;
132 }
133 
nested_for_ranges()134 void nested_for_ranges() {
135   for (int a : arr)
136     for (int b : arr)
137       ++x;
138 }
139 
consecutive_for_ranges()140 void consecutive_for_ranges() {
141   for (int a : arr) {}
142   for (int b : arr)
143     ++x;
144 }
145 
nested_try_catch()146 void nested_try_catch() {
147   try {
148     try {
149       ++x;
150     } catch (...) {}
151   } catch (...) {}
152 }
153 
consecutive_try_catch()154 void consecutive_try_catch() {
155   try {} catch (...) {}
156   try {
157     ++x;
158   } catch (...) {}
159 }
160 
no_throw()161 void no_throw() {}
162 
has_throw()163 void has_throw() {
164   throw 0;
165 }
166 
single_lnot()167 void single_lnot() {
168   if (!x) {}
169 }
170 
double_lnot()171 void double_lnot() {
172   if (!!x) {}
173 }
174 
main()175 int main() {
176   return 0;
177 }
178