1// Test instrumentation of general constructs in C. 2 3// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o - -emit-llvm -fprofile-instr-generate | FileCheck -check-prefix=PGOGEN %s 4 5// RUN: llvm-profdata merge %S/Inputs/c-general.proftext -o %t.profdata 6// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o - -emit-llvm -fprofile-instr-use=%t.profdata | FileCheck -check-prefix=PGOUSE %s 7 8// PGOGEN: @[[SLC:__llvm_profile_counters_simple_loops]] = hidden global [4 x i64] zeroinitializer 9// PGOGEN: @[[IFC:__llvm_profile_counters_conditionals]] = hidden global [11 x i64] zeroinitializer 10// PGOGEN: @[[EEC:__llvm_profile_counters_early_exits]] = hidden global [9 x i64] zeroinitializer 11// PGOGEN: @[[JMC:__llvm_profile_counters_jumps]] = hidden global [22 x i64] zeroinitializer 12// PGOGEN: @[[SWC:__llvm_profile_counters_switches]] = hidden global [19 x i64] zeroinitializer 13// PGOGEN: @[[BSC:__llvm_profile_counters_big_switch]] = hidden global [17 x i64] zeroinitializer 14// PGOGEN: @[[BOC:__llvm_profile_counters_boolean_operators]] = hidden global [8 x i64] zeroinitializer 15// PGOGEN: @[[BLC:__llvm_profile_counters_boolop_loops]] = hidden global [9 x i64] zeroinitializer 16// PGOGEN: @[[COC:__llvm_profile_counters_conditional_operator]] = hidden global [3 x i64] zeroinitializer 17// PGOGEN: @[[MAC:__llvm_profile_counters_main]] = hidden global [1 x i64] zeroinitializer 18// PGOGEN: @[[STC:__llvm_profile_counters_static_func]] = internal global [2 x i64] zeroinitializer 19 20// PGOGEN-LABEL: @simple_loops() 21// PGOUSE-LABEL: @simple_loops() 22// PGOGEN: store {{.*}} @[[SLC]], i64 0, i64 0 23void simple_loops() { 24 int i; 25 // PGOGEN: store {{.*}} @[[SLC]], i64 0, i64 1 26 // PGOUSE: br {{.*}} !prof ![[SL1:[0-9]+]] 27 for (i = 0; i < 100; ++i) { 28 } 29 // PGOGEN: store {{.*}} @[[SLC]], i64 0, i64 2 30 // PGOUSE: br {{.*}} !prof ![[SL2:[0-9]+]] 31 while (i > 0) 32 i--; 33 // PGOGEN: store {{.*}} @[[SLC]], i64 0, i64 3 34 // PGOUSE: br {{.*}} !prof ![[SL3:[0-9]+]] 35 do {} while (i++ < 75); 36 37 // PGOGEN-NOT: store {{.*}} @[[SLC]], 38 // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ 39} 40 41// PGOGEN-LABEL: @conditionals() 42// PGOUSE-LABEL: @conditionals() 43// PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 0 44void conditionals() { 45 // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 1 46 // PGOUSE: br {{.*}} !prof ![[IF1:[0-9]+]] 47 for (int i = 0; i < 100; ++i) { 48 // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 2 49 // PGOUSE: br {{.*}} !prof ![[IF2:[0-9]+]] 50 if (i % 2) { 51 // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 3 52 // PGOUSE: br {{.*}} !prof ![[IF3:[0-9]+]] 53 if (i) {} 54 // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 4 55 // PGOUSE: br {{.*}} !prof ![[IF4:[0-9]+]] 56 } else if (i % 3) { 57 // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 5 58 // PGOUSE: br {{.*}} !prof ![[IF5:[0-9]+]] 59 if (i) {} 60 } else { 61 // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 6 62 // PGOUSE: br {{.*}} !prof ![[IF6:[0-9]+]] 63 if (i) {} 64 } 65 66 // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 8 67 // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 7 68 // PGOUSE: br {{.*}} !prof ![[IF7:[0-9]+]] 69 if (1 && i) {} 70 // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 10 71 // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 9 72 // PGOUSE: br {{.*}} !prof ![[IF8:[0-9]+]] 73 if (0 || i) {} 74 } 75 76 // PGOGEN-NOT: store {{.*}} @[[IFC]], 77 // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ 78} 79 80// PGOGEN-LABEL: @early_exits() 81// PGOUSE-LABEL: @early_exits() 82// PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 0 83void early_exits() { 84 int i = 0; 85 86 // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 1 87 // PGOUSE: br {{.*}} !prof ![[EE1:[0-9]+]] 88 if (i) {} 89 90 // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 2 91 // PGOUSE: br {{.*}} !prof ![[EE2:[0-9]+]] 92 while (i < 100) { 93 i++; 94 // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 3 95 // PGOUSE: br {{.*}} !prof ![[EE3:[0-9]+]] 96 if (i > 50) 97 break; 98 // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 4 99 // PGOUSE: br {{.*}} !prof ![[EE4:[0-9]+]] 100 if (i % 2) 101 continue; 102 } 103 104 // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 5 105 // PGOUSE: br {{.*}} !prof ![[EE5:[0-9]+]] 106 if (i) {} 107 108 // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 6 109 do { 110 // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 7 111 // PGOUSE: br {{.*}} !prof ![[EE6:[0-9]+]] 112 if (i > 75) 113 return; 114 else 115 i++; 116 // PGOUSE: br {{.*}} !prof ![[EE7:[0-9]+]] 117 } while (i < 100); 118 119 // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 8 120 // Never reached -> no weights 121 if (i) {} 122 123 // PGOGEN-NOT: store {{.*}} @[[EEC]], 124 // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ 125} 126 127// PGOGEN-LABEL: @jumps() 128// PGOUSE-LABEL: @jumps() 129// PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 0 130void jumps() { 131 int i; 132 133 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 1 134 // PGOUSE: br {{.*}} !prof ![[JM1:[0-9]+]] 135 for (i = 0; i < 2; ++i) { 136 goto outofloop; 137 // Never reached -> no weights 138 if (i) {} 139 } 140// PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 3 141outofloop: 142 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 4 143 // PGOUSE: br {{.*}} !prof ![[JM2:[0-9]+]] 144 if (i) {} 145 146 goto loop1; 147 148 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 5 149 // PGOUSE: br {{.*}} !prof ![[JM3:[0-9]+]] 150 while (i) { 151 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 6 152 loop1: 153 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 7 154 // PGOUSE: br {{.*}} !prof ![[JM4:[0-9]+]] 155 if (i) {} 156 } 157 158 goto loop2; 159// PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 8 160first: 161// PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 9 162second: 163// PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 10 164third: 165 i++; 166 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 11 167 // PGOUSE: br {{.*}} !prof ![[JM5:[0-9]+]] 168 if (i < 3) 169 goto loop2; 170 171 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 12 172 // PGOUSE: br {{.*}} !prof ![[JM6:[0-9]+]] 173 while (i < 3) { 174 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 13 175 loop2: 176 // PGOUSE: switch {{.*}} [ 177 // PGOUSE: ], !prof ![[JM7:[0-9]+]] 178 switch (i) { 179 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 15 180 case 0: 181 goto first; 182 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 16 183 case 1: 184 goto second; 185 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 17 186 case 2: 187 goto third; 188 } 189 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 14 190 } 191 192 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 18 193 // PGOUSE: br {{.*}} !prof ![[JM8:[0-9]+]] 194 for (i = 0; i < 10; ++i) { 195 goto withinloop; 196 // never reached -> no weights 197 if (i) {} 198 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 20 199 withinloop: 200 // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 21 201 // PGOUSE: br {{.*}} !prof ![[JM9:[0-9]+]] 202 if (i) {} 203 } 204 205 // PGOGEN-NOT: store {{.*}} @[[JMC]], 206 // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ 207} 208 209// PGOGEN-LABEL: @switches() 210// PGOUSE-LABEL: @switches() 211// PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 0 212void switches() { 213 static int weights[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5}; 214 215 // No cases -> no weights 216 switch (weights[0]) { 217 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 2 218 default: 219 break; 220 } 221 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 1 222 223 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 3 224 // PGOUSE: br {{.*}} !prof ![[SW1:[0-9]+]] 225 for (int i = 0, len = sizeof(weights) / sizeof(weights[0]); i < len; ++i) { 226 // PGOUSE: switch {{.*}} [ 227 // PGOUSE: ], !prof ![[SW2:[0-9]+]] 228 switch (i[weights]) { 229 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 5 230 case 1: 231 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 6 232 // PGOUSE: br {{.*}} !prof ![[SW3:[0-9]+]] 233 if (i) {} 234 // fallthrough 235 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 7 236 case 2: 237 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 8 238 // PGOUSE: br {{.*}} !prof ![[SW4:[0-9]+]] 239 if (i) {} 240 break; 241 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 9 242 case 3: 243 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 10 244 // PGOUSE: br {{.*}} !prof ![[SW5:[0-9]+]] 245 if (i) {} 246 continue; 247 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 11 248 case 4: 249 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 12 250 // PGOUSE: br {{.*}} !prof ![[SW6:[0-9]+]] 251 if (i) {} 252 // PGOUSE: switch {{.*}} [ 253 // PGOUSE: ], !prof ![[SW7:[0-9]+]] 254 switch (i) { 255 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 14 256 case 6 ... 9: 257 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 15 258 // PGOUSE: br {{.*}} !prof ![[SW8:[0-9]+]] 259 if (i) {} 260 continue; 261 } 262 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 13 263 264 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 16 265 default: 266 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 17 267 // PGOUSE: br {{.*}} !prof ![[SW9:[0-9]+]] 268 if (i == len - 1) 269 return; 270 } 271 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 4 272 } 273 274 // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 18 275 // Never reached -> no weights 276 if (weights[0]) {} 277 278 // PGOGEN-NOT: store {{.*}} @[[SWC]], 279 // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ 280} 281 282// PGOGEN-LABEL: @big_switch() 283// PGOUSE-LABEL: @big_switch() 284// PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 0 285void big_switch() { 286 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 1 287 // PGOUSE: br {{.*}} !prof ![[BS1:[0-9]+]] 288 for (int i = 0; i < 32; ++i) { 289 // PGOUSE: switch {{.*}} [ 290 // PGOUSE: ], !prof ![[BS2:[0-9]+]] 291 switch (1 << i) { 292 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 3 293 case (1 << 0): 294 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 4 295 // PGOUSE: br {{.*}} !prof ![[BS3:[0-9]+]] 296 if (i) {} 297 // fallthrough 298 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 5 299 case (1 << 1): 300 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 6 301 // PGOUSE: br {{.*}} !prof ![[BS4:[0-9]+]] 302 if (i) {} 303 break; 304 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 7 305 case (1 << 2) ... (1 << 12): 306 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 8 307 // PGOUSE: br {{.*}} !prof ![[BS5:[0-9]+]] 308 if (i) {} 309 break; 310 // The branch for the large case range above appears after the case body 311 // PGOUSE: br {{.*}} !prof ![[BS6:[0-9]+]] 312 313 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 9 314 case (1 << 13): 315 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 10 316 // PGOUSE: br {{.*}} !prof ![[BS7:[0-9]+]] 317 if (i) {} 318 break; 319 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 11 320 case (1 << 14) ... (1 << 28): 321 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 12 322 // PGOUSE: br {{.*}} !prof ![[BS8:[0-9]+]] 323 if (i) {} 324 break; 325 // The branch for the large case range above appears after the case body 326 // PGOUSE: br {{.*}} !prof ![[BS9:[0-9]+]] 327 328 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 13 329 case (1 << 29) ... ((1 << 29) + 1): 330 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 14 331 // PGOUSE: br {{.*}} !prof ![[BS10:[0-9]+]] 332 if (i) {} 333 break; 334 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 15 335 default: 336 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 16 337 // PGOUSE: br {{.*}} !prof ![[BS11:[0-9]+]] 338 if (i) {} 339 break; 340 } 341 // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 2 342 } 343 344 // PGOGEN-NOT: store {{.*}} @[[BSC]], 345 // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ 346 // PGOUSE: ret void 347} 348 349// PGOGEN-LABEL: @boolean_operators() 350// PGOUSE-LABEL: @boolean_operators() 351// PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 0 352void boolean_operators() { 353 int v; 354 // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 1 355 // PGOUSE: br {{.*}} !prof ![[BO1:[0-9]+]] 356 for (int i = 0; i < 100; ++i) { 357 // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 2 358 // PGOUSE: br {{.*}} !prof ![[BO2:[0-9]+]] 359 v = i % 3 || i; 360 361 // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 3 362 // PGOUSE: br {{.*}} !prof ![[BO3:[0-9]+]] 363 v = i % 3 && i; 364 365 // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 5 366 // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 4 367 // PGOUSE: br {{.*}} !prof ![[BO4:[0-9]+]] 368 // PGOUSE: br {{.*}} !prof ![[BO5:[0-9]+]] 369 v = i % 3 || i % 2 || i; 370 371 // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 7 372 // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 6 373 // PGOUSE: br {{.*}} !prof ![[BO6:[0-9]+]] 374 // PGOUSE: br {{.*}} !prof ![[BO7:[0-9]+]] 375 v = i % 2 && i % 3 && i; 376 } 377 378 // PGOGEN-NOT: store {{.*}} @[[BOC]], 379 // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ 380} 381 382// PGOGEN-LABEL: @boolop_loops() 383// PGOUSE-LABEL: @boolop_loops() 384// PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 0 385void boolop_loops() { 386 int i = 100; 387 388 // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 2 389 // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 1 390 // PGOUSE: br {{.*}} !prof ![[BL1:[0-9]+]] 391 // PGOUSE: br {{.*}} !prof ![[BL2:[0-9]+]] 392 while (i && i > 50) 393 i--; 394 395 // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 4 396 // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 3 397 // PGOUSE: br {{.*}} !prof ![[BL3:[0-9]+]] 398 // PGOUSE: br {{.*}} !prof ![[BL4:[0-9]+]] 399 while ((i % 2) || (i > 0)) 400 i--; 401 402 // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 6 403 // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 5 404 // PGOUSE: br {{.*}} !prof ![[BL5:[0-9]+]] 405 // PGOUSE: br {{.*}} !prof ![[BL6:[0-9]+]] 406 for (i = 100; i && i > 50; --i); 407 408 // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 8 409 // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 7 410 // PGOUSE: br {{.*}} !prof ![[BL7:[0-9]+]] 411 // PGOUSE: br {{.*}} !prof ![[BL8:[0-9]+]] 412 for (; (i % 2) || (i > 0); --i); 413 414 // PGOGEN-NOT: store {{.*}} @[[BLC]], 415 // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ 416} 417 418// PGOGEN-LABEL: @conditional_operator() 419// PGOUSE-LABEL: @conditional_operator() 420// PGOGEN: store {{.*}} @[[COC]], i64 0, i64 0 421void conditional_operator() { 422 int i = 100; 423 424 // PGOGEN: store {{.*}} @[[COC]], i64 0, i64 1 425 // PGOUSE: br {{.*}} !prof ![[CO1:[0-9]+]] 426 int j = i < 50 ? i : 1; 427 428 // PGOGEN: store {{.*}} @[[COC]], i64 0, i64 2 429 // PGOUSE: br {{.*}} !prof ![[CO2:[0-9]+]] 430 int k = i ?: 0; 431 432 // PGOGEN-NOT: store {{.*}} @[[COC]], 433 // PGOUSE-NOT: br {{.*}} !prof ![0-9]+ 434} 435 436void do_fallthrough() { 437 for (int i = 0; i < 10; ++i) { 438 int j = 0; 439 do { 440 // The number of exits out of this do-loop via the break statement 441 // exceeds the counter value for the loop (which does not include the 442 // fallthrough count). Make sure that does not violate any assertions. 443 if (i < 8) break; 444 j++; 445 } while (j < 2); 446 } 447} 448 449// PGOGEN-LABEL: @static_func() 450// PGOUSE-LABEL: @static_func() 451// PGOGEN: store {{.*}} @[[STC]], i64 0, i64 0 452static void static_func() { 453 // PGOGEN: store {{.*}} @[[STC]], i64 0, i64 1 454 // PGOUSE: br {{.*}} !prof ![[ST1:[0-9]+]] 455 for (int i = 0; i < 10; ++i) { 456 } 457} 458 459// PGOUSE-DAG: ![[SL1]] = metadata !{metadata !"branch_weights", i32 101, i32 2} 460// PGOUSE-DAG: ![[SL2]] = metadata !{metadata !"branch_weights", i32 101, i32 2} 461// PGOUSE-DAG: ![[SL3]] = metadata !{metadata !"branch_weights", i32 76, i32 2} 462 463// PGOUSE-DAG: ![[EE1]] = metadata !{metadata !"branch_weights", i32 1, i32 2} 464// PGOUSE-DAG: ![[EE2]] = metadata !{metadata !"branch_weights", i32 52, i32 1} 465// PGOUSE-DAG: ![[EE3]] = metadata !{metadata !"branch_weights", i32 2, i32 51} 466// PGOUSE-DAG: ![[EE4]] = metadata !{metadata !"branch_weights", i32 26, i32 26} 467// PGOUSE-DAG: ![[EE5]] = metadata !{metadata !"branch_weights", i32 2, i32 1} 468// PGOUSE-DAG: ![[EE6]] = metadata !{metadata !"branch_weights", i32 2, i32 26} 469// PGOUSE-DAG: ![[EE7]] = metadata !{metadata !"branch_weights", i32 26, i32 1} 470 471// PGOUSE-DAG: ![[IF1]] = metadata !{metadata !"branch_weights", i32 101, i32 2} 472// PGOUSE-DAG: ![[IF2]] = metadata !{metadata !"branch_weights", i32 51, i32 51} 473// PGOUSE-DAG: ![[IF3]] = metadata !{metadata !"branch_weights", i32 51, i32 1} 474// PGOUSE-DAG: ![[IF4]] = metadata !{metadata !"branch_weights", i32 34, i32 18} 475// PGOUSE-DAG: ![[IF5]] = metadata !{metadata !"branch_weights", i32 34, i32 1} 476// PGOUSE-DAG: ![[IF6]] = metadata !{metadata !"branch_weights", i32 17, i32 2} 477// PGOUSE-DAG: ![[IF7]] = metadata !{metadata !"branch_weights", i32 100, i32 2} 478// PGOUSE-DAG: ![[IF8]] = metadata !{metadata !"branch_weights", i32 100, i32 2} 479 480// PGOUSE-DAG: ![[JM1]] = metadata !{metadata !"branch_weights", i32 2, i32 1} 481// PGOUSE-DAG: ![[JM2]] = metadata !{metadata !"branch_weights", i32 1, i32 2} 482// PGOUSE-DAG: ![[JM3]] = metadata !{metadata !"branch_weights", i32 1, i32 2} 483// PGOUSE-DAG: ![[JM4]] = metadata !{metadata !"branch_weights", i32 1, i32 2} 484// PGOUSE-DAG: ![[JM5]] = metadata !{metadata !"branch_weights", i32 3, i32 2} 485// PGOUSE-DAG: ![[JM6]] = metadata !{metadata !"branch_weights", i32 1, i32 2} 486// PGOUSE-DAG: ![[JM7]] = metadata !{metadata !"branch_weights", i32 1, i32 2, i32 2, i32 2} 487// PGOUSE-DAG: ![[JM8]] = metadata !{metadata !"branch_weights", i32 11, i32 2} 488// PGOUSE-DAG: ![[JM9]] = metadata !{metadata !"branch_weights", i32 10, i32 2} 489 490// PGOUSE-DAG: ![[SW1]] = metadata !{metadata !"branch_weights", i32 16, i32 1} 491// PGOUSE-DAG: ![[SW2]] = metadata !{metadata !"branch_weights", i32 6, i32 2, i32 3, i32 4, i32 5} 492// PGOUSE-DAG: ![[SW3]] = metadata !{metadata !"branch_weights", i32 1, i32 2} 493// PGOUSE-DAG: ![[SW4]] = metadata !{metadata !"branch_weights", i32 3, i32 2} 494// PGOUSE-DAG: ![[SW5]] = metadata !{metadata !"branch_weights", i32 4, i32 1} 495// PGOUSE-DAG: ![[SW6]] = metadata !{metadata !"branch_weights", i32 5, i32 1} 496// PGOUSE-DAG: ![[SW7]] = metadata !{metadata !"branch_weights", i32 1, i32 2, i32 2, i32 2, i32 2} 497// PGOUSE-DAG: ![[SW8]] = metadata !{metadata !"branch_weights", i32 5, i32 1} 498// PGOUSE-DAG: ![[SW9]] = metadata !{metadata !"branch_weights", i32 2, i32 5} 499 500// PGOUSE-DAG: ![[BS1]] = metadata !{metadata !"branch_weights", i32 33, i32 2} 501// PGOUSE-DAG: ![[BS2]] = metadata !{metadata !"branch_weights", i32 29, i32 2, i32 2, i32 2, i32 2, i32 1} 502// PGOUSE-DAG: ![[BS3]] = metadata !{metadata !"branch_weights", i32 1, i32 2} 503// PGOUSE-DAG: ![[BS4]] = metadata !{metadata !"branch_weights", i32 2, i32 2} 504// PGOUSE-DAG: ![[BS5]] = metadata !{metadata !"branch_weights", i32 12, i32 1} 505// PGOUSE-DAG: ![[BS6]] = metadata !{metadata !"branch_weights", i32 12, i32 3} 506// PGOUSE-DAG: ![[BS7]] = metadata !{metadata !"branch_weights", i32 2, i32 1} 507// PGOUSE-DAG: ![[BS8]] = metadata !{metadata !"branch_weights", i32 16, i32 1} 508// PGOUSE-DAG: ![[BS9]] = metadata !{metadata !"branch_weights", i32 16, i32 14} 509// PGOUSE-DAG: ![[BS10]] = metadata !{metadata !"branch_weights", i32 2, i32 1} 510// PGOUSE-DAG: ![[BS11]] = metadata !{metadata !"branch_weights", i32 3, i32 1} 511 512// PGOUSE-DAG: ![[BO1]] = metadata !{metadata !"branch_weights", i32 101, i32 2} 513// PGOUSE-DAG: ![[BO2]] = metadata !{metadata !"branch_weights", i32 67, i32 35} 514// PGOUSE-DAG: ![[BO3]] = metadata !{metadata !"branch_weights", i32 67, i32 35} 515// PGOUSE-DAG: ![[BO4]] = metadata !{metadata !"branch_weights", i32 67, i32 35} 516// PGOUSE-DAG: ![[BO5]] = metadata !{metadata !"branch_weights", i32 18, i32 18} 517// PGOUSE-DAG: ![[BO6]] = metadata !{metadata !"branch_weights", i32 51, i32 51} 518// PGOUSE-DAG: ![[BO7]] = metadata !{metadata !"branch_weights", i32 34, i32 18} 519// PGOUSE-DAG: ![[BL1]] = metadata !{metadata !"branch_weights", i32 52, i32 1} 520// PGOUSE-DAG: ![[BL2]] = metadata !{metadata !"branch_weights", i32 51, i32 2} 521// PGOUSE-DAG: ![[BL3]] = metadata !{metadata !"branch_weights", i32 26, i32 27} 522// PGOUSE-DAG: ![[BL4]] = metadata !{metadata !"branch_weights", i32 51, i32 2} 523// PGOUSE-DAG: ![[BL5]] = metadata !{metadata !"branch_weights", i32 52, i32 1} 524// PGOUSE-DAG: ![[BL6]] = metadata !{metadata !"branch_weights", i32 51, i32 2} 525// PGOUSE-DAG: ![[BL7]] = metadata !{metadata !"branch_weights", i32 26, i32 27} 526// PGOUSE-DAG: ![[BL8]] = metadata !{metadata !"branch_weights", i32 51, i32 2} 527// PGOUSE-DAG: ![[CO1]] = metadata !{metadata !"branch_weights", i32 1, i32 2} 528// PGOUSE-DAG: ![[CO2]] = metadata !{metadata !"branch_weights", i32 2, i32 1} 529// PGOUSE-DAG: ![[ST1]] = metadata !{metadata !"branch_weights", i32 11, i32 2} 530 531int main(int argc, const char *argv[]) { 532 simple_loops(); 533 conditionals(); 534 early_exits(); 535 jumps(); 536 switches(); 537 big_switch(); 538 boolean_operators(); 539 boolop_loops(); 540 conditional_operator(); 541 do_fallthrough(); 542 static_func(); 543 return 0; 544} 545