1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs 2; RUN: opt -S -attributor -openmp-opt-cgscc -openmp-opt-enable-merging -enable-new-pm=0 < %s | FileCheck %s 3; RUN: opt -S -aa-pipeline= -passes='attributor,cgscc(openmp-opt-cgscc)' -openmp-opt-enable-merging < %s | FileCheck %s 4; #include <omp.h> 5; void foo(); 6; void use(int); 7; void usef(float); 8; void merge(int a) { 9; #pragma omp parallel 10; { 11; use(a); 12; } 13; #pragma omp parallel 14; { 15; use(a); 16; } 17; } 18; void unmergable_proc_bind(int a) { 19; #pragma omp parallel proc_bind(close) 20; { 21; use(a); 22; } 23; #pragma omp parallel 24; { 25; use(a); 26; } 27; } 28; void unmergable_num_threads(int a) { 29; #pragma omp parallel num_threads(a) 30; { 31; use(a); 32; } 33; #pragma omp parallel 34; { 35; use(a); 36; } 37; } 38; void unmergable_seq_call(int a) { 39; #pragma omp parallel 40; { 41; use(a); 42; } 43; foo(); 44; #pragma omp parallel 45; { 46; use(a); 47; } 48; } 49; void merge_seq(int a) { 50; #pragma omp parallel 51; { 52; use(a); 53; } 54; a = a + 1; 55; #pragma omp parallel 56; { 57; use(a); 58; } 59; use(a); 60; } 61; void merge_seq_float(float f, float *p) { 62; #pragma omp parallel 63; { 64; use(f); 65; } 66; *p = f + 3.14f; 67; #pragma omp parallel 68; { 69; use(f); 70; } 71; } 72; void merge_seq_firstprivate(int a) { 73; #pragma omp parallel 74; { 75; use(a); 76; } 77; a = a + 1; 78; #pragma omp parallel firstprivate(a) 79; { 80; use(a); 81; } 82; use(a); 83; } 84; void merge_seq_sink_lt(int a) { 85; #pragma omp parallel 86; { 87; use(a); 88; } 89; { 90; int b = (int)&b; 91; } 92; #pragma omp parallel 93; { 94; use(a); 95; } 96; } 97; void merge_seq_par_use(int a) { 98; #pragma omp parallel 99; { 100; use(a); 101; } 102; int b = a + 1; 103; #pragma omp parallel 104; { 105; use(a); 106; use(b); 107; } 108; } 109; void merge_cancellable_regions(int cancel1, int cancel2) 110; { 111; #pragma omp parallel 112; { 113; if(cancel1) { 114; #pragma omp cancel parallel 115; } 116; } 117; #pragma omp parallel 118; { 119; if (cancel2) { 120; #pragma omp cancel parallel 121; } 122; } 123; } 124; void merge_cancellable_regions_seq(int cancel1, int cancel2) 125; { 126; #pragma omp parallel 127; { 128; if(cancel1) { 129; #pragma omp cancel parallel 130; } 131; } 132; cancel2 = !cancel1; 133; #pragma omp parallel 134; { 135; if (cancel2) { 136; #pragma omp cancel parallel 137; } 138; } 139; } 140; void merge_3(int a) { 141; #pragma omp parallel 142; { 143; use(a); 144; } 145; #pragma omp parallel 146; { 147; use(a); 148; } 149; #pragma omp parallel 150; { 151; use(a); 152; } 153; } 154; void merge_3_seq(int a, int b) { 155; #pragma omp parallel 156; { 157; use(a); 158; } 159; b = a + 1; 160; #pragma omp parallel 161; { 162; use(a); 163; } 164; b = b + a; 165; #pragma omp parallel 166; { 167; use(a); 168; } 169; use(b); 170; } 171; void unmergable_3_seq_call(int a) { 172; #pragma omp parallel 173; { 174; use(a); 175; } 176; foo(); 177; #pragma omp parallel 178; { 179; use(a); 180; } 181; foo(); 182; #pragma omp parallel 183; { 184; use(a); 185; } 186; } 187; void unmergable_3_proc_bind(int a) { 188; #pragma omp parallel 189; { 190; use(a); 191; } 192; #pragma omp parallel proc_bind(close) 193; { 194; use(a); 195; } 196; #pragma omp parallel 197; { 198; use(a); 199; } 200; } 201; void unmergable_3_num_threads(int a) { 202; #pragma omp parallel 203; { 204; use(a); 205; } 206; #pragma omp parallel num_threads(a) 207; { 208; use(a); 209; } 210; #pragma omp parallel 211; { 212; use(a); 213; } 214; } 215; void merge_2_unmergable_1(int a) { 216; #pragma omp parallel 217; { 218; use(a); 219; } 220; #pragma omp parallel 221; { 222; use(a); 223; } 224; foo(); 225; #pragma omp parallel 226; { 227; use(a); 228; } 229; } 230target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 231 232%struct.ident_t = type { i32, i32, i32, i32, i8* } 233 234@0 = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1 235@1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @0, i32 0, i32 0) }, align 8 236 237define dso_local void @merge(i32 %a) local_unnamed_addr { 238entry: 239 %a.addr = alloca i32, align 4 240 store i32 %a, i32* %a.addr, align 4 241 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 242 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 243 ret void 244} 245 246define internal void @.omp_outlined.(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 247entry: 248 %0 = load i32, i32* %a, align 4 249 call void @use(i32 %0) 250 ret void 251} 252 253declare dso_local void @use(i32) local_unnamed_addr 254 255declare !callback !1 void @__kmpc_fork_call(%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) local_unnamed_addr 256 257define internal void @.omp_outlined..1(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 258entry: 259 %0 = load i32, i32* %a, align 4 260 call void @use(i32 %0) 261 ret void 262} 263 264define dso_local void @unmergable_proc_bind(i32 %a) local_unnamed_addr { 265entry: 266 %a.addr = alloca i32, align 4 267 %0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @1) 268 store i32 %a, i32* %a.addr, align 4 269 call void @__kmpc_push_proc_bind(%struct.ident_t* nonnull @1, i32 %0, i32 3) 270 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 271 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 272 ret void 273} 274 275define internal void @.omp_outlined..2(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 276entry: 277 %0 = load i32, i32* %a, align 4 278 call void @use(i32 %0) 279 ret void 280} 281 282declare i32 @__kmpc_global_thread_num(%struct.ident_t*) local_unnamed_addr 283 284declare void @__kmpc_push_proc_bind(%struct.ident_t*, i32, i32) local_unnamed_addr 285 286define internal void @.omp_outlined..3(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 287entry: 288 %0 = load i32, i32* %a, align 4 289 call void @use(i32 %0) 290 ret void 291} 292 293define dso_local void @unmergable_num_threads(i32 %a) local_unnamed_addr { 294entry: 295 %a.addr = alloca i32, align 4 296 %0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @1) 297 store i32 %a, i32* %a.addr, align 4 298 call void @__kmpc_push_num_threads(%struct.ident_t* nonnull @1, i32 %0, i32 %a) 299 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 300 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 301 ret void 302} 303 304define internal void @.omp_outlined..4(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 305entry: 306 %0 = load i32, i32* %a, align 4 307 call void @use(i32 %0) 308 ret void 309} 310 311declare void @__kmpc_push_num_threads(%struct.ident_t*, i32, i32) local_unnamed_addr 312 313define internal void @.omp_outlined..5(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 314entry: 315 %0 = load i32, i32* %a, align 4 316 call void @use(i32 %0) 317 ret void 318} 319 320define dso_local void @unmergable_seq_call(i32 %a) local_unnamed_addr { 321entry: 322 %a.addr = alloca i32, align 4 323 store i32 %a, i32* %a.addr, align 4 324 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 325 call void (...) @foo() 326 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 327 ret void 328} 329 330define internal void @.omp_outlined..6(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 331entry: 332 %0 = load i32, i32* %a, align 4 333 call void @use(i32 %0) 334 ret void 335} 336 337declare dso_local void @foo(...) local_unnamed_addr 338 339define internal void @.omp_outlined..7(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 340entry: 341 %0 = load i32, i32* %a, align 4 342 call void @use(i32 %0) 343 ret void 344} 345 346define dso_local void @merge_seq(i32 %a) local_unnamed_addr { 347entry: 348 %a.addr = alloca i32, align 4 349 store i32 %a, i32* %a.addr, align 4 350 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..8 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 351 %0 = load i32, i32* %a.addr, align 4 352 %add = add nsw i32 %0, 1 353 store i32 %add, i32* %a.addr, align 4 354 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..9 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 355 %1 = load i32, i32* %a.addr, align 4 356 call void @use(i32 %1) 357 ret void 358} 359 360define internal void @.omp_outlined..8(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 361entry: 362 %0 = load i32, i32* %a, align 4 363 call void @use(i32 %0) 364 ret void 365} 366 367define internal void @.omp_outlined..9(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 368entry: 369 %0 = load i32, i32* %a, align 4 370 call void @use(i32 %0) 371 ret void 372} 373 374define dso_local void @merge_seq_float(float %f, float* nocapture %p) local_unnamed_addr { 375entry: 376 %f.addr = alloca float, align 4 377 store float %f, float* %f.addr, align 4 378 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*)* @.omp_outlined..10 to void (i32*, i32*, ...)*), float* nonnull %f.addr) 379 %0 = load float, float* %f.addr, align 4 380 %add = fadd float %0, 0x40091EB860000000 381 store float %add, float* %p, align 4 382 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*)* @.omp_outlined..11 to void (i32*, i32*, ...)*), float* nonnull %f.addr) 383 ret void 384} 385 386define internal void @.omp_outlined..10(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., float* nocapture nonnull readonly align 4 dereferenceable(4) %f) { 387entry: 388 %0 = load float, float* %f, align 4 389 %conv = fptosi float %0 to i32 390 call void @use(i32 %conv) 391 ret void 392} 393 394define internal void @.omp_outlined..11(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., float* nocapture nonnull readonly align 4 dereferenceable(4) %f) { 395entry: 396 %0 = load float, float* %f, align 4 397 %conv = fptosi float %0 to i32 398 call void @use(i32 %conv) 399 ret void 400} 401 402define dso_local void @merge_seq_firstprivate(i32 %a) local_unnamed_addr { 403entry: 404 %a.addr = alloca i32, align 4 405 store i32 %a, i32* %a.addr, align 4 406 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..12 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 407 %0 = load i32, i32* %a.addr, align 4 408 %add = add nsw i32 %0, 1 409 store i32 %add, i32* %a.addr, align 4 410 %a.casted.sroa.0.0.insert.ext = zext i32 %add to i64 411 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64)* @.omp_outlined..13 to void (i32*, i32*, ...)*), i64 %a.casted.sroa.0.0.insert.ext) 412 %1 = load i32, i32* %a.addr, align 4 413 call void @use(i32 %1) 414 ret void 415} 416 417define internal void @.omp_outlined..12(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 418entry: 419 %0 = load i32, i32* %a, align 4 420 call void @use(i32 %0) 421 ret void 422} 423 424define internal void @.omp_outlined..13(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i64 %a) { 425entry: 426 %a.addr.sroa.0.0.extract.trunc = trunc i64 %a to i32 427 call void @use(i32 %a.addr.sroa.0.0.extract.trunc) 428 ret void 429} 430 431define dso_local void @merge_seq_sink_lt(i32 %a) local_unnamed_addr { 432entry: 433 %a.addr = alloca i32, align 4 434 %b = alloca i32, align 4 435 store i32 %a, i32* %a.addr, align 4 436 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..14 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 437 %0 = bitcast i32* %b to i8* 438 call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0) 439 %1 = ptrtoint i32* %b to i64 440 %2 = trunc i64 %1 to i32 441 store i32 %2, i32* %b, align 4 442 call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0) 443 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..15 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 444 ret void 445} 446 447define internal void @.omp_outlined..14(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 448entry: 449 %0 = load i32, i32* %a, align 4 450 call void @use(i32 %0) 451 ret void 452} 453 454declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) 455 456declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) 457 458define internal void @.omp_outlined..15(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 459entry: 460 %0 = load i32, i32* %a, align 4 461 call void @use(i32 %0) 462 ret void 463} 464 465define dso_local void @merge_seq_par_use(i32 %a) local_unnamed_addr { 466entry: 467 %a.addr = alloca i32, align 4 468 %b = alloca i32, align 4 469 store i32 %a, i32* %a.addr, align 4 470 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..16 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 471 %0 = bitcast i32* %b to i8* 472 call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0) 473 %1 = load i32, i32* %a.addr, align 4 474 %add = add nsw i32 %1, 1 475 store i32 %add, i32* %b, align 4 476 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @.omp_outlined..17 to void (i32*, i32*, ...)*), i32* nonnull %a.addr, i32* nonnull %b) 477 call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0) 478 ret void 479} 480 481define internal void @.omp_outlined..16(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 482entry: 483 %0 = load i32, i32* %a, align 4 484 call void @use(i32 %0) 485 ret void 486} 487 488define internal void @.omp_outlined..17(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a, i32* nocapture nonnull readonly align 4 dereferenceable(4) %b) { 489entry: 490 %0 = load i32, i32* %a, align 4 491 call void @use(i32 %0) 492 %1 = load i32, i32* %b, align 4 493 call void @use(i32 %1) 494 ret void 495} 496 497define dso_local void @merge_cancellable_regions(i32 %cancel1, i32 %cancel2) local_unnamed_addr { 498entry: 499 %cancel1.addr = alloca i32, align 4 500 %cancel2.addr = alloca i32, align 4 501 store i32 %cancel1, i32* %cancel1.addr, align 4 502 store i32 %cancel2, i32* %cancel2.addr, align 4 503 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..18 to void (i32*, i32*, ...)*), i32* nonnull %cancel1.addr) 504 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..19 to void (i32*, i32*, ...)*), i32* nonnull %cancel2.addr) 505 ret void 506} 507 508define internal void @.omp_outlined..18(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %cancel1) { 509entry: 510 %0 = load i32, i32* %cancel1, align 4 511 %tobool.not = icmp eq i32 %0, 0 512 br i1 %tobool.not, label %if.end, label %if.then 513 514if.then: ; preds = %entry 515 %1 = load i32, i32* %.global_tid., align 4 516 %2 = call i32 @__kmpc_cancel(%struct.ident_t* nonnull @1, i32 %1, i32 1) 517 ret void 518 519if.end: ; preds = %entry 520 ret void 521} 522 523declare i32 @__kmpc_cancel(%struct.ident_t*, i32, i32) local_unnamed_addr 524 525define internal void @.omp_outlined..19(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %cancel2) { 526entry: 527 %0 = load i32, i32* %cancel2, align 4 528 %tobool.not = icmp eq i32 %0, 0 529 br i1 %tobool.not, label %if.end, label %if.then 530 531if.then: ; preds = %entry 532 %1 = load i32, i32* %.global_tid., align 4 533 %2 = call i32 @__kmpc_cancel(%struct.ident_t* nonnull @1, i32 %1, i32 1) 534 ret void 535 536if.end: ; preds = %entry 537 ret void 538} 539 540define dso_local void @merge_cancellable_regions_seq(i32 %cancel1, i32 %cancel2) local_unnamed_addr { 541entry: 542 %cancel1.addr = alloca i32, align 4 543 %cancel2.addr = alloca i32, align 4 544 store i32 %cancel1, i32* %cancel1.addr, align 4 545 store i32 %cancel2, i32* %cancel2.addr, align 4 546 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..20 to void (i32*, i32*, ...)*), i32* nonnull %cancel1.addr) 547 %0 = load i32, i32* %cancel1.addr, align 4 548 %tobool.not = icmp eq i32 %0, 0 549 %lnot.ext = zext i1 %tobool.not to i32 550 store i32 %lnot.ext, i32* %cancel2.addr, align 4 551 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..21 to void (i32*, i32*, ...)*), i32* nonnull %cancel2.addr) 552 ret void 553} 554 555define internal void @.omp_outlined..20(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %cancel1) { 556entry: 557 %0 = load i32, i32* %cancel1, align 4 558 %tobool.not = icmp eq i32 %0, 0 559 br i1 %tobool.not, label %if.end, label %if.then 560 561if.then: ; preds = %entry 562 %1 = load i32, i32* %.global_tid., align 4 563 %2 = call i32 @__kmpc_cancel(%struct.ident_t* nonnull @1, i32 %1, i32 1) 564 ret void 565 566if.end: ; preds = %entry 567 ret void 568} 569 570define internal void @.omp_outlined..21(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %cancel2) { 571entry: 572 %0 = load i32, i32* %cancel2, align 4 573 %tobool.not = icmp eq i32 %0, 0 574 br i1 %tobool.not, label %if.end, label %if.then 575 576if.then: ; preds = %entry 577 %1 = load i32, i32* %.global_tid., align 4 578 %2 = call i32 @__kmpc_cancel(%struct.ident_t* nonnull @1, i32 %1, i32 1) 579 ret void 580 581if.end: ; preds = %entry 582 ret void 583} 584 585define dso_local void @merge_3(i32 %a) local_unnamed_addr { 586entry: 587 %a.addr = alloca i32, align 4 588 store i32 %a, i32* %a.addr, align 4 589 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..22 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 590 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..23 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 591 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..24 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 592 ret void 593} 594 595define internal void @.omp_outlined..22(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 596entry: 597 %0 = load i32, i32* %a, align 4 598 call void @use(i32 %0) 599 ret void 600} 601 602define internal void @.omp_outlined..23(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 603entry: 604 %0 = load i32, i32* %a, align 4 605 call void @use(i32 %0) 606 ret void 607} 608 609define internal void @.omp_outlined..24(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 610entry: 611 %0 = load i32, i32* %a, align 4 612 call void @use(i32 %0) 613 ret void 614} 615 616define dso_local void @merge_3_seq(i32 %a, i32 %b) local_unnamed_addr { 617entry: 618 %a.addr = alloca i32, align 4 619 store i32 %a, i32* %a.addr, align 4 620 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..25 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 621 %0 = load i32, i32* %a.addr, align 4 622 %add = add nsw i32 %0, 1 623 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..26 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 624 %1 = load i32, i32* %a.addr, align 4 625 %add1 = add nsw i32 %add, %1 626 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..27 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 627 call void @use(i32 %add1) 628 ret void 629} 630 631define internal void @.omp_outlined..25(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 632entry: 633 %0 = load i32, i32* %a, align 4 634 call void @use(i32 %0) 635 ret void 636} 637 638define internal void @.omp_outlined..26(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 639entry: 640 %0 = load i32, i32* %a, align 4 641 call void @use(i32 %0) 642 ret void 643} 644 645define internal void @.omp_outlined..27(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 646entry: 647 %0 = load i32, i32* %a, align 4 648 call void @use(i32 %0) 649 ret void 650} 651 652define dso_local void @unmergable_3_seq_call(i32 %a) local_unnamed_addr { 653entry: 654 %a.addr = alloca i32, align 4 655 store i32 %a, i32* %a.addr, align 4 656 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..28 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 657 call void (...) @foo() 658 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..29 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 659 call void (...) @foo() 660 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 661 ret void 662} 663 664define internal void @.omp_outlined..28(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 665entry: 666 %0 = load i32, i32* %a, align 4 667 call void @use(i32 %0) 668 ret void 669} 670 671define internal void @.omp_outlined..29(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 672entry: 673 %0 = load i32, i32* %a, align 4 674 call void @use(i32 %0) 675 ret void 676} 677 678define internal void @.omp_outlined..30(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 679entry: 680 %0 = load i32, i32* %a, align 4 681 call void @use(i32 %0) 682 ret void 683} 684 685define dso_local void @unmergable_3_proc_bind(i32 %a) local_unnamed_addr { 686entry: 687 %a.addr = alloca i32, align 4 688 %0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @1) 689 store i32 %a, i32* %a.addr, align 4 690 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 691 call void @__kmpc_push_proc_bind(%struct.ident_t* nonnull @1, i32 %0, i32 3) 692 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..32 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 693 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..33 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 694 ret void 695} 696 697define internal void @.omp_outlined..31(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 698entry: 699 %0 = load i32, i32* %a, align 4 700 call void @use(i32 %0) 701 ret void 702} 703 704define internal void @.omp_outlined..32(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 705entry: 706 %0 = load i32, i32* %a, align 4 707 call void @use(i32 %0) 708 ret void 709} 710 711define internal void @.omp_outlined..33(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 712entry: 713 %0 = load i32, i32* %a, align 4 714 call void @use(i32 %0) 715 ret void 716} 717 718define dso_local void @unmergable_3_num_threads(i32 %a) local_unnamed_addr { 719entry: 720 %a.addr = alloca i32, align 4 721 %0 = call i32 @__kmpc_global_thread_num(%struct.ident_t* nonnull @1) 722 store i32 %a, i32* %a.addr, align 4 723 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 724 %1 = load i32, i32* %a.addr, align 4 725 call void @__kmpc_push_num_threads(%struct.ident_t* nonnull @1, i32 %0, i32 %1) 726 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 727 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..36 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 728 ret void 729} 730 731define internal void @.omp_outlined..34(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 732entry: 733 %0 = load i32, i32* %a, align 4 734 call void @use(i32 %0) 735 ret void 736} 737 738define internal void @.omp_outlined..35(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 739entry: 740 %0 = load i32, i32* %a, align 4 741 call void @use(i32 %0) 742 ret void 743} 744 745define internal void @.omp_outlined..36(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 746entry: 747 %0 = load i32, i32* %a, align 4 748 call void @use(i32 %0) 749 ret void 750} 751 752define dso_local void @merge_2_unmergable_1(i32 %a) local_unnamed_addr { 753entry: 754 %a.addr = alloca i32, align 4 755 store i32 %a, i32* %a.addr, align 4 756 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..37 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 757 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..38 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 758 call void (...) @foo() 759 call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i32* nonnull %a.addr) 760 ret void 761} 762 763define internal void @.omp_outlined..37(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 764entry: 765 %0 = load i32, i32* %a, align 4 766 call void @use(i32 %0) 767 ret void 768} 769 770define internal void @.omp_outlined..38(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 771entry: 772 %0 = load i32, i32* %a, align 4 773 call void @use(i32 %0) 774 ret void 775} 776 777define internal void @.omp_outlined..39(i32* noalias nocapture readnone %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %a) { 778entry: 779 %0 = load i32, i32* %a, align 4 780 call void @use(i32 %0) 781 ret void 782} 783 784 785!llvm.module.flags = !{!0} 786 787!0 = !{i32 1, !"wchar_size", i32 4} 788!1 = !{!2} 789!2 = !{i64 2, i64 -1, i64 -1, i1 true} 790; CHECK-LABEL: define {{[^@]+}}@merge 791; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 792; CHECK-NEXT: entry: 793; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 794; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 795; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1:@.*]]) 796; CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] 797; CHECK: omp_parallel: 798; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]]) 799; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]] 800; CHECK: omp.par.outlined.exit: 801; CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]] 802; CHECK: omp.par.exit.split: 803; CHECK-NEXT: br label [[ENTRY_SPLIT_SPLIT:%.*]] 804; CHECK: entry.split.split: 805; CHECK-NEXT: ret void 806; 807; 808; CHECK-LABEL: define {{[^@]+}}@merge..omp_par 809; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) [[ATTR0:#.*]] { 810; CHECK-NEXT: omp.par.entry: 811; CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 812; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4 813; CHECK-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4 814; CHECK-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4 815; CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] 816; CHECK: omp.par.outlined.exit.exitStub: 817; CHECK-NEXT: ret void 818; CHECK: omp.par.region: 819; CHECK-NEXT: br label [[OMP_PAR_MERGED:%.*]] 820; CHECK: omp.par.merged: 821; CHECK-NEXT: call void @.omp_outlined.(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 822; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 823; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2:@.*]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 824; CHECK-NEXT: call void @.omp_outlined..1(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 825; CHECK-NEXT: br label [[ENTRY_SPLIT:%.*]] 826; CHECK: entry.split: 827; CHECK-NEXT: br label [[OMP_PAR_REGION_SPLIT:%.*]] 828; CHECK: omp.par.region.split: 829; CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] 830; CHECK: omp.par.pre_finalize: 831; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]] 832; 833; 834; CHECK-LABEL: define {{[^@]+}}@.omp_outlined. 835; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 836; CHECK-NEXT: entry: 837; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 838; CHECK-NEXT: call void @use(i32 [[TMP0]]) 839; CHECK-NEXT: ret void 840; 841; 842; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1 843; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 844; CHECK-NEXT: entry: 845; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 846; CHECK-NEXT: call void @use(i32 [[TMP0]]) 847; CHECK-NEXT: ret void 848; 849; 850; CHECK-LABEL: define {{[^@]+}}@unmergable_proc_bind 851; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 852; CHECK-NEXT: entry: 853; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 854; CHECK-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]]) 855; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 856; CHECK-NEXT: call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 [[TMP0]], i32 noundef 3) 857; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 858; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 859; CHECK-NEXT: ret void 860; 861; 862; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2 863; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 864; CHECK-NEXT: entry: 865; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 866; CHECK-NEXT: call void @use(i32 [[TMP0]]) 867; CHECK-NEXT: ret void 868; 869; 870; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..3 871; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 872; CHECK-NEXT: entry: 873; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 874; CHECK-NEXT: call void @use(i32 [[TMP0]]) 875; CHECK-NEXT: ret void 876; 877; 878; CHECK-LABEL: define {{[^@]+}}@unmergable_num_threads 879; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 880; CHECK-NEXT: entry: 881; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 882; CHECK-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]]) 883; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 884; CHECK-NEXT: call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 [[TMP0]], i32 [[A]]) 885; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 886; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 887; CHECK-NEXT: ret void 888; 889; 890; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..4 891; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 892; CHECK-NEXT: entry: 893; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 894; CHECK-NEXT: call void @use(i32 [[TMP0]]) 895; CHECK-NEXT: ret void 896; 897; 898; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..5 899; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 900; CHECK-NEXT: entry: 901; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 902; CHECK-NEXT: call void @use(i32 [[TMP0]]) 903; CHECK-NEXT: ret void 904; 905; 906; CHECK-LABEL: define {{[^@]+}}@unmergable_seq_call 907; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 908; CHECK-NEXT: entry: 909; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 910; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 911; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 912; CHECK-NEXT: call void (...) @foo() 913; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..7 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 914; CHECK-NEXT: ret void 915; 916; 917; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..6 918; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 919; CHECK-NEXT: entry: 920; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 921; CHECK-NEXT: call void @use(i32 [[TMP0]]) 922; CHECK-NEXT: ret void 923; 924; 925; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..7 926; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 927; CHECK-NEXT: entry: 928; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 929; CHECK-NEXT: call void @use(i32 [[TMP0]]) 930; CHECK-NEXT: ret void 931; 932; 933; CHECK-LABEL: define {{[^@]+}}@merge_seq 934; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 935; CHECK-NEXT: entry: 936; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 937; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 938; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 939; CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] 940; CHECK: omp_parallel: 941; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_seq..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]]) 942; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]] 943; CHECK: omp.par.outlined.exit: 944; CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]] 945; CHECK: omp.par.exit.split: 946; CHECK-NEXT: br label [[ENTRY_SPLIT_SPLIT:%.*]] 947; CHECK: entry.split.split: 948; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4 949; CHECK-NEXT: call void @use(i32 [[TMP0]]) 950; CHECK-NEXT: ret void 951; 952; 953; CHECK-LABEL: define {{[^@]+}}@merge_seq..omp_par 954; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) [[ATTR0]] { 955; CHECK-NEXT: omp.par.entry: 956; CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 957; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4 958; CHECK-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4 959; CHECK-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4 960; CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] 961; CHECK: omp.par.outlined.exit.exitStub: 962; CHECK-NEXT: ret void 963; CHECK: omp.par.region: 964; CHECK-NEXT: br label [[OMP_PAR_MERGED:%.*]] 965; CHECK: omp.par.merged: 966; CHECK-NEXT: call void @.omp_outlined..8(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 967; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 968; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]]) 969; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 970; CHECK-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 971; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0 972; CHECK-NEXT: br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]] 973; CHECK: omp_region.end: 974; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 975; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]]) 976; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]] 977; CHECK: omp.par.merged.split.split: 978; CHECK-NEXT: call void @.omp_outlined..9(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 979; CHECK-NEXT: br label [[ENTRY_SPLIT:%.*]] 980; CHECK: entry.split: 981; CHECK-NEXT: br label [[OMP_PAR_REGION_SPLIT:%.*]] 982; CHECK: omp.par.region.split: 983; CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] 984; CHECK: omp.par.pre_finalize: 985; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]] 986; CHECK: omp_region.body: 987; CHECK-NEXT: br label [[SEQ_PAR_MERGED:%.*]] 988; CHECK: seq.par.merged: 989; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4 990; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 1 991; CHECK-NEXT: store i32 [[ADD]], i32* [[A_ADDR]], align 4 992; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT:%.*]] 993; CHECK: omp.par.merged.split: 994; CHECK-NEXT: br label [[OMP_REGION_BODY_SPLIT:%.*]] 995; CHECK: omp_region.body.split: 996; CHECK-NEXT: call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 997; CHECK-NEXT: br label [[OMP_REGION_END]] 998; 999; 1000; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..8 1001; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1002; CHECK-NEXT: entry: 1003; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1004; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1005; CHECK-NEXT: ret void 1006; 1007; 1008; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..9 1009; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1010; CHECK-NEXT: entry: 1011; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1012; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1013; CHECK-NEXT: ret void 1014; 1015; 1016; CHECK-LABEL: define {{[^@]+}}@merge_seq_float 1017; CHECK-SAME: (float [[F:%.*]], float* nocapture writeonly [[P:%.*]]) local_unnamed_addr { 1018; CHECK-NEXT: entry: 1019; CHECK-NEXT: [[F_ADDR:%.*]] = alloca float, align 4 1020; CHECK-NEXT: store float [[F]], float* [[F_ADDR]], align 4 1021; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1022; CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] 1023; CHECK: omp_parallel: 1024; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*, float*)* @merge_seq_float..omp_par to void (i32*, i32*, ...)*), float* [[F_ADDR]], float* [[P]]) 1025; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]] 1026; CHECK: omp.par.outlined.exit: 1027; CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]] 1028; CHECK: omp.par.exit.split: 1029; CHECK-NEXT: br label [[ENTRY_SPLIT_SPLIT:%.*]] 1030; CHECK: entry.split.split: 1031; CHECK-NEXT: ret void 1032; 1033; 1034; CHECK-LABEL: define {{[^@]+}}@merge_seq_float..omp_par 1035; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], float* [[F_ADDR:%.*]], float* [[P:%.*]]) [[ATTR0]] { 1036; CHECK-NEXT: omp.par.entry: 1037; CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 1038; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4 1039; CHECK-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4 1040; CHECK-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4 1041; CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] 1042; CHECK: omp.par.outlined.exit.exitStub: 1043; CHECK-NEXT: ret void 1044; CHECK: omp.par.region: 1045; CHECK-NEXT: br label [[OMP_PAR_MERGED:%.*]] 1046; CHECK: omp.par.merged: 1047; CHECK-NEXT: call void @.omp_outlined..10(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]]) 1048; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1049; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]]) 1050; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1051; CHECK-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1052; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0 1053; CHECK-NEXT: br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]] 1054; CHECK: omp_region.end: 1055; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1056; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]]) 1057; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]] 1058; CHECK: omp.par.merged.split.split: 1059; CHECK-NEXT: call void @.omp_outlined..11(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], float* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[F_ADDR]]) 1060; CHECK-NEXT: br label [[ENTRY_SPLIT:%.*]] 1061; CHECK: entry.split: 1062; CHECK-NEXT: br label [[OMP_PAR_REGION_SPLIT:%.*]] 1063; CHECK: omp.par.region.split: 1064; CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] 1065; CHECK: omp.par.pre_finalize: 1066; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]] 1067; CHECK: omp_region.body: 1068; CHECK-NEXT: br label [[SEQ_PAR_MERGED:%.*]] 1069; CHECK: seq.par.merged: 1070; CHECK-NEXT: [[TMP3:%.*]] = load float, float* [[F_ADDR]], align 4 1071; CHECK-NEXT: [[ADD:%.*]] = fadd float [[TMP3]], 0x40091EB860000000 1072; CHECK-NEXT: store float [[ADD]], float* [[P]], align 4 1073; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT:%.*]] 1074; CHECK: omp.par.merged.split: 1075; CHECK-NEXT: br label [[OMP_REGION_BODY_SPLIT:%.*]] 1076; CHECK: omp_region.body.split: 1077; CHECK-NEXT: call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1078; CHECK-NEXT: br label [[OMP_REGION_END]] 1079; 1080; 1081; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..10 1082; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) { 1083; CHECK-NEXT: entry: 1084; CHECK-NEXT: [[TMP0:%.*]] = load float, float* [[F]], align 4 1085; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[TMP0]] to i32 1086; CHECK-NEXT: call void @use(i32 [[CONV]]) 1087; CHECK-NEXT: ret void 1088; 1089; 1090; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..11 1091; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], float* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[F:%.*]]) { 1092; CHECK-NEXT: entry: 1093; CHECK-NEXT: [[TMP0:%.*]] = load float, float* [[F]], align 4 1094; CHECK-NEXT: [[CONV:%.*]] = fptosi float [[TMP0]] to i32 1095; CHECK-NEXT: call void @use(i32 [[CONV]]) 1096; CHECK-NEXT: ret void 1097; 1098; 1099; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate 1100; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 1101; CHECK-NEXT: entry: 1102; CHECK-NEXT: [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]] = alloca i64, align 8 1103; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 1104; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 1105; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1106; CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] 1107; CHECK: omp_parallel: 1108; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64*)* @merge_seq_firstprivate..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]]) 1109; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]] 1110; CHECK: omp.par.outlined.exit: 1111; CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]] 1112; CHECK: omp.par.exit.split: 1113; CHECK-NEXT: br label [[ENTRY_SPLIT_SPLIT:%.*]] 1114; CHECK: entry.split.split: 1115; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A_ADDR]], align 4 1116; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1117; CHECK-NEXT: ret void 1118; 1119; 1120; CHECK-LABEL: define {{[^@]+}}@merge_seq_firstprivate..omp_par 1121; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC:%.*]]) [[ATTR0]] { 1122; CHECK-NEXT: omp.par.entry: 1123; CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 1124; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4 1125; CHECK-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4 1126; CHECK-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4 1127; CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] 1128; CHECK: omp.par.outlined.exit.exitStub: 1129; CHECK-NEXT: ret void 1130; CHECK: omp.par.region: 1131; CHECK-NEXT: br label [[OMP_PAR_MERGED:%.*]] 1132; CHECK: omp.par.merged: 1133; CHECK-NEXT: call void @.omp_outlined..12(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1134; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1135; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]]) 1136; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1137; CHECK-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1138; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0 1139; CHECK-NEXT: br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]] 1140; CHECK: omp_region.end: 1141; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1142; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]]) 1143; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]] 1144; CHECK: omp.par.merged.split.split: 1145; CHECK-NEXT: [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD:%.*]] = load i64, i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8 1146; CHECK-NEXT: call void @.omp_outlined..13(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i64 [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_LOAD]]) 1147; CHECK-NEXT: br label [[ENTRY_SPLIT:%.*]] 1148; CHECK: entry.split: 1149; CHECK-NEXT: br label [[OMP_PAR_REGION_SPLIT:%.*]] 1150; CHECK: omp.par.region.split: 1151; CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] 1152; CHECK: omp.par.pre_finalize: 1153; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]] 1154; CHECK: omp_region.body: 1155; CHECK-NEXT: br label [[SEQ_PAR_MERGED:%.*]] 1156; CHECK: seq.par.merged: 1157; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[A_ADDR]], align 4 1158; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], 1 1159; CHECK-NEXT: store i32 [[ADD]], i32* [[A_ADDR]], align 4 1160; CHECK-NEXT: [[A_CASTED_SROA_0_0_INSERT_EXT:%.*]] = zext i32 [[ADD]] to i64 1161; CHECK-NEXT: store i64 [[A_CASTED_SROA_0_0_INSERT_EXT]], i64* [[A_CASTED_SROA_0_0_INSERT_EXT_SEQ_OUTPUT_ALLOC]], align 8 1162; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT:%.*]] 1163; CHECK: omp.par.merged.split: 1164; CHECK-NEXT: br label [[OMP_REGION_BODY_SPLIT:%.*]] 1165; CHECK: omp_region.body.split: 1166; CHECK-NEXT: call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1167; CHECK-NEXT: br label [[OMP_REGION_END]] 1168; 1169; 1170; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..12 1171; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1172; CHECK-NEXT: entry: 1173; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1174; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1175; CHECK-NEXT: ret void 1176; 1177; 1178; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..13 1179; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i64 [[A:%.*]]) { 1180; CHECK-NEXT: entry: 1181; CHECK-NEXT: [[A_ADDR_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[A]] to i32 1182; CHECK-NEXT: call void @use(i32 [[A_ADDR_SROA_0_0_EXTRACT_TRUNC]]) 1183; CHECK-NEXT: ret void 1184; 1185; 1186; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt 1187; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 1188; CHECK-NEXT: entry: 1189; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 1190; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 1191; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1192; CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] 1193; CHECK: omp_parallel: 1194; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_seq_sink_lt..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]]) 1195; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]] 1196; CHECK: omp.par.outlined.exit: 1197; CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]] 1198; CHECK: omp.par.exit.split: 1199; CHECK-NEXT: br label [[ENTRY_SPLIT_SPLIT:%.*]] 1200; CHECK: entry.split.split: 1201; CHECK-NEXT: ret void 1202; 1203; 1204; CHECK-LABEL: define {{[^@]+}}@merge_seq_sink_lt..omp_par 1205; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) [[ATTR0]] { 1206; CHECK-NEXT: omp.par.entry: 1207; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 1208; CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 1209; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4 1210; CHECK-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4 1211; CHECK-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4 1212; CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] 1213; CHECK: omp.par.outlined.exit.exitStub: 1214; CHECK-NEXT: ret void 1215; CHECK: omp.par.region: 1216; CHECK-NEXT: br label [[OMP_PAR_MERGED:%.*]] 1217; CHECK: omp.par.merged: 1218; CHECK-NEXT: call void @.omp_outlined..14(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1219; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1220; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]]) 1221; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1222; CHECK-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1223; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0 1224; CHECK-NEXT: br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]] 1225; CHECK: omp_region.end: 1226; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1227; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]]) 1228; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]] 1229; CHECK: omp.par.merged.split.split: 1230; CHECK-NEXT: call void @.omp_outlined..15(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1231; CHECK-NEXT: br label [[ENTRY_SPLIT:%.*]] 1232; CHECK: entry.split: 1233; CHECK-NEXT: br label [[OMP_PAR_REGION_SPLIT:%.*]] 1234; CHECK: omp.par.region.split: 1235; CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] 1236; CHECK: omp.par.pre_finalize: 1237; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]] 1238; CHECK: omp_region.body: 1239; CHECK-NEXT: br label [[SEQ_PAR_MERGED:%.*]] 1240; CHECK: seq.par.merged: 1241; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32* [[B]] to i8* 1242; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP3]]) 1243; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint i32* [[B]] to i64 1244; CHECK-NEXT: [[TMP5:%.*]] = trunc i64 [[TMP4]] to i32 1245; CHECK-NEXT: store i32 [[TMP5]], i32* [[B]], align 4 1246; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[TMP3]]) 1247; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT:%.*]] 1248; CHECK: omp.par.merged.split: 1249; CHECK-NEXT: br label [[OMP_REGION_BODY_SPLIT:%.*]] 1250; CHECK: omp_region.body.split: 1251; CHECK-NEXT: call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1252; CHECK-NEXT: br label [[OMP_REGION_END]] 1253; 1254; 1255; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..14 1256; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1257; CHECK-NEXT: entry: 1258; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1259; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1260; CHECK-NEXT: ret void 1261; 1262; 1263; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..15 1264; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1265; CHECK-NEXT: entry: 1266; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1267; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1268; CHECK-NEXT: ret void 1269; 1270; 1271; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use 1272; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 1273; CHECK-NEXT: entry: 1274; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 1275; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4 1276; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 1277; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1278; CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] 1279; CHECK: omp_parallel: 1280; CHECK-NEXT: [[LT_CAST3:%.*]] = bitcast i32* [[B]] to i8* 1281; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST3]]) 1282; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_seq_par_use..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i32* [[B]]) 1283; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]] 1284; CHECK: omp.par.outlined.exit: 1285; CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]] 1286; CHECK: omp.par.exit.split: 1287; CHECK-NEXT: br label [[ENTRY_SPLIT_SPLIT:%.*]] 1288; CHECK: entry.split.split: 1289; CHECK-NEXT: [[LT_CAST:%.*]] = bitcast i32* [[B]] to i8* 1290; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* noundef nonnull [[LT_CAST]]) 1291; CHECK-NEXT: ret void 1292; 1293; 1294; CHECK-LABEL: define {{[^@]+}}@merge_seq_par_use..omp_par 1295; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i32* [[B:%.*]]) [[ATTR0]] { 1296; CHECK-NEXT: omp.par.entry: 1297; CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 1298; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4 1299; CHECK-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4 1300; CHECK-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4 1301; CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] 1302; CHECK: omp.par.outlined.exit.exitStub: 1303; CHECK-NEXT: ret void 1304; CHECK: omp.par.region: 1305; CHECK-NEXT: br label [[OMP_PAR_MERGED:%.*]] 1306; CHECK: omp.par.merged: 1307; CHECK-NEXT: call void @.omp_outlined..16(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1308; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1309; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]]) 1310; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1311; CHECK-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1312; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0 1313; CHECK-NEXT: br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]] 1314; CHECK: omp_region.end: 1315; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1316; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]]) 1317; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]] 1318; CHECK: omp.par.merged.split.split: 1319; CHECK-NEXT: call void @.omp_outlined..17(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[B]]) 1320; CHECK-NEXT: br label [[ENTRY_SPLIT:%.*]] 1321; CHECK: entry.split: 1322; CHECK-NEXT: br label [[OMP_PAR_REGION_SPLIT:%.*]] 1323; CHECK: omp.par.region.split: 1324; CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] 1325; CHECK: omp.par.pre_finalize: 1326; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]] 1327; CHECK: omp_region.body: 1328; CHECK-NEXT: br label [[SEQ_PAR_MERGED:%.*]] 1329; CHECK: seq.par.merged: 1330; CHECK-NEXT: [[TMP3:%.*]] = bitcast i32* [[B]] to i8* 1331; CHECK-NEXT: [[TMP4:%.*]] = load i32, i32* [[A_ADDR]], align 4 1332; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP4]], 1 1333; CHECK-NEXT: store i32 [[ADD]], i32* [[B]], align 4 1334; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT:%.*]] 1335; CHECK: omp.par.merged.split: 1336; CHECK-NEXT: br label [[OMP_REGION_BODY_SPLIT:%.*]] 1337; CHECK: omp_region.body.split: 1338; CHECK-NEXT: call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1339; CHECK-NEXT: br label [[OMP_REGION_END]] 1340; 1341; 1342; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..16 1343; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1344; CHECK-NEXT: entry: 1345; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1346; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1347; CHECK-NEXT: ret void 1348; 1349; 1350; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..17 1351; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) { 1352; CHECK-NEXT: entry: 1353; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1354; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1355; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[B]], align 4 1356; CHECK-NEXT: call void @use(i32 [[TMP1]]) 1357; CHECK-NEXT: ret void 1358; 1359; 1360; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions 1361; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr { 1362; CHECK-NEXT: entry: 1363; CHECK-NEXT: [[CANCEL1_ADDR:%.*]] = alloca i32, align 4 1364; CHECK-NEXT: [[CANCEL2_ADDR:%.*]] = alloca i32, align 4 1365; CHECK-NEXT: store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4 1366; CHECK-NEXT: store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4 1367; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1368; CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] 1369; CHECK: omp_parallel: 1370; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_cancellable_regions..omp_par to void (i32*, i32*, ...)*), i32* [[CANCEL1_ADDR]], i32* [[CANCEL2_ADDR]]) 1371; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]] 1372; CHECK: omp.par.outlined.exit: 1373; CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]] 1374; CHECK: omp.par.exit.split: 1375; CHECK-NEXT: br label [[ENTRY_SPLIT_SPLIT:%.*]] 1376; CHECK: entry.split.split: 1377; CHECK-NEXT: ret void 1378; 1379; 1380; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions..omp_par 1381; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[CANCEL1_ADDR:%.*]], i32* [[CANCEL2_ADDR:%.*]]) [[ATTR0]] { 1382; CHECK-NEXT: omp.par.entry: 1383; CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 1384; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4 1385; CHECK-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4 1386; CHECK-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4 1387; CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] 1388; CHECK: omp.par.outlined.exit.exitStub: 1389; CHECK-NEXT: ret void 1390; CHECK: omp.par.region: 1391; CHECK-NEXT: br label [[OMP_PAR_MERGED:%.*]] 1392; CHECK: omp.par.merged: 1393; CHECK-NEXT: call void @.omp_outlined..18(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]]) 1394; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1395; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1396; CHECK-NEXT: call void @.omp_outlined..19(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]]) 1397; CHECK-NEXT: br label [[ENTRY_SPLIT:%.*]] 1398; CHECK: entry.split: 1399; CHECK-NEXT: br label [[OMP_PAR_REGION_SPLIT:%.*]] 1400; CHECK: omp.par.region.split: 1401; CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] 1402; CHECK: omp.par.pre_finalize: 1403; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]] 1404; 1405; 1406; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..18 1407; CHECK-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) { 1408; CHECK-NEXT: entry: 1409; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4 1410; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0 1411; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 1412; CHECK: if.then: 1413; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4 1414; CHECK-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull [[GLOB1]], i32 [[TMP1]], i32 noundef 1) 1415; CHECK-NEXT: ret void 1416; CHECK: if.end: 1417; CHECK-NEXT: ret void 1418; 1419; 1420; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..19 1421; CHECK-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) { 1422; CHECK-NEXT: entry: 1423; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4 1424; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0 1425; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 1426; CHECK: if.then: 1427; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4 1428; CHECK-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull [[GLOB1]], i32 [[TMP1]], i32 noundef 1) 1429; CHECK-NEXT: ret void 1430; CHECK: if.end: 1431; CHECK-NEXT: ret void 1432; 1433; 1434; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq 1435; CHECK-SAME: (i32 [[CANCEL1:%.*]], i32 [[CANCEL2:%.*]]) local_unnamed_addr { 1436; CHECK-NEXT: entry: 1437; CHECK-NEXT: [[CANCEL1_ADDR:%.*]] = alloca i32, align 4 1438; CHECK-NEXT: [[CANCEL2_ADDR:%.*]] = alloca i32, align 4 1439; CHECK-NEXT: store i32 [[CANCEL1]], i32* [[CANCEL1_ADDR]], align 4 1440; CHECK-NEXT: store i32 [[CANCEL2]], i32* [[CANCEL2_ADDR]], align 4 1441; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1442; CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] 1443; CHECK: omp_parallel: 1444; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @merge_cancellable_regions_seq..omp_par to void (i32*, i32*, ...)*), i32* [[CANCEL1_ADDR]], i32* [[CANCEL2_ADDR]]) 1445; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]] 1446; CHECK: omp.par.outlined.exit: 1447; CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]] 1448; CHECK: omp.par.exit.split: 1449; CHECK-NEXT: br label [[ENTRY_SPLIT_SPLIT:%.*]] 1450; CHECK: entry.split.split: 1451; CHECK-NEXT: ret void 1452; 1453; 1454; CHECK-LABEL: define {{[^@]+}}@merge_cancellable_regions_seq..omp_par 1455; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[CANCEL1_ADDR:%.*]], i32* [[CANCEL2_ADDR:%.*]]) [[ATTR0]] { 1456; CHECK-NEXT: omp.par.entry: 1457; CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 1458; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4 1459; CHECK-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4 1460; CHECK-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4 1461; CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] 1462; CHECK: omp.par.outlined.exit.exitStub: 1463; CHECK-NEXT: ret void 1464; CHECK: omp.par.region: 1465; CHECK-NEXT: br label [[OMP_PAR_MERGED:%.*]] 1466; CHECK: omp.par.merged: 1467; CHECK-NEXT: call void @.omp_outlined..20(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1_ADDR]]) 1468; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1469; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]]) 1470; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1471; CHECK-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1472; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0 1473; CHECK-NEXT: br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]] 1474; CHECK: omp_region.end: 1475; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1476; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]]) 1477; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]] 1478; CHECK: omp.par.merged.split.split: 1479; CHECK-NEXT: call void @.omp_outlined..21(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2_ADDR]]) 1480; CHECK-NEXT: br label [[ENTRY_SPLIT:%.*]] 1481; CHECK: entry.split: 1482; CHECK-NEXT: br label [[OMP_PAR_REGION_SPLIT:%.*]] 1483; CHECK: omp.par.region.split: 1484; CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] 1485; CHECK: omp.par.pre_finalize: 1486; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]] 1487; CHECK: omp_region.body: 1488; CHECK-NEXT: br label [[SEQ_PAR_MERGED:%.*]] 1489; CHECK: seq.par.merged: 1490; CHECK-NEXT: [[TMP3:%.*]] = load i32, i32* [[CANCEL1_ADDR]], align 4 1491; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP3]], 0 1492; CHECK-NEXT: [[LNOT_EXT:%.*]] = zext i1 [[TOBOOL_NOT]] to i32 1493; CHECK-NEXT: store i32 [[LNOT_EXT]], i32* [[CANCEL2_ADDR]], align 4 1494; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT:%.*]] 1495; CHECK: omp.par.merged.split: 1496; CHECK-NEXT: br label [[OMP_REGION_BODY_SPLIT:%.*]] 1497; CHECK: omp_region.body.split: 1498; CHECK-NEXT: call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1499; CHECK-NEXT: br label [[OMP_REGION_END]] 1500; 1501; 1502; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..20 1503; CHECK-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL1:%.*]]) { 1504; CHECK-NEXT: entry: 1505; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[CANCEL1]], align 4 1506; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0 1507; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 1508; CHECK: if.then: 1509; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4 1510; CHECK-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull [[GLOB1]], i32 [[TMP1]], i32 noundef 1) 1511; CHECK-NEXT: ret void 1512; CHECK: if.end: 1513; CHECK-NEXT: ret void 1514; 1515; 1516; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..21 1517; CHECK-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[CANCEL2:%.*]]) { 1518; CHECK-NEXT: entry: 1519; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[CANCEL2]], align 4 1520; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0 1521; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 1522; CHECK: if.then: 1523; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4 1524; CHECK-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* noundef nonnull [[GLOB1]], i32 [[TMP1]], i32 noundef 1) 1525; CHECK-NEXT: ret void 1526; CHECK: if.end: 1527; CHECK-NEXT: ret void 1528; 1529; 1530; CHECK-LABEL: define {{[^@]+}}@merge_3 1531; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 1532; CHECK-NEXT: entry: 1533; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 1534; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 1535; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1536; CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] 1537; CHECK: omp_parallel: 1538; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_3..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]]) 1539; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]] 1540; CHECK: omp.par.outlined.exit: 1541; CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]] 1542; CHECK: omp.par.exit.split: 1543; CHECK-NEXT: br label [[ENTRY_SPLIT_SPLIT:%.*]] 1544; CHECK: entry.split.split: 1545; CHECK-NEXT: ret void 1546; 1547; 1548; CHECK-LABEL: define {{[^@]+}}@merge_3..omp_par 1549; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) [[ATTR0]] { 1550; CHECK-NEXT: omp.par.entry: 1551; CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 1552; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4 1553; CHECK-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4 1554; CHECK-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4 1555; CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] 1556; CHECK: omp.par.outlined.exit.exitStub: 1557; CHECK-NEXT: ret void 1558; CHECK: omp.par.region: 1559; CHECK-NEXT: br label [[OMP_PAR_MERGED:%.*]] 1560; CHECK: omp.par.merged: 1561; CHECK-NEXT: call void @.omp_outlined..22(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1562; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1563; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1564; CHECK-NEXT: call void @.omp_outlined..23(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1565; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1566; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]]) 1567; CHECK-NEXT: call void @.omp_outlined..24(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1568; CHECK-NEXT: br label [[ENTRY_SPLIT:%.*]] 1569; CHECK: entry.split: 1570; CHECK-NEXT: br label [[OMP_PAR_REGION_SPLIT:%.*]] 1571; CHECK: omp.par.region.split: 1572; CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] 1573; CHECK: omp.par.pre_finalize: 1574; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]] 1575; 1576; 1577; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..22 1578; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1579; CHECK-NEXT: entry: 1580; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1581; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1582; CHECK-NEXT: ret void 1583; 1584; 1585; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..23 1586; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1587; CHECK-NEXT: entry: 1588; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1589; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1590; CHECK-NEXT: ret void 1591; 1592; 1593; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..24 1594; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1595; CHECK-NEXT: entry: 1596; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1597; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1598; CHECK-NEXT: ret void 1599; 1600; 1601; CHECK-LABEL: define {{[^@]+}}@merge_3_seq 1602; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) local_unnamed_addr { 1603; CHECK-NEXT: entry: 1604; CHECK-NEXT: [[ADD1_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4 1605; CHECK-NEXT: [[ADD_SEQ_OUTPUT_ALLOC:%.*]] = alloca i32, align 4 1606; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 1607; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 1608; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1609; CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] 1610; CHECK: omp_parallel: 1611; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*, i32*)* @merge_3_seq..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]], i32* [[ADD_SEQ_OUTPUT_ALLOC]], i32* [[ADD1_SEQ_OUTPUT_ALLOC]]) 1612; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]] 1613; CHECK: omp.par.outlined.exit: 1614; CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]] 1615; CHECK: omp.par.exit.split: 1616; CHECK-NEXT: br label [[ENTRY_SPLIT_SPLIT:%.*]] 1617; CHECK: entry.split.split: 1618; CHECK-NEXT: [[ADD1_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4 1619; CHECK-NEXT: call void @use(i32 [[ADD1_SEQ_OUTPUT_LOAD]]) 1620; CHECK-NEXT: ret void 1621; 1622; 1623; CHECK-LABEL: define {{[^@]+}}@merge_3_seq..omp_par 1624; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]], i32* [[ADD_SEQ_OUTPUT_ALLOC:%.*]], i32* [[ADD1_SEQ_OUTPUT_ALLOC:%.*]]) [[ATTR0]] { 1625; CHECK-NEXT: omp.par.entry: 1626; CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 1627; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4 1628; CHECK-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4 1629; CHECK-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4 1630; CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] 1631; CHECK: omp.par.outlined.exit.exitStub: 1632; CHECK-NEXT: ret void 1633; CHECK: omp.par.region: 1634; CHECK-NEXT: br label [[OMP_PAR_MERGED:%.*]] 1635; CHECK: omp.par.merged: 1636; CHECK-NEXT: call void @.omp_outlined..25(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1637; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1638; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM2]]) 1639; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1640; CHECK-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1641; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0 1642; CHECK-NEXT: br i1 [[TMP2]], label [[OMP_REGION_BODY:%.*]], label [[OMP_REGION_END:%.*]] 1643; CHECK: omp_region.end: 1644; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1645; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM1]]) 1646; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT_SPLIT:%.*]] 1647; CHECK: omp.par.merged.split.split: 1648; CHECK-NEXT: call void @.omp_outlined..26(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1649; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1650; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM4]]) 1651; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1652; CHECK-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]]) 1653; CHECK-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0 1654; CHECK-NEXT: br i1 [[TMP4]], label [[OMP_REGION_BODY5:%.*]], label [[OMP_REGION_END4:%.*]] 1655; CHECK: omp_region.end4: 1656; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM6:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1657; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM6]]) 1658; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT_SPLIT:%.*]] 1659; CHECK: omp.par.merged.split.split.split.split: 1660; CHECK-NEXT: call void @.omp_outlined..27(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1661; CHECK-NEXT: br label [[ENTRY_SPLIT:%.*]] 1662; CHECK: entry.split: 1663; CHECK-NEXT: br label [[OMP_PAR_REGION_SPLIT:%.*]] 1664; CHECK: omp.par.region.split: 1665; CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] 1666; CHECK: omp.par.pre_finalize: 1667; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]] 1668; CHECK: omp_region.body5: 1669; CHECK-NEXT: br label [[SEQ_PAR_MERGED2:%.*]] 1670; CHECK: seq.par.merged2: 1671; CHECK-NEXT: [[TMP5:%.*]] = load i32, i32* [[A_ADDR]], align 4 1672; CHECK-NEXT: [[ADD_SEQ_OUTPUT_LOAD:%.*]] = load i32, i32* [[ADD_SEQ_OUTPUT_ALLOC]], align 4 1673; CHECK-NEXT: [[ADD1:%.*]] = add nsw i32 [[ADD_SEQ_OUTPUT_LOAD]], [[TMP5]] 1674; CHECK-NEXT: store i32 [[ADD1]], i32* [[ADD1_SEQ_OUTPUT_ALLOC]], align 4 1675; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT_SPLIT_SPLIT:%.*]] 1676; CHECK: omp.par.merged.split.split.split: 1677; CHECK-NEXT: br label [[OMP_REGION_BODY5_SPLIT:%.*]] 1678; CHECK: omp_region.body5.split: 1679; CHECK-NEXT: call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]]) 1680; CHECK-NEXT: br label [[OMP_REGION_END4]] 1681; CHECK: omp_region.body: 1682; CHECK-NEXT: br label [[SEQ_PAR_MERGED:%.*]] 1683; CHECK: seq.par.merged: 1684; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[A_ADDR]], align 4 1685; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP6]], 1 1686; CHECK-NEXT: store i32 [[ADD]], i32* [[ADD_SEQ_OUTPUT_ALLOC]], align 4 1687; CHECK-NEXT: br label [[OMP_PAR_MERGED_SPLIT:%.*]] 1688; CHECK: omp.par.merged.split: 1689; CHECK-NEXT: br label [[OMP_REGION_BODY_SPLIT:%.*]] 1690; CHECK: omp_region.body.split: 1691; CHECK-NEXT: call void @__kmpc_end_master(%struct.ident_t* [[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1692; CHECK-NEXT: br label [[OMP_REGION_END]] 1693; 1694; 1695; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..25 1696; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1697; CHECK-NEXT: entry: 1698; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1699; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1700; CHECK-NEXT: ret void 1701; 1702; 1703; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..26 1704; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1705; CHECK-NEXT: entry: 1706; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1707; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1708; CHECK-NEXT: ret void 1709; 1710; 1711; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..27 1712; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1713; CHECK-NEXT: entry: 1714; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1715; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1716; CHECK-NEXT: ret void 1717; 1718; 1719; CHECK-LABEL: define {{[^@]+}}@unmergable_3_seq_call 1720; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 1721; CHECK-NEXT: entry: 1722; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 1723; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 1724; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..28 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1725; CHECK-NEXT: call void (...) @foo() 1726; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..29 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1727; CHECK-NEXT: call void (...) @foo() 1728; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..30 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1729; CHECK-NEXT: ret void 1730; 1731; 1732; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..28 1733; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1734; CHECK-NEXT: entry: 1735; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1736; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1737; CHECK-NEXT: ret void 1738; 1739; 1740; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..29 1741; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1742; CHECK-NEXT: entry: 1743; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1744; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1745; CHECK-NEXT: ret void 1746; 1747; 1748; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..30 1749; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1750; CHECK-NEXT: entry: 1751; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1752; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1753; CHECK-NEXT: ret void 1754; 1755; 1756; CHECK-LABEL: define {{[^@]+}}@unmergable_3_proc_bind 1757; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 1758; CHECK-NEXT: entry: 1759; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 1760; CHECK-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]]) 1761; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 1762; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..31 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1763; CHECK-NEXT: call void @__kmpc_push_proc_bind(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 [[TMP0]], i32 noundef 3) 1764; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..32 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1765; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..33 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1766; CHECK-NEXT: ret void 1767; 1768; 1769; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..31 1770; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1771; CHECK-NEXT: entry: 1772; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1773; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1774; CHECK-NEXT: ret void 1775; 1776; 1777; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..32 1778; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1779; CHECK-NEXT: entry: 1780; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1781; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1782; CHECK-NEXT: ret void 1783; 1784; 1785; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..33 1786; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1787; CHECK-NEXT: entry: 1788; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1789; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1790; CHECK-NEXT: ret void 1791; 1792; 1793; CHECK-LABEL: define {{[^@]+}}@unmergable_3_num_threads 1794; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 1795; CHECK-NEXT: entry: 1796; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 1797; CHECK-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]]) 1798; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 1799; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..34 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1800; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[A_ADDR]], align 4 1801; CHECK-NEXT: call void @__kmpc_push_num_threads(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 [[TMP0]], i32 [[TMP1]]) 1802; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..35 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1803; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..36 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1804; CHECK-NEXT: ret void 1805; 1806; 1807; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..34 1808; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1809; CHECK-NEXT: entry: 1810; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1811; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1812; CHECK-NEXT: ret void 1813; 1814; 1815; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..35 1816; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1817; CHECK-NEXT: entry: 1818; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1819; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1820; CHECK-NEXT: ret void 1821; 1822; 1823; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..36 1824; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1825; CHECK-NEXT: entry: 1826; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1827; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1828; CHECK-NEXT: ret void 1829; 1830; 1831; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1 1832; CHECK-SAME: (i32 [[A:%.*]]) local_unnamed_addr { 1833; CHECK-NEXT: entry: 1834; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 1835; CHECK-NEXT: store i32 [[A]], i32* [[A_ADDR]], align 4 1836; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1837; CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] 1838; CHECK: omp_parallel: 1839; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @merge_2_unmergable_1..omp_par to void (i32*, i32*, ...)*), i32* [[A_ADDR]]) 1840; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT:%.*]] 1841; CHECK: omp.par.outlined.exit: 1842; CHECK-NEXT: br label [[OMP_PAR_EXIT_SPLIT:%.*]] 1843; CHECK: omp.par.exit.split: 1844; CHECK-NEXT: br label [[ENTRY_SPLIT_SPLIT:%.*]] 1845; CHECK: entry.split.split: 1846; CHECK-NEXT: call void (...) @foo() 1847; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB1]], i32 noundef 1, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*)* @.omp_outlined..39 to void (i32*, i32*, ...)*), i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1848; CHECK-NEXT: ret void 1849; 1850; 1851; CHECK-LABEL: define {{[^@]+}}@merge_2_unmergable_1..omp_par 1852; CHECK-SAME: (i32* noalias [[TID_ADDR:%.*]], i32* noalias [[ZERO_ADDR:%.*]], i32* [[A_ADDR:%.*]]) [[ATTR0]] { 1853; CHECK-NEXT: omp.par.entry: 1854; CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 1855; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[TID_ADDR]], align 4 1856; CHECK-NEXT: store i32 [[TMP0]], i32* [[TID_ADDR_LOCAL]], align 4 1857; CHECK-NEXT: [[TID:%.*]] = load i32, i32* [[TID_ADDR_LOCAL]], align 4 1858; CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] 1859; CHECK: omp.par.outlined.exit.exitStub: 1860; CHECK-NEXT: ret void 1861; CHECK: omp.par.region: 1862; CHECK-NEXT: br label [[OMP_PAR_MERGED:%.*]] 1863; CHECK: omp.par.merged: 1864; CHECK-NEXT: call void @.omp_outlined..37(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1865; CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[GLOB1]]) 1866; CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* [[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]]) 1867; CHECK-NEXT: call void @.omp_outlined..38(i32* [[TID_ADDR]], i32* [[ZERO_ADDR]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A_ADDR]]) 1868; CHECK-NEXT: br label [[ENTRY_SPLIT:%.*]] 1869; CHECK: entry.split: 1870; CHECK-NEXT: br label [[OMP_PAR_REGION_SPLIT:%.*]] 1871; CHECK: omp.par.region.split: 1872; CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] 1873; CHECK: omp.par.pre_finalize: 1874; CHECK-NEXT: br label [[OMP_PAR_OUTLINED_EXIT_EXITSTUB:%.*]] 1875; 1876; 1877; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..37 1878; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1879; CHECK-NEXT: entry: 1880; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1881; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1882; CHECK-NEXT: ret void 1883; 1884; 1885; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..38 1886; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1887; CHECK-NEXT: entry: 1888; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1889; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1890; CHECK-NEXT: ret void 1891; 1892; 1893; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..39 1894; CHECK-SAME: (i32* noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) { 1895; CHECK-NEXT: entry: 1896; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 4 1897; CHECK-NEXT: call void @use(i32 [[TMP0]]) 1898; CHECK-NEXT: ret void 1899; 1900