1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature 2; RUN: opt -S -openmp-opt-cgscc < %s | FileCheck %s 3; RUN: opt -S -passes=openmp-opt-cgscc < %s | FileCheck %s 4 5%struct.ident_t = type { i32, i32, i32, i32, i8* } 6 7@.str = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1 8@0 = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 0) }, align 8 9 10; doesn't modify any ICVs. 11define i32 @icv_free_use(i32 %0) { 12; CHECK-LABEL: define {{[^@]+}}@icv_free_use 13; CHECK-SAME: (i32 [[TMP0:%.*]]) { 14; CHECK-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP0]], 1 15; CHECK-NEXT: ret i32 [[TMP2]] 16; 17 %2 = add nsw i32 %0, 1 18 ret i32 %2 19} 20 21define i32 @bad_use(i32 %0) { 22; CHECK-LABEL: define {{[^@]+}}@bad_use 23; CHECK-SAME: (i32 [[TMP0:%.*]]) { 24; CHECK-NEXT: tail call void @use(i32 [[TMP0]]) 25; CHECK-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP0]], 1 26; CHECK-NEXT: ret i32 [[TMP2]] 27; 28 tail call void @use(i32 %0) 29 %2 = add nsw i32 %0, 1 30 ret i32 %2 31} 32 33define i32 @ok_use_assume(i32 %0) { 34; CHECK-LABEL: define {{[^@]+}}@ok_use_assume 35; CHECK-SAME: (i32 [[TMP0:%.*]]) { 36; CHECK-NEXT: call void @use(i32 [[TMP0]]) #[[ATTR1:[0-9]+]] 37; CHECK-NEXT: call void @use(i32 [[TMP0]]) #[[ATTR2:[0-9]+]] 38; CHECK-NEXT: call void @no_openmp_use(i32 [[TMP0]]) 39; CHECK-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP0]], 1 40; CHECK-NEXT: ret i32 [[TMP2]] 41; 42 call void @use(i32 %0) "no_openmp" 43 call void @use(i32 %0) "no_openmp_routines" 44 call void @no_openmp_use(i32 %0) 45 %2 = add nsw i32 %0, 1 46 ret i32 %2 47} 48 49define void @indirect_call(void ()* %0) { 50; CHECK-LABEL: define {{[^@]+}}@indirect_call 51; CHECK-SAME: (void ()* [[TMP0:%.*]]) { 52; CHECK-NEXT: call void @omp_set_num_threads(i32 4) 53; CHECK-NEXT: tail call void [[TMP0]]() 54; CHECK-NEXT: [[TMP2:%.*]] = tail call i32 @omp_get_max_threads() 55; CHECK-NEXT: tail call void @use(i32 [[TMP2]]) 56; CHECK-NEXT: ret void 57; 58 call void @omp_set_num_threads(i32 4) 59 tail call void %0() 60 %2 = tail call i32 @omp_get_max_threads() 61 tail call void @use(i32 %2) 62 ret void 63} 64 65define dso_local i32 @foo(i32 %0, i32 %1) { 66; CHECK-LABEL: define {{[^@]+}}@foo 67; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) { 68; CHECK-NEXT: tail call void @omp_set_num_threads(i32 [[TMP0]]) 69; CHECK-NEXT: tail call void @omp_set_num_threads(i32 [[TMP1]]) 70; CHECK-NEXT: tail call void @use(i32 [[TMP1]]) 71; CHECK-NEXT: tail call void @use(i32 [[TMP1]]) 72; CHECK-NEXT: tail call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @[[GLOB0:[0-9]+]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*)) 73; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @omp_get_max_threads() 74; CHECK-NEXT: tail call void @use(i32 [[TMP3]]) 75; CHECK-NEXT: ret i32 0 76; 77 tail call void @omp_set_num_threads(i32 %0) 78 %3 = tail call i32 @omp_get_max_threads() 79; FIXME: this value should be tracked and the rest of the getters deduplicated and replaced with it. 80 tail call void @omp_set_num_threads(i32 %1) 81 %4 = tail call i32 @omp_get_max_threads() 82 %5 = tail call i32 @omp_get_max_threads() 83 %6 = tail call i32 @omp_get_max_threads() 84 tail call void @use(i32 %4) 85 tail call void @use(i32 %5) 86 tail call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @0, i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*)) 87 %7 = tail call i32 @omp_get_max_threads() 88 tail call void @use(i32 %7) 89 ret i32 0 90} 91 92declare dso_local void @omp_set_num_threads(i32) 93 94declare dso_local i32 @omp_get_max_threads() 95 96declare dso_local void @use(i32) 97declare dso_local void @no_openmp_use(i32) "no_openmp" 98 99define internal void @.omp_outlined.(i32* %0, i32* %1) { 100; CHECK-LABEL: define {{[^@]+}}@.omp_outlined. 101; CHECK-SAME: (i32* [[TMP0:%.*]], i32* [[TMP1:%.*]]) { 102; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @omp_get_max_threads() 103; CHECK-NEXT: [[TMP4:%.*]] = tail call i32 @omp_get_max_threads() 104; CHECK-NEXT: tail call void @use(i32 [[TMP4]]) 105; CHECK-NEXT: tail call void @omp_set_num_threads(i32 10) 106; CHECK-NEXT: tail call void @use(i32 10) 107; CHECK-NEXT: ret void 108; 109; FIXME: this value should be tracked and the rest of the getters deduplicated and replaced with it. 110 %3 = tail call i32 @omp_get_max_threads() 111 %4 = tail call i32 @omp_get_max_threads() 112 tail call void @use(i32 %4) 113 tail call void @omp_set_num_threads(i32 10) 114 %5 = tail call i32 @omp_get_max_threads() 115 tail call void @use(i32 %5) 116 ret void 117} 118 119declare !callback !0 void @__kmpc_fork_call(%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) 120 121define dso_local i32 @bar(i32 %0, i32 %1) { 122; CHECK-LABEL: define {{[^@]+}}@bar 123; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) { 124; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP0]], [[TMP1]] 125; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP0]], i32 [[TMP1]] 126; CHECK-NEXT: tail call void @omp_set_num_threads(i32 [[TMP4]]) 127; CHECK-NEXT: tail call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @[[GLOB0]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*)) 128; CHECK-NEXT: [[TMP5:%.*]] = tail call i32 @omp_get_max_threads() 129; CHECK-NEXT: tail call void @use(i32 [[TMP5]]) 130; CHECK-NEXT: ret i32 0 131; 132 %3 = icmp sgt i32 %0, %1 133 %4 = select i1 %3, i32 %0, i32 %1 134; FIXME: getters can be replaced with %4 135 tail call void @omp_set_num_threads(i32 %4) 136 %5 = tail call i32 @omp_get_max_threads() 137 tail call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @0, i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*)) 138 %6 = tail call i32 @omp_get_max_threads() 139 tail call void @use(i32 %6) 140 ret i32 0 141} 142 143define internal void @.omp_outlined..1(i32* %0, i32* %1) { 144; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1 145; CHECK-SAME: (i32* [[TMP0:%.*]], i32* [[TMP1:%.*]]) { 146; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @omp_get_max_threads() 147; CHECK-NEXT: tail call void @use(i32 [[TMP3]]) 148; CHECK-NEXT: tail call void @omp_set_num_threads(i32 10) 149; CHECK-NEXT: tail call void @use(i32 10) 150; CHECK-NEXT: [[TMP4:%.*]] = tail call i32 @omp_get_max_threads() 151; CHECK-NEXT: tail call void @use(i32 [[TMP4]]) 152; CHECK-NEXT: ret void 153; 154 %3 = tail call i32 @omp_get_max_threads() 155 tail call void @use(i32 %3) 156 tail call void @omp_set_num_threads(i32 10) 157 %4 = tail call i32 @omp_get_max_threads() 158 tail call void @use(i32 %4) 159 %5 = tail call i32 @omp_get_max_threads() 160 tail call void @use(i32 %5) 161 ret void 162} 163 164define dso_local i32 @bar1(i32 %0, i32 %1) { 165; CHECK-LABEL: define {{[^@]+}}@bar1 166; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) { 167; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP0]], [[TMP1]] 168; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP0]], i32 [[TMP1]] 169; CHECK-NEXT: tail call void @omp_set_num_threads(i32 [[TMP4]]) 170; CHECK-NEXT: tail call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @[[GLOB0]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*)) 171; CHECK-NEXT: [[TMP5:%.*]] = tail call i32 @omp_get_max_threads() 172; CHECK-NEXT: tail call void @use(i32 [[TMP5]]) 173; CHECK-NEXT: ret i32 0 174; 175 %3 = icmp sgt i32 %0, %1 176 %4 = select i1 %3, i32 %0, i32 %1 177 tail call void @omp_set_num_threads(i32 %4) 178 %5 = tail call i32 @omp_get_max_threads() 179 tail call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @0, i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*)) 180 %6 = tail call i32 @omp_get_max_threads() 181 tail call void @use(i32 %6) 182 ret i32 0 183} 184 185define internal void @.omp_outlined..2(i32* %0, i32* %1) { 186; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2 187; CHECK-SAME: (i32* [[TMP0:%.*]], i32* [[TMP1:%.*]]) { 188; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @omp_get_max_threads() 189; CHECK-NEXT: [[TMP4:%.*]] = tail call i32 @icv_free_use(i32 [[TMP3]]) 190; CHECK-NEXT: tail call void @omp_set_num_threads(i32 10) 191; CHECK-NEXT: [[TMP5:%.*]] = tail call i32 @icv_free_use(i32 10) 192; CHECK-NEXT: [[TMP6:%.*]] = tail call i32 @icv_free_use(i32 10) 193; CHECK-NEXT: ret void 194; 195 %3 = tail call i32 @omp_get_max_threads() 196 %4 = tail call i32 @icv_free_use(i32 %3) 197 tail call void @omp_set_num_threads(i32 10) 198 %5 = tail call i32 @omp_get_max_threads() 199 %6 = tail call i32 @icv_free_use(i32 %5) 200 %7 = tail call i32 @omp_get_max_threads() 201 %8 = tail call i32 @icv_free_use(i32 %7) 202 ret void 203} 204define void @test(i1 %0) { 205; CHECK-LABEL: define {{[^@]+}}@test 206; CHECK-SAME: (i1 [[TMP0:%.*]]) { 207; CHECK-NEXT: call void @omp_set_num_threads(i32 2) 208; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false 209; CHECK-NEXT: br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]] 210; CHECK: 3: 211; CHECK-NEXT: call void @use(i32 10) 212; CHECK-NEXT: br label [[TMP4]] 213; CHECK: 4: 214; CHECK-NEXT: [[TMP5:%.*]] = call i32 @omp_get_max_threads() 215; CHECK-NEXT: call void @use(i32 [[TMP5]]) 216; CHECK-NEXT: ret void 217; 218 call void @omp_set_num_threads(i32 2) 219 %2 = icmp eq i1 %0, 0 220 br i1 %2, label %4, label %3 221 2223: ; preds = %1 223 call void @use(i32 10) 224 br label %4 225 2264: ; preds = %3, %1 227 %5 = call i32 @omp_get_max_threads() 228 call void @use(i32 %5) 229 ret void 230} 231 232define void @test1(i1 %0) { 233; CHECK-LABEL: define {{[^@]+}}@test1 234; CHECK-SAME: (i1 [[TMP0:%.*]]) { 235; CHECK-NEXT: call void @omp_set_num_threads(i32 2) 236; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false 237; CHECK-NEXT: br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]] 238; CHECK: 3: 239; CHECK-NEXT: [[TMP4:%.*]] = call i32 @icv_free_use(i32 10) 240; CHECK-NEXT: br label [[TMP5]] 241; CHECK: 5: 242; CHECK-NEXT: call void @use(i32 2) 243; CHECK-NEXT: ret void 244; 245 call void @omp_set_num_threads(i32 2) 246 %2 = icmp eq i1 %0, 0 247 br i1 %2, label %5, label %3 248 2493: ; preds = %1 250 %4 = call i32 @icv_free_use(i32 10) 251 br label %5 252 2535: ; preds = %3, %1 254 %6 = call i32 @omp_get_max_threads() 255 call void @use(i32 %6) 256 ret void 257} 258 259define void @bad_use_test(i1 %0) { 260; CHECK-LABEL: define {{[^@]+}}@bad_use_test 261; CHECK-SAME: (i1 [[TMP0:%.*]]) { 262; CHECK-NEXT: call void @omp_set_num_threads(i32 2) 263; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false 264; CHECK-NEXT: br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]] 265; CHECK: 3: 266; CHECK-NEXT: [[TMP4:%.*]] = call i32 @bad_use(i32 10) 267; CHECK-NEXT: br label [[TMP5]] 268; CHECK: 5: 269; CHECK-NEXT: [[TMP6:%.*]] = call i32 @omp_get_max_threads() 270; CHECK-NEXT: call void @use(i32 [[TMP6]]) 271; CHECK-NEXT: ret void 272; 273 call void @omp_set_num_threads(i32 2) 274 %2 = icmp eq i1 %0, 0 275 br i1 %2, label %5, label %3 276 2773: ; preds = %1 278 %4 = call i32 @bad_use(i32 10) 279 br label %5 280 2815: ; preds = %3, %1 282 %6 = call i32 @omp_get_max_threads() 283 call void @use(i32 %6) 284 ret void 285} 286 287define void @ok_use_assume_test(i1 %0) { 288; CHECK-LABEL: define {{[^@]+}}@ok_use_assume_test 289; CHECK-SAME: (i1 [[TMP0:%.*]]) { 290; CHECK-NEXT: call void @omp_set_num_threads(i32 2) 291; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false 292; CHECK-NEXT: br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]] 293; CHECK: 3: 294; CHECK-NEXT: [[TMP4:%.*]] = call i32 @ok_use_assume(i32 10) 295; CHECK-NEXT: br label [[TMP5]] 296; CHECK: 5: 297; CHECK-NEXT: call void @use(i32 2) 298; CHECK-NEXT: ret void 299; 300 call void @omp_set_num_threads(i32 2) 301 %2 = icmp eq i1 %0, 0 302 br i1 %2, label %5, label %3 303 3043: ; preds = %1 305 %4 = call i32 @ok_use_assume(i32 10) 306 br label %5 307 3085: ; preds = %3, %1 309 %6 = call i32 @omp_get_max_threads() 310 call void @use(i32 %6) 311 ret void 312} 313 314define weak void @weak_known_unique_icv(i1 %0) { 315; CHECK-LABEL: define {{[^@]+}}@weak_known_unique_icv 316; CHECK-SAME: (i1 [[TMP0:%.*]]) { 317; CHECK-NEXT: call void @omp_set_num_threads(i32 2) 318; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false 319; CHECK-NEXT: br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]] 320; CHECK: 3: 321; CHECK-NEXT: [[TMP4:%.*]] = call i32 @icv_free_use(i32 10) 322; CHECK-NEXT: br label [[TMP5]] 323; CHECK: 5: 324; CHECK-NEXT: [[TMP6:%.*]] = call i32 @omp_get_max_threads() 325; CHECK-NEXT: [[TMP7:%.*]] = call i32 @icv_free_use(i32 [[TMP6]]) 326; CHECK-NEXT: ret void 327; 328 call void @omp_set_num_threads(i32 2) 329 %2 = icmp eq i1 %0, 0 330 br i1 %2, label %5, label %3 331 3323: ; preds = %1 333 %4 = call i32 @icv_free_use(i32 10) 334 br label %5 335 3365: ; preds = %3, %1 337 %6 = call i32 @omp_get_max_threads() 338 %7 = call i32 @icv_free_use(i32 %6) 339 ret void 340} 341 342define void @known_unique_icv(i1 %0) { 343; CHECK-LABEL: define {{[^@]+}}@known_unique_icv 344; CHECK-SAME: (i1 [[TMP0:%.*]]) { 345; CHECK-NEXT: call void @omp_set_num_threads(i32 2) 346; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false 347; CHECK-NEXT: br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]] 348; CHECK: 3: 349; CHECK-NEXT: [[TMP4:%.*]] = call i32 @icv_free_use(i32 10) 350; CHECK-NEXT: br label [[TMP5]] 351; CHECK: 5: 352; CHECK-NEXT: [[TMP6:%.*]] = call i32 @icv_free_use(i32 2) 353; CHECK-NEXT: ret void 354; 355 call void @omp_set_num_threads(i32 2) 356 %2 = icmp eq i1 %0, 0 357 br i1 %2, label %5, label %3 358 3593: ; preds = %1 360 %4 = call i32 @icv_free_use(i32 10) 361 br label %5 362 3635: ; preds = %3, %1 364 %6 = call i32 @omp_get_max_threads() 365 %7 = call i32 @icv_free_use(i32 %6) 366 ret void 367} 368 369define i32 @no_unique_icv(i1 %0) { 370; CHECK-LABEL: define {{[^@]+}}@no_unique_icv 371; CHECK-SAME: (i1 [[TMP0:%.*]]) { 372; CHECK-NEXT: call void @omp_set_num_threads(i32 4) 373; CHECK-NEXT: br i1 [[TMP0]], label [[TMP3:%.*]], label [[TMP2:%.*]] 374; CHECK: 2: 375; CHECK-NEXT: call void @omp_set_num_threads(i32 2) 376; CHECK-NEXT: br label [[TMP3]] 377; CHECK: 3: 378; CHECK-NEXT: [[TMP4:%.*]] = call i32 @omp_get_max_threads() 379; CHECK-NEXT: ret i32 [[TMP4]] 380; 381 call void @omp_set_num_threads(i32 4) 382 br i1 %0, label %3, label %2 383 3842: ; preds = %1 385 call void @omp_set_num_threads(i32 2) 386 br label %3 387 3883: ; preds = %1, %2 389 %4 = call i32 @omp_get_max_threads() 390 ret i32 %4 391} 392 393define void @test2(i1 %0) { 394; CHECK-LABEL: define {{[^@]+}}@test2 395; CHECK-SAME: (i1 [[TMP0:%.*]]) { 396; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false 397; CHECK-NEXT: br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]] 398; CHECK: 3: 399; CHECK-NEXT: call void @omp_set_num_threads(i32 4) 400; CHECK-NEXT: br label [[TMP4]] 401; CHECK: 4: 402; CHECK-NEXT: [[TMP5:%.*]] = call i32 @omp_get_max_threads() 403; CHECK-NEXT: call void @use(i32 [[TMP5]]) 404; CHECK-NEXT: ret void 405; 406 %2 = icmp eq i1 %0, 0 407 br i1 %2, label %4, label %3 408 4093: ; preds = %1 410 call void @omp_set_num_threads(i32 4) 411 br label %4 412 4134: ; preds = %3, %1 414 %5 = call i32 @omp_get_max_threads() 415 call void @use(i32 %5) 416 ret void 417} 418 419define void @test3(i1 %0) { 420; CHECK-LABEL: define {{[^@]+}}@test3 421; CHECK-SAME: (i1 [[TMP0:%.*]]) { 422; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false 423; CHECK-NEXT: br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]] 424; CHECK: 3: 425; CHECK-NEXT: call void @omp_set_num_threads(i32 4) 426; CHECK-NEXT: br label [[TMP4]] 427; CHECK: 4: 428; CHECK-NEXT: call void @weak_known_unique_icv(i1 [[TMP0]]) 429; CHECK-NEXT: [[TMP5:%.*]] = call i32 @omp_get_max_threads() 430; CHECK-NEXT: [[TMP6:%.*]] = call i32 @icv_free_use(i32 [[TMP5]]) 431; CHECK-NEXT: ret void 432; 433 %2 = icmp eq i1 %0, 0 434 br i1 %2, label %4, label %3 435 4363: ; preds = %1 437 call void @omp_set_num_threads(i32 4) 438 br label %4 439 4404: ; preds = %3, %1 441 call void @weak_known_unique_icv(i1 %0) 442 %5 = call i32 @omp_get_max_threads() 443 %6 = call i32 @icv_free_use(i32 %5) 444 ret void 445} 446 447declare void @__cxa_rethrow() 448 449define i32 @maybe_throw(i1 zeroext %0) { 450; CHECK-LABEL: define {{[^@]+}}@maybe_throw 451; CHECK-SAME: (i1 zeroext [[TMP0:%.*]]) { 452; CHECK-NEXT: call void @omp_set_num_threads(i32 4) 453; CHECK-NEXT: br i1 [[TMP0]], label [[TMP2:%.*]], label [[TMP3:%.*]] 454; CHECK: 2: 455; CHECK-NEXT: tail call void @__cxa_rethrow() 456; CHECK-NEXT: unreachable 457; CHECK: 3: 458; CHECK-NEXT: ret i32 -1 459; 460 call void @omp_set_num_threads(i32 4) 461 br i1 %0, label %2, label %3 462 4632: ; preds = %1 464 tail call void @__cxa_rethrow() #1 465 unreachable 466 4673: ; preds = %1 468 ret i32 -1 469} 470 471define void @test4(i1 %0) { 472; CHECK-LABEL: define {{[^@]+}}@test4 473; CHECK-SAME: (i1 [[TMP0:%.*]]) { 474; CHECK-NEXT: call void @known_unique_icv(i1 [[TMP0]]) 475; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false 476; CHECK-NEXT: br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]] 477; CHECK: 3: 478; CHECK-NEXT: [[VAL:%.*]] = call i32 @icv_free_use(i32 10) 479; CHECK-NEXT: br label [[TMP4]] 480; CHECK: 4: 481; CHECK-NEXT: call void @use(i32 2) 482; CHECK-NEXT: [[TMP5:%.*]] = call i32 @omp_get_max_threads() 483; CHECK-NEXT: [[TMP6:%.*]] = call i32 @no_unique_icv(i1 [[TMP0]]) 484; CHECK-NEXT: call void @use(i32 [[TMP5]]) 485; CHECK-NEXT: ret void 486; 487 call void @known_unique_icv(i1 %0) 488 %2 = icmp eq i1 %0, 0 489 br i1 %2, label %4, label %3 490 4913: ; preds = %1 492 %val = call i32 @icv_free_use(i32 10) 493 br label %4 494 4954: ; preds = %3, %1 496 %5 = call i32 @omp_get_max_threads() 497 call void @use(i32 %5) 498 %6 = call i32 @omp_get_max_threads() 499 call i32 @no_unique_icv(i1 %0) 500 call void @use(i32 %6) 501 ret void 502} 503 504define void @test4_invoke(i1 %0) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 505; CHECK-LABEL: define {{[^@]+}}@test4_invoke 506; CHECK-SAME: (i1 [[TMP0:%.*]]) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 507; CHECK-NEXT: call void @known_unique_icv(i1 [[TMP0]]) 508; CHECK-NEXT: [[TMP2:%.*]] = invoke i32 @maybe_throw(i1 zeroext [[TMP0]]) 509; CHECK-NEXT: to label [[CONT:%.*]] unwind label [[EXC:%.*]] 510; CHECK: cont: 511; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i1 [[TMP0]], false 512; CHECK-NEXT: br i1 [[TMP3]], label [[TMP5:%.*]], label [[TMP4:%.*]] 513; CHECK: exc: 514; CHECK-NEXT: [[LP:%.*]] = landingpad { i8*, i32 } 515; CHECK-NEXT: filter [0 x i8*] zeroinitializer 516; CHECK-NEXT: unreachable 517; CHECK: 4: 518; CHECK-NEXT: [[VAL:%.*]] = call i32 @icv_free_use(i32 10) 519; CHECK-NEXT: br label [[TMP5]] 520; CHECK: 5: 521; CHECK-NEXT: call void @use(i32 2) 522; CHECK-NEXT: ret void 523; 524 call void @known_unique_icv(i1 %0) 525 invoke i32 @maybe_throw(i1 zeroext %0) 526 to label %cont unwind label %exc 527 528cont: 529 %3 = icmp eq i1 %0, 0 530 br i1 %3, label %5, label %4 531 532exc: 533 %lp = landingpad { i8*, i32 } 534 filter [0 x i8*] zeroinitializer 535 unreachable 536 5374: ; preds = %1 538 %val = call i32 @icv_free_use(i32 10) 539 br label %5 540 5415: ; preds = %3, %1 542 %6 = call i32 @omp_get_max_threads() 543 call void @use(i32 %6) 544 ret void 545} 546 547define i32 @test5(i32 %0) #0 { 548; CHECK-LABEL: define {{[^@]+}}@test5 549; CHECK-SAME: (i32 [[TMP0:%.*]]) { 550; CHECK-NEXT: call void @omp_set_num_threads(i32 4) 551; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP0]], 3 552; CHECK-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]] 553; CHECK: 3: 554; CHECK-NEXT: call void @use(i32 4) 555; CHECK-NEXT: br label [[TMP12:%.*]] 556; CHECK: 4: 557; CHECK-NEXT: [[TMP5:%.*]] = icmp sgt i32 [[TMP0]], 0 558; CHECK-NEXT: br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP8:%.*]] 559; CHECK: 6: 560; CHECK-NEXT: [[TMP7:%.*]] = call i32 @icv_free_use(i32 [[TMP0]]) 561; CHECK-NEXT: br label [[TMP15:%.*]] 562; CHECK: 8: 563; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP0]], 0 564; CHECK-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP12]] 565; CHECK: 10: 566; CHECK-NEXT: [[TMP11:%.*]] = call i32 @icv_free_use(i32 10) 567; CHECK-NEXT: br label [[TMP15]] 568; CHECK: 12: 569; CHECK-NEXT: [[TMP13:%.*]] = add nsw i32 [[TMP0]], 1 570; CHECK-NEXT: [[TMP14:%.*]] = call i32 @icv_free_use(i32 [[TMP13]]) 571; CHECK-NEXT: br label [[TMP15]] 572; CHECK: 15: 573; CHECK-NEXT: [[TMP16:%.*]] = call i32 @omp_get_max_threads() 574; CHECK-NEXT: [[TMP17:%.*]] = call i32 @icv_free_use(i32 [[TMP16]]) 575; CHECK-NEXT: ret i32 [[TMP17]] 576; 577 call void @omp_set_num_threads(i32 4) 578 %2 = icmp sgt i32 %0, 3 579 br i1 %2, label %3, label %5 580 5813: 582 %4 = call i32 @omp_get_max_threads() 583 call void @use(i32 %4) 584 br label %13 585 5865: 587 %6 = icmp sgt i32 %0, 0 588 br i1 %6, label %7, label %9 589 5907: 591 %8 = call i32 @icv_free_use(i32 %0) 592 br label %16 593 5949: 595 %10 = icmp eq i32 %0, 0 596 br i1 %10, label %11, label %13 597 59811: 599 %12 = call i32 @icv_free_use(i32 10) 600 br label %16 601 60213: 603 %14 = add nsw i32 %0, 1 604 %15 = call i32 @icv_free_use(i32 %14) 605 br label %16 606 60716: 608 %17 = call i32 @omp_get_max_threads() 609 %18 = call i32 @icv_free_use(i32 %17) 610 ret i32 %18 611} 612 613define i32 @test6(i32 %0) { 614; CHECK-LABEL: define {{[^@]+}}@test6 615; CHECK-SAME: (i32 [[TMP0:%.*]]) { 616; CHECK-NEXT: call void @omp_set_num_threads(i32 4) 617; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP0]], 3 618; CHECK-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]] 619; CHECK: 3: 620; CHECK-NEXT: [[TMP4:%.*]] = call i32 @icv_free_use(i32 10) 621; CHECK-NEXT: br label [[TMP16:%.*]] 622; CHECK: 5: 623; CHECK-NEXT: [[TMP6:%.*]] = icmp sgt i32 [[TMP0]], 0 624; CHECK-NEXT: br i1 [[TMP6]], label [[TMP7:%.*]], label [[TMP9:%.*]] 625; CHECK: 7: 626; CHECK-NEXT: [[TMP8:%.*]] = call i32 @icv_free_use(i32 [[TMP0]]) 627; CHECK-NEXT: br label [[TMP16]] 628; CHECK: 9: 629; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i32 [[TMP0]], 0 630; CHECK-NEXT: br i1 [[TMP10]], label [[TMP11:%.*]], label [[TMP13:%.*]] 631; CHECK: 11: 632; CHECK-NEXT: [[TMP12:%.*]] = call i32 @icv_free_use(i32 5) 633; CHECK-NEXT: br label [[TMP16]] 634; CHECK: 13: 635; CHECK-NEXT: [[TMP14:%.*]] = add nsw i32 [[TMP0]], 1 636; CHECK-NEXT: [[TMP15:%.*]] = call i32 @icv_free_use(i32 [[TMP14]]) 637; CHECK-NEXT: br label [[TMP16]] 638; CHECK: 16: 639; CHECK-NEXT: [[TMP17:%.*]] = call i32 @icv_free_use(i32 4) 640; CHECK-NEXT: ret i32 [[TMP17]] 641; 642 call void @omp_set_num_threads(i32 4) 643 %2 = icmp sgt i32 %0, 3 644 br i1 %2, label %3, label %5 645 6463: ; preds = %1 647 %4 = call i32 @icv_free_use(i32 10) 648 br label %16 649 6505: ; preds = %1 651 %6 = icmp sgt i32 %0, 0 652 br i1 %6, label %7, label %9 653 6547: ; preds = %5 655 %8 = call i32 @icv_free_use(i32 %0) 656 br label %16 657 6589: ; preds = %5 659 %10 = icmp eq i32 %0, 0 660 br i1 %10, label %11, label %13 661 66211: ; preds = %9 663 %12 = call i32 @icv_free_use(i32 5) 664 br label %16 665 66613: ; preds = %9 667 %14 = add nsw i32 %0, 1 668 %15 = call i32 @icv_free_use(i32 %14) 669 br label %16 670 67116: ; preds = %7, %13, %11, %3 672 %17 = call i32 @omp_get_max_threads() 673 %18 = call i32 @icv_free_use(i32 %17) 674 ret i32 %18 675} 676 677declare i32 @__gxx_personality_v0(...) 678 679!llvm.module.flags = !{!2} 680 681!0 = !{!1} 682!1 = !{i64 2, i64 -1, i64 -1, i1 true} 683!2 = !{i32 7, !"openmp", i32 50} 684