brintos

brintos / llvm-project-archived public Read only

0
0
Text · 85.4 KiB · 600aae2 Raw
1339 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _2// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK13// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t.0 %s4// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t.0 -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK15 6// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-enable-irbuilder -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK37// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -fopenmp-enable-irbuilder -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t.1 %s8// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -fopenmp-enable-irbuilder -std=c++11 -include-pch %t.1 -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK39 10// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"11// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t.2 %s12// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t.2 -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"13 14// RUN: %clang_cc1 -verify -fopenmp -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK115// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t.3 %s16// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t.3 -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK117 18// RUN: %clang_cc1 -verify -fopenmp -fopenmp-enable-irbuilder -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK319// RUN: %clang_cc1 -fopenmp -fopenmp-enable-irbuilder -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t.4 %s20// RUN: %clang_cc1 -fopenmp -fopenmp-enable-irbuilder -std=c++11 -include-pch %t.4 -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK321 22// RUN: %clang_cc1 -verify -fopenmp-simd -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"23// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t.5 %s24// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t.5 -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"25 26// expected-no-diagnostics27#ifndef HEADER28#define HEADER29 30float flag;31int main (int argc, char **argv) {32#pragma omp parallel33{34#pragma omp cancel parallel if(flag)35  argv[0][0] = argc;36#pragma omp barrier37  argv[0][0] += argc;38}39#pragma omp sections40{41#pragma omp cancel sections42}43#pragma omp sections44{45#pragma omp cancel sections46#pragma omp section47  {48#pragma omp cancel sections49  }50}51#pragma omp for52for (int i = 0; i < argc; ++i) {53#pragma omp cancel for if(cancel: flag)54}55#pragma omp task56{57#pragma omp cancel taskgroup58}59#pragma omp parallel sections60{61#pragma omp cancel sections62}63#pragma omp parallel sections64{65#pragma omp cancel sections66#pragma omp section67  {68#pragma omp cancel sections69  }70}71int r = 0;72#pragma omp parallel for reduction(+: r)73for (int i = 0; i < argc; ++i) {74#pragma omp cancel for75  r += i;76}77  return argc;78}79 80#endif81// CHECK1-LABEL: define {{[^@]+}}@main82// CHECK1-SAME: (i32 noundef [[ARGC:%.*]], ptr noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {83// CHECK1-NEXT:  entry:84// CHECK1-NEXT:    [[RETVAL:%.*]] = alloca i32, align 485// CHECK1-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 486// CHECK1-NEXT:    [[ARGV_ADDR:%.*]] = alloca ptr, align 887// CHECK1-NEXT:    [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 488// CHECK1-NEXT:    [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 489// CHECK1-NEXT:    [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 490// CHECK1-NEXT:    [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 491// CHECK1-NEXT:    [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 492// CHECK1-NEXT:    [[DOTOMP_SECTIONS_LB_1:%.*]] = alloca i32, align 493// CHECK1-NEXT:    [[DOTOMP_SECTIONS_UB_2:%.*]] = alloca i32, align 494// CHECK1-NEXT:    [[DOTOMP_SECTIONS_ST_3:%.*]] = alloca i32, align 495// CHECK1-NEXT:    [[DOTOMP_SECTIONS_IL_4:%.*]] = alloca i32, align 496// CHECK1-NEXT:    [[DOTOMP_SECTIONS_IV_5:%.*]] = alloca i32, align 497// CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 498// CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 499// CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4100// CHECK1-NEXT:    [[DOTCAPTURE_EXPR_21:%.*]] = alloca i32, align 4101// CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4102// CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4103// CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4104// CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4105// CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4106// CHECK1-NEXT:    [[I24:%.*]] = alloca i32, align 4107// CHECK1-NEXT:    [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1108// CHECK1-NEXT:    [[R:%.*]] = alloca i32, align 4109// CHECK1-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])110// CHECK1-NEXT:    store i32 0, ptr [[RETVAL]], align 4111// CHECK1-NEXT:    store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 4112// CHECK1-NEXT:    store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 8113// CHECK1-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @main.omp_outlined, ptr [[ARGV_ADDR]], ptr [[ARGC_ADDR]])114// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_LB_]], align 4115// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_UB_]], align 4116// CHECK1-NEXT:    store i32 1, ptr [[DOTOMP_SECTIONS_ST_]], align 4117// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_IL_]], align 4118// CHECK1-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB4:[0-9]+]], i32 [[TMP0]], i32 34, ptr [[DOTOMP_SECTIONS_IL_]], ptr [[DOTOMP_SECTIONS_LB_]], ptr [[DOTOMP_SECTIONS_UB_]], ptr [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)119// CHECK1-NEXT:    [[TMP1:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_UB_]], align 4120// CHECK1-NEXT:    [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0121// CHECK1-NEXT:    [[TMP3:%.*]] = select i1 [[TMP2]], i32 [[TMP1]], i32 0122// CHECK1-NEXT:    store i32 [[TMP3]], ptr [[DOTOMP_SECTIONS_UB_]], align 4123// CHECK1-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_LB_]], align 4124// CHECK1-NEXT:    store i32 [[TMP4]], ptr [[DOTOMP_SECTIONS_IV_]], align 4125// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]126// CHECK1:       omp.inner.for.cond:127// CHECK1-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 4128// CHECK1-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_UB_]], align 4129// CHECK1-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]130// CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]131// CHECK1:       omp.inner.for.body:132// CHECK1-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 4133// CHECK1-NEXT:    switch i32 [[TMP7]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [134// CHECK1-NEXT:      i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]135// CHECK1-NEXT:    ]136// CHECK1:       .omp.sections.case:137// CHECK1-NEXT:    [[TMP8:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[TMP0]], i32 3)138// CHECK1-NEXT:    [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 0139// CHECK1-NEXT:    br i1 [[TMP9]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]140// CHECK1:       .cancel.exit:141// CHECK1-NEXT:    br label [[CANCEL_EXIT:%.*]]142// CHECK1:       .cancel.continue:143// CHECK1-NEXT:    br label [[DOTOMP_SECTIONS_EXIT]]144// CHECK1:       .omp.sections.exit:145// CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]146// CHECK1:       omp.inner.for.inc:147// CHECK1-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 4148// CHECK1-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP10]], 1149// CHECK1-NEXT:    store i32 [[INC]], ptr [[DOTOMP_SECTIONS_IV_]], align 4150// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]151// CHECK1:       omp.inner.for.end:152// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB4]], i32 [[TMP0]])153// CHECK1-NEXT:    br label [[CANCEL_CONT:%.*]]154// CHECK1:       cancel.cont:155// CHECK1-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB5:[0-9]+]], i32 [[TMP0]])156// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_LB_1]], align 4157// CHECK1-NEXT:    store i32 1, ptr [[DOTOMP_SECTIONS_UB_2]], align 4158// CHECK1-NEXT:    store i32 1, ptr [[DOTOMP_SECTIONS_ST_3]], align 4159// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_IL_4]], align 4160// CHECK1-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB4]], i32 [[TMP0]], i32 34, ptr [[DOTOMP_SECTIONS_IL_4]], ptr [[DOTOMP_SECTIONS_LB_1]], ptr [[DOTOMP_SECTIONS_UB_2]], ptr [[DOTOMP_SECTIONS_ST_3]], i32 1, i32 1)161// CHECK1-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_UB_2]], align 4162// CHECK1-NEXT:    [[TMP12:%.*]] = icmp slt i32 [[TMP11]], 1163// CHECK1-NEXT:    [[TMP13:%.*]] = select i1 [[TMP12]], i32 [[TMP11]], i32 1164// CHECK1-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_SECTIONS_UB_2]], align 4165// CHECK1-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_LB_1]], align 4166// CHECK1-NEXT:    store i32 [[TMP14]], ptr [[DOTOMP_SECTIONS_IV_5]], align 4167// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND6:%.*]]168// CHECK1:       omp.inner.for.cond6:169// CHECK1-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_5]], align 4170// CHECK1-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_UB_2]], align 4171// CHECK1-NEXT:    [[CMP7:%.*]] = icmp sle i32 [[TMP15]], [[TMP16]]172// CHECK1-NEXT:    br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY8:%.*]], label [[OMP_INNER_FOR_END18:%.*]]173// CHECK1:       omp.inner.for.body8:174// CHECK1-NEXT:    [[TMP17:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_5]], align 4175// CHECK1-NEXT:    switch i32 [[TMP17]], label [[DOTOMP_SECTIONS_EXIT15:%.*]] [176// CHECK1-NEXT:      i32 0, label [[DOTOMP_SECTIONS_CASE9:%.*]]177// CHECK1-NEXT:      i32 1, label [[DOTOMP_SECTIONS_CASE12:%.*]]178// CHECK1-NEXT:    ]179// CHECK1:       .omp.sections.case9:180// CHECK1-NEXT:    [[TMP18:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[TMP0]], i32 3)181// CHECK1-NEXT:    [[TMP19:%.*]] = icmp ne i32 [[TMP18]], 0182// CHECK1-NEXT:    br i1 [[TMP19]], label [[DOTCANCEL_EXIT10:%.*]], label [[DOTCANCEL_CONTINUE11:%.*]]183// CHECK1:       .cancel.exit10:184// CHECK1-NEXT:    br label [[CANCEL_EXIT19:%.*]]185// CHECK1:       cancel.exit:186// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB4]], i32 [[TMP0]])187// CHECK1-NEXT:    br label [[CANCEL_CONT]]188// CHECK1:       .cancel.continue11:189// CHECK1-NEXT:    br label [[DOTOMP_SECTIONS_EXIT15]]190// CHECK1:       .omp.sections.case12:191// CHECK1-NEXT:    [[TMP20:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[TMP0]], i32 3)192// CHECK1-NEXT:    [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0193// CHECK1-NEXT:    br i1 [[TMP21]], label [[DOTCANCEL_EXIT13:%.*]], label [[DOTCANCEL_CONTINUE14:%.*]]194// CHECK1:       .cancel.exit13:195// CHECK1-NEXT:    br label [[CANCEL_EXIT19]]196// CHECK1:       .cancel.continue14:197// CHECK1-NEXT:    br label [[DOTOMP_SECTIONS_EXIT15]]198// CHECK1:       .omp.sections.exit15:199// CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC16:%.*]]200// CHECK1:       omp.inner.for.inc16:201// CHECK1-NEXT:    [[TMP22:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_5]], align 4202// CHECK1-NEXT:    [[INC17:%.*]] = add nsw i32 [[TMP22]], 1203// CHECK1-NEXT:    store i32 [[INC17]], ptr [[DOTOMP_SECTIONS_IV_5]], align 4204// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND6]]205// CHECK1:       omp.inner.for.end18:206// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB4]], i32 [[TMP0]])207// CHECK1-NEXT:    br label [[CANCEL_CONT20:%.*]]208// CHECK1:       cancel.cont20:209// CHECK1-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB5]], i32 [[TMP0]])210// CHECK1-NEXT:    [[TMP23:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4211// CHECK1-NEXT:    store i32 [[TMP23]], ptr [[DOTCAPTURE_EXPR_]], align 4212// CHECK1-NEXT:    [[TMP24:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4213// CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP24]], 0214// CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1215// CHECK1-NEXT:    [[SUB22:%.*]] = sub nsw i32 [[DIV]], 1216// CHECK1-NEXT:    store i32 [[SUB22]], ptr [[DOTCAPTURE_EXPR_21]], align 4217// CHECK1-NEXT:    store i32 0, ptr [[I]], align 4218// CHECK1-NEXT:    [[TMP25:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4219// CHECK1-NEXT:    [[CMP23:%.*]] = icmp slt i32 0, [[TMP25]]220// CHECK1-NEXT:    br i1 [[CMP23]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]221// CHECK1:       omp.precond.then:222// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4223// CHECK1-NEXT:    [[TMP26:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_21]], align 4224// CHECK1-NEXT:    store i32 [[TMP26]], ptr [[DOTOMP_UB]], align 4225// CHECK1-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4226// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4227// CHECK1-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB6:[0-9]+]], i32 [[TMP0]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)228// CHECK1-NEXT:    [[TMP27:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4229// CHECK1-NEXT:    [[TMP28:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_21]], align 4230// CHECK1-NEXT:    [[CMP25:%.*]] = icmp sgt i32 [[TMP27]], [[TMP28]]231// CHECK1-NEXT:    br i1 [[CMP25]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]232// CHECK1:       cond.true:233// CHECK1-NEXT:    [[TMP29:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_21]], align 4234// CHECK1-NEXT:    br label [[COND_END:%.*]]235// CHECK1:       cond.false:236// CHECK1-NEXT:    [[TMP30:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4237// CHECK1-NEXT:    br label [[COND_END]]238// CHECK1:       cond.end:239// CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP29]], [[COND_TRUE]] ], [ [[TMP30]], [[COND_FALSE]] ]240// CHECK1-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4241// CHECK1-NEXT:    [[TMP31:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4242// CHECK1-NEXT:    store i32 [[TMP31]], ptr [[DOTOMP_IV]], align 4243// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND26:%.*]]244// CHECK1:       omp.inner.for.cond26:245// CHECK1-NEXT:    [[TMP32:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4246// CHECK1-NEXT:    [[TMP33:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4247// CHECK1-NEXT:    [[CMP27:%.*]] = icmp sle i32 [[TMP32]], [[TMP33]]248// CHECK1-NEXT:    br i1 [[CMP27]], label [[OMP_INNER_FOR_BODY28:%.*]], label [[OMP_INNER_FOR_END33:%.*]]249// CHECK1:       omp.inner.for.body28:250// CHECK1-NEXT:    [[TMP34:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4251// CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP34]], 1252// CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]253// CHECK1-NEXT:    store i32 [[ADD]], ptr [[I24]], align 4254// CHECK1-NEXT:    [[TMP35:%.*]] = load float, ptr @flag, align 4255// CHECK1-NEXT:    [[TOBOOL:%.*]] = fcmp une float [[TMP35]], 0.000000e+00256// CHECK1-NEXT:    br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]257// CHECK1:       omp_if.then:258// CHECK1-NEXT:    [[TMP36:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[TMP0]], i32 2)259// CHECK1-NEXT:    [[TMP37:%.*]] = icmp ne i32 [[TMP36]], 0260// CHECK1-NEXT:    br i1 [[TMP37]], label [[DOTCANCEL_EXIT29:%.*]], label [[DOTCANCEL_CONTINUE30:%.*]]261// CHECK1:       .cancel.exit29:262// CHECK1-NEXT:    br label [[CANCEL_EXIT34:%.*]]263// CHECK1:       cancel.exit19:264// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB4]], i32 [[TMP0]])265// CHECK1-NEXT:    br label [[CANCEL_CONT20]]266// CHECK1:       .cancel.continue30:267// CHECK1-NEXT:    br label [[OMP_IF_END:%.*]]268// CHECK1:       omp_if.else:269// CHECK1-NEXT:    br label [[OMP_IF_END]]270// CHECK1:       omp_if.end:271// CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]272// CHECK1:       omp.body.continue:273// CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC31:%.*]]274// CHECK1:       omp.inner.for.inc31:275// CHECK1-NEXT:    [[TMP38:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4276// CHECK1-NEXT:    [[ADD32:%.*]] = add nsw i32 [[TMP38]], 1277// CHECK1-NEXT:    store i32 [[ADD32]], ptr [[DOTOMP_IV]], align 4278// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND26]]279// CHECK1:       omp.inner.for.end33:280// CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]281// CHECK1:       omp.loop.exit:282// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB6]], i32 [[TMP0]])283// CHECK1-NEXT:    br label [[OMP_PRECOND_END]]284// CHECK1:       cancel.exit34:285// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB6]], i32 [[TMP0]])286// CHECK1-NEXT:    br label [[CANCEL_CONT35:%.*]]287// CHECK1:       omp.precond.end:288// CHECK1-NEXT:    br label [[CANCEL_CONT35]]289// CHECK1:       cancel.cont35:290// CHECK1-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP0]])291// CHECK1-NEXT:    [[TMP39:%.*]] = call ptr @__kmpc_omp_task_alloc(ptr @[[GLOB1]], i32 [[TMP0]], i32 1, i64 40, i64 1, ptr @.omp_task_entry.)292// CHECK1-NEXT:    [[TMP40:%.*]] = getelementptr inbounds nuw [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], ptr [[TMP39]], i32 0, i32 0293// CHECK1-NEXT:    [[TMP41:%.*]] = call i32 @__kmpc_omp_task(ptr @[[GLOB1]], i32 [[TMP0]], ptr [[TMP39]])294// CHECK1-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @main.omp_outlined.1)295// CHECK1-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @main.omp_outlined.2)296// CHECK1-NEXT:    store i32 0, ptr [[R]], align 4297// CHECK1-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @main.omp_outlined.3, ptr [[ARGC_ADDR]], ptr [[R]])298// CHECK1-NEXT:    [[TMP42:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4299// CHECK1-NEXT:    ret i32 [[TMP42]]300//301//302// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined303// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[ARGV:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[ARGC:%.*]]) #[[ATTR1:[0-9]+]] {304// CHECK1-NEXT:  entry:305// CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8306// CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8307// CHECK1-NEXT:    [[ARGV_ADDR:%.*]] = alloca ptr, align 8308// CHECK1-NEXT:    [[ARGC_ADDR:%.*]] = alloca ptr, align 8309// CHECK1-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8310// CHECK1-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8311// CHECK1-NEXT:    store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 8312// CHECK1-NEXT:    store ptr [[ARGC]], ptr [[ARGC_ADDR]], align 8313// CHECK1-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[ARGV_ADDR]], align 8314// CHECK1-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[ARGC_ADDR]], align 8315// CHECK1-NEXT:    [[TMP2:%.*]] = load float, ptr @flag, align 4316// CHECK1-NEXT:    [[TOBOOL:%.*]] = fcmp une float [[TMP2]], 0.000000e+00317// CHECK1-NEXT:    br i1 [[TOBOOL]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]318// CHECK1:       omp_if.then:319// CHECK1-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8320// CHECK1-NEXT:    [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4321// CHECK1-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[TMP4]], i32 1)322// CHECK1-NEXT:    [[TMP6:%.*]] = icmp ne i32 [[TMP5]], 0323// CHECK1-NEXT:    br i1 [[TMP6]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]324// CHECK1:       .cancel.exit:325// CHECK1-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8326// CHECK1-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4327// CHECK1-NEXT:    [[TMP9:%.*]] = call i32 @__kmpc_cancel_barrier(ptr @[[GLOB2]], i32 [[TMP8]])328// CHECK1-NEXT:    br label [[RETURN:%.*]]329// CHECK1:       .cancel.continue:330// CHECK1-NEXT:    br label [[OMP_IF_END:%.*]]331// CHECK1:       omp_if.else:332// CHECK1-NEXT:    br label [[OMP_IF_END]]333// CHECK1:       omp_if.end:334// CHECK1-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP1]], align 4335// CHECK1-NEXT:    [[CONV:%.*]] = trunc i32 [[TMP10]] to i8336// CHECK1-NEXT:    [[TMP11:%.*]] = load ptr, ptr [[TMP0]], align 8337// CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[TMP11]], i64 0338// CHECK1-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[ARRAYIDX]], align 8339// CHECK1-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[TMP12]], i64 0340// CHECK1-NEXT:    store i8 [[CONV]], ptr [[ARRAYIDX1]], align 1341// CHECK1-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8342// CHECK1-NEXT:    [[TMP14:%.*]] = load i32, ptr [[TMP13]], align 4343// CHECK1-NEXT:    [[TMP15:%.*]] = call i32 @__kmpc_cancel_barrier(ptr @[[GLOB3:[0-9]+]], i32 [[TMP14]])344// CHECK1-NEXT:    [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0345// CHECK1-NEXT:    br i1 [[TMP16]], label [[DOTCANCEL_EXIT2:%.*]], label [[DOTCANCEL_CONTINUE3:%.*]]346// CHECK1:       .cancel.exit2:347// CHECK1-NEXT:    br label [[RETURN]]348// CHECK1:       .cancel.continue3:349// CHECK1-NEXT:    [[TMP17:%.*]] = load i32, ptr [[TMP1]], align 4350// CHECK1-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP0]], align 8351// CHECK1-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds ptr, ptr [[TMP18]], i64 0352// CHECK1-NEXT:    [[TMP19:%.*]] = load ptr, ptr [[ARRAYIDX4]], align 8353// CHECK1-NEXT:    [[ARRAYIDX5:%.*]] = getelementptr inbounds i8, ptr [[TMP19]], i64 0354// CHECK1-NEXT:    [[TMP20:%.*]] = load i8, ptr [[ARRAYIDX5]], align 1355// CHECK1-NEXT:    [[CONV6:%.*]] = sext i8 [[TMP20]] to i32356// CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[CONV6]], [[TMP17]]357// CHECK1-NEXT:    [[CONV7:%.*]] = trunc i32 [[ADD]] to i8358// CHECK1-NEXT:    store i8 [[CONV7]], ptr [[ARRAYIDX5]], align 1359// CHECK1-NEXT:    br label [[RETURN]]360// CHECK1:       return:361// CHECK1-NEXT:    ret void362//363//364// CHECK1-LABEL: define {{[^@]+}}@.omp_task_entry.365// CHECK1-SAME: (i32 noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {366// CHECK1-NEXT:  entry:367// CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4368// CHECK1-NEXT:    [[DOTPART_ID__ADDR_I:%.*]] = alloca ptr, align 8369// CHECK1-NEXT:    [[DOTPRIVATES__ADDR_I:%.*]] = alloca ptr, align 8370// CHECK1-NEXT:    [[DOTCOPY_FN__ADDR_I:%.*]] = alloca ptr, align 8371// CHECK1-NEXT:    [[DOTTASK_T__ADDR_I:%.*]] = alloca ptr, align 8372// CHECK1-NEXT:    [[__CONTEXT_ADDR_I:%.*]] = alloca ptr, align 8373// CHECK1-NEXT:    [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4374// CHECK1-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 4375// CHECK1-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8376// CHECK1-NEXT:    store i32 [[TMP0]], ptr [[DOTADDR]], align 4377// CHECK1-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8378// CHECK1-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTADDR]], align 4379// CHECK1-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8380// CHECK1-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], ptr [[TMP3]], i32 0, i32 0381// CHECK1-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw [[STRUCT_KMP_TASK_T:%.*]], ptr [[TMP4]], i32 0, i32 2382// CHECK1-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[STRUCT_KMP_TASK_T]], ptr [[TMP4]], i32 0, i32 0383// CHECK1-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8384// CHECK1-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]])385// CHECK1-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])386// CHECK1-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])387// CHECK1-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META12:![0-9]+]])388// CHECK1-NEXT:    store i32 [[TMP2]], ptr [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias [[META14:![0-9]+]]389// CHECK1-NEXT:    store ptr [[TMP5]], ptr [[DOTPART_ID__ADDR_I]], align 8, !noalias [[META14]]390// CHECK1-NEXT:    store ptr null, ptr [[DOTPRIVATES__ADDR_I]], align 8, !noalias [[META14]]391// CHECK1-NEXT:    store ptr null, ptr [[DOTCOPY_FN__ADDR_I]], align 8, !noalias [[META14]]392// CHECK1-NEXT:    store ptr [[TMP3]], ptr [[DOTTASK_T__ADDR_I]], align 8, !noalias [[META14]]393// CHECK1-NEXT:    store ptr [[TMP7]], ptr [[__CONTEXT_ADDR_I]], align 8, !noalias [[META14]]394// CHECK1-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[__CONTEXT_ADDR_I]], align 8, !noalias [[META14]]395// CHECK1-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias [[META14]]396// CHECK1-NEXT:    [[TMP10:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[TMP9]], i32 4)397// CHECK1-NEXT:    [[TMP11:%.*]] = icmp ne i32 [[TMP10]], 0398// CHECK1-NEXT:    br i1 [[TMP11]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]]399// CHECK1:       .cancel.exit.i:400// CHECK1-NEXT:    store i32 1, ptr [[CLEANUP_DEST_SLOT_I]], align 4, !noalias [[META14]]401// CHECK1-NEXT:    br label [[DOTOMP_OUTLINED__EXIT:%.*]]402// CHECK1:       .cancel.continue.i:403// CHECK1-NEXT:    store i32 0, ptr [[CLEANUP_DEST_SLOT_I]], align 4, !noalias [[META14]]404// CHECK1-NEXT:    br label [[DOTOMP_OUTLINED__EXIT]]405// CHECK1:       .omp_outlined..exit:406// CHECK1-NEXT:    [[CLEANUP_DEST_I:%.*]] = load i32, ptr [[CLEANUP_DEST_SLOT_I]], align 4, !noalias [[META14]]407// CHECK1-NEXT:    ret i32 0408//409//410// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.1411// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {412// CHECK1-NEXT:  entry:413// CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8414// CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8415// CHECK1-NEXT:    [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4416// CHECK1-NEXT:    [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4417// CHECK1-NEXT:    [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4418// CHECK1-NEXT:    [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4419// CHECK1-NEXT:    [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4420// CHECK1-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8421// CHECK1-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8422// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_LB_]], align 4423// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_UB_]], align 4424// CHECK1-NEXT:    store i32 1, ptr [[DOTOMP_SECTIONS_ST_]], align 4425// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_IL_]], align 4426// CHECK1-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8427// CHECK1-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4428// CHECK1-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB4]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_SECTIONS_IL_]], ptr [[DOTOMP_SECTIONS_LB_]], ptr [[DOTOMP_SECTIONS_UB_]], ptr [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)429// CHECK1-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_UB_]], align 4430// CHECK1-NEXT:    [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 0431// CHECK1-NEXT:    [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 0432// CHECK1-NEXT:    store i32 [[TMP4]], ptr [[DOTOMP_SECTIONS_UB_]], align 4433// CHECK1-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_LB_]], align 4434// CHECK1-NEXT:    store i32 [[TMP5]], ptr [[DOTOMP_SECTIONS_IV_]], align 4435// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]436// CHECK1:       omp.inner.for.cond:437// CHECK1-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 4438// CHECK1-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_UB_]], align 4439// CHECK1-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]440// CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]441// CHECK1:       omp.inner.for.body:442// CHECK1-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 4443// CHECK1-NEXT:    switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [444// CHECK1-NEXT:      i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]445// CHECK1-NEXT:    ]446// CHECK1:       .omp.sections.case:447// CHECK1-NEXT:    [[TMP9:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[TMP1]], i32 3)448// CHECK1-NEXT:    [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0449// CHECK1-NEXT:    br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]450// CHECK1:       .cancel.exit:451// CHECK1-NEXT:    br label [[CANCEL_EXIT:%.*]]452// CHECK1:       .cancel.continue:453// CHECK1-NEXT:    br label [[DOTOMP_SECTIONS_EXIT]]454// CHECK1:       .omp.sections.exit:455// CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]456// CHECK1:       omp.inner.for.inc:457// CHECK1-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 4458// CHECK1-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP11]], 1459// CHECK1-NEXT:    store i32 [[INC]], ptr [[DOTOMP_SECTIONS_IV_]], align 4460// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]461// CHECK1:       omp.inner.for.end:462// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB4]], i32 [[TMP1]])463// CHECK1-NEXT:    br label [[CANCEL_CONT:%.*]]464// CHECK1:       cancel.cont:465// CHECK1-NEXT:    ret void466// CHECK1:       cancel.exit:467// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB4]], i32 [[TMP1]])468// CHECK1-NEXT:    br label [[CANCEL_CONT]]469//470//471// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.2472// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] {473// CHECK1-NEXT:  entry:474// CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8475// CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8476// CHECK1-NEXT:    [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4477// CHECK1-NEXT:    [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4478// CHECK1-NEXT:    [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4479// CHECK1-NEXT:    [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4480// CHECK1-NEXT:    [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4481// CHECK1-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8482// CHECK1-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8483// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_LB_]], align 4484// CHECK1-NEXT:    store i32 1, ptr [[DOTOMP_SECTIONS_UB_]], align 4485// CHECK1-NEXT:    store i32 1, ptr [[DOTOMP_SECTIONS_ST_]], align 4486// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_IL_]], align 4487// CHECK1-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8488// CHECK1-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4489// CHECK1-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB4]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_SECTIONS_IL_]], ptr [[DOTOMP_SECTIONS_LB_]], ptr [[DOTOMP_SECTIONS_UB_]], ptr [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)490// CHECK1-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_UB_]], align 4491// CHECK1-NEXT:    [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 1492// CHECK1-NEXT:    [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 1493// CHECK1-NEXT:    store i32 [[TMP4]], ptr [[DOTOMP_SECTIONS_UB_]], align 4494// CHECK1-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_LB_]], align 4495// CHECK1-NEXT:    store i32 [[TMP5]], ptr [[DOTOMP_SECTIONS_IV_]], align 4496// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]497// CHECK1:       omp.inner.for.cond:498// CHECK1-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 4499// CHECK1-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_UB_]], align 4500// CHECK1-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]501// CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]502// CHECK1:       omp.inner.for.body:503// CHECK1-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 4504// CHECK1-NEXT:    switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [505// CHECK1-NEXT:      i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]506// CHECK1-NEXT:      i32 1, label [[DOTOMP_SECTIONS_CASE1:%.*]]507// CHECK1-NEXT:    ]508// CHECK1:       .omp.sections.case:509// CHECK1-NEXT:    [[TMP9:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[TMP1]], i32 3)510// CHECK1-NEXT:    [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0511// CHECK1-NEXT:    br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]512// CHECK1:       .cancel.exit:513// CHECK1-NEXT:    br label [[CANCEL_EXIT:%.*]]514// CHECK1:       .cancel.continue:515// CHECK1-NEXT:    br label [[DOTOMP_SECTIONS_EXIT]]516// CHECK1:       .omp.sections.case1:517// CHECK1-NEXT:    [[TMP11:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[TMP1]], i32 3)518// CHECK1-NEXT:    [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0519// CHECK1-NEXT:    br i1 [[TMP12]], label [[DOTCANCEL_EXIT2:%.*]], label [[DOTCANCEL_CONTINUE3:%.*]]520// CHECK1:       .cancel.exit2:521// CHECK1-NEXT:    br label [[CANCEL_EXIT]]522// CHECK1:       .cancel.continue3:523// CHECK1-NEXT:    br label [[DOTOMP_SECTIONS_EXIT]]524// CHECK1:       .omp.sections.exit:525// CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]526// CHECK1:       omp.inner.for.inc:527// CHECK1-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 4528// CHECK1-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP13]], 1529// CHECK1-NEXT:    store i32 [[INC]], ptr [[DOTOMP_SECTIONS_IV_]], align 4530// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]531// CHECK1:       omp.inner.for.end:532// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB4]], i32 [[TMP1]])533// CHECK1-NEXT:    br label [[CANCEL_CONT:%.*]]534// CHECK1:       cancel.cont:535// CHECK1-NEXT:    ret void536// CHECK1:       cancel.exit:537// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB4]], i32 [[TMP1]])538// CHECK1-NEXT:    br label [[CANCEL_CONT]]539//540//541// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.3542// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[ARGC:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[R:%.*]]) #[[ATTR1]] {543// CHECK1-NEXT:  entry:544// CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8545// CHECK1-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8546// CHECK1-NEXT:    [[ARGC_ADDR:%.*]] = alloca ptr, align 8547// CHECK1-NEXT:    [[R_ADDR:%.*]] = alloca ptr, align 8548// CHECK1-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4549// CHECK1-NEXT:    [[TMP:%.*]] = alloca i32, align 4550// CHECK1-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4551// CHECK1-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4552// CHECK1-NEXT:    [[I:%.*]] = alloca i32, align 4553// CHECK1-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4554// CHECK1-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4555// CHECK1-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4556// CHECK1-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4557// CHECK1-NEXT:    [[R3:%.*]] = alloca i32, align 4558// CHECK1-NEXT:    [[I4:%.*]] = alloca i32, align 4559// CHECK1-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8560// CHECK1-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8561// CHECK1-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8562// CHECK1-NEXT:    store ptr [[ARGC]], ptr [[ARGC_ADDR]], align 8563// CHECK1-NEXT:    store ptr [[R]], ptr [[R_ADDR]], align 8564// CHECK1-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[ARGC_ADDR]], align 8565// CHECK1-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[R_ADDR]], align 8566// CHECK1-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4567// CHECK1-NEXT:    store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR_]], align 4568// CHECK1-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4569// CHECK1-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP3]], 0570// CHECK1-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1571// CHECK1-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1572// CHECK1-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4573// CHECK1-NEXT:    store i32 0, ptr [[I]], align 4574// CHECK1-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4575// CHECK1-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]576// CHECK1-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]577// CHECK1:       omp.precond.then:578// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4579// CHECK1-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4580// CHECK1-NEXT:    store i32 [[TMP5]], ptr [[DOTOMP_UB]], align 4581// CHECK1-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4582// CHECK1-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4583// CHECK1-NEXT:    store i32 0, ptr [[R3]], align 4584// CHECK1-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8585// CHECK1-NEXT:    [[TMP7:%.*]] = load i32, ptr [[TMP6]], align 4586// CHECK1-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB6]], i32 [[TMP7]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)587// CHECK1-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4588// CHECK1-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4589// CHECK1-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP8]], [[TMP9]]590// CHECK1-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]591// CHECK1:       cond.true:592// CHECK1-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4593// CHECK1-NEXT:    br label [[COND_END:%.*]]594// CHECK1:       cond.false:595// CHECK1-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4596// CHECK1-NEXT:    br label [[COND_END]]597// CHECK1:       cond.end:598// CHECK1-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP10]], [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]599// CHECK1-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4600// CHECK1-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4601// CHECK1-NEXT:    store i32 [[TMP12]], ptr [[DOTOMP_IV]], align 4602// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]603// CHECK1:       omp.inner.for.cond:604// CHECK1-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4605// CHECK1-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4606// CHECK1-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]607// CHECK1-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]608// CHECK1:       omp.inner.for.body:609// CHECK1-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4610// CHECK1-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1611// CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]612// CHECK1-NEXT:    store i32 [[ADD]], ptr [[I4]], align 4613// CHECK1-NEXT:    [[TMP16:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8614// CHECK1-NEXT:    [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 4615// CHECK1-NEXT:    [[TMP18:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[TMP17]], i32 2)616// CHECK1-NEXT:    [[TMP19:%.*]] = icmp ne i32 [[TMP18]], 0617// CHECK1-NEXT:    br i1 [[TMP19]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]618// CHECK1:       .cancel.exit:619// CHECK1-NEXT:    br label [[CANCEL_EXIT:%.*]]620// CHECK1:       .cancel.continue:621// CHECK1-NEXT:    [[TMP20:%.*]] = load i32, ptr [[I4]], align 4622// CHECK1-NEXT:    [[TMP21:%.*]] = load i32, ptr [[R3]], align 4623// CHECK1-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP21]], [[TMP20]]624// CHECK1-NEXT:    store i32 [[ADD7]], ptr [[R3]], align 4625// CHECK1-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]626// CHECK1:       omp.body.continue:627// CHECK1-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]628// CHECK1:       omp.inner.for.inc:629// CHECK1-NEXT:    [[TMP22:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4630// CHECK1-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP22]], 1631// CHECK1-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4632// CHECK1-NEXT:    br label [[OMP_INNER_FOR_COND]]633// CHECK1:       omp.inner.for.end:634// CHECK1-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]635// CHECK1:       omp.loop.exit:636// CHECK1-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8637// CHECK1-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 4638// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB6]], i32 [[TMP24]])639// CHECK1-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0640// CHECK1-NEXT:    store ptr [[R3]], ptr [[TMP25]], align 8641// CHECK1-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8642// CHECK1-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4643// CHECK1-NEXT:    [[TMP28:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB7:[0-9]+]], i32 [[TMP27]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.3.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)644// CHECK1-NEXT:    switch i32 [[TMP28]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [645// CHECK1-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]646// CHECK1-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]647// CHECK1-NEXT:    ]648// CHECK1:       .omp.reduction.case1:649// CHECK1-NEXT:    [[TMP29:%.*]] = load i32, ptr [[TMP1]], align 4650// CHECK1-NEXT:    [[TMP30:%.*]] = load i32, ptr [[R3]], align 4651// CHECK1-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP29]], [[TMP30]]652// CHECK1-NEXT:    store i32 [[ADD9]], ptr [[TMP1]], align 4653// CHECK1-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB7]], i32 [[TMP27]], ptr @.gomp_critical_user_.reduction.var)654// CHECK1-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]655// CHECK1:       cancel.exit:656// CHECK1-NEXT:    [[TMP31:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8657// CHECK1-NEXT:    [[TMP32:%.*]] = load i32, ptr [[TMP31]], align 4658// CHECK1-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB6]], i32 [[TMP32]])659// CHECK1-NEXT:    br label [[CANCEL_CONT:%.*]]660// CHECK1:       .omp.reduction.case2:661// CHECK1-NEXT:    [[TMP33:%.*]] = load i32, ptr [[R3]], align 4662// CHECK1-NEXT:    [[TMP34:%.*]] = atomicrmw add ptr [[TMP1]], i32 [[TMP33]] monotonic, align 4663// CHECK1-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]664// CHECK1:       .omp.reduction.default:665// CHECK1-NEXT:    br label [[OMP_PRECOND_END]]666// CHECK1:       omp.precond.end:667// CHECK1-NEXT:    br label [[CANCEL_CONT]]668// CHECK1:       cancel.cont:669// CHECK1-NEXT:    ret void670//671//672// CHECK1-LABEL: define {{[^@]+}}@main.omp_outlined.3.omp.reduction.reduction_func673// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR4]] {674// CHECK1-NEXT:  entry:675// CHECK1-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8676// CHECK1-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8677// CHECK1-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8678// CHECK1-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8679// CHECK1-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8680// CHECK1-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8681// CHECK1-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0682// CHECK1-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8683// CHECK1-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0684// CHECK1-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8685// CHECK1-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4686// CHECK1-NEXT:    [[TMP9:%.*]] = load i32, ptr [[TMP5]], align 4687// CHECK1-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]688// CHECK1-NEXT:    store i32 [[ADD]], ptr [[TMP7]], align 4689// CHECK1-NEXT:    ret void690//691//692// CHECK3-LABEL: define {{[^@]+}}@main693// CHECK3-SAME: (i32 noundef [[ARGC:%.*]], ptr noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] {694// CHECK3-NEXT:  entry:695// CHECK3-NEXT:    [[STRUCTARG:%.*]] = alloca { ptr, ptr }, align 8696// CHECK3-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4697// CHECK3-NEXT:    [[ARGC_ADDR:%.*]] = alloca i32, align 4698// CHECK3-NEXT:    [[ARGV_ADDR:%.*]] = alloca ptr, align 8699// CHECK3-NEXT:    [[P_LASTITER:%.*]] = alloca i32, align 4700// CHECK3-NEXT:    [[P_LOWERBOUND:%.*]] = alloca i32, align 4701// CHECK3-NEXT:    [[P_UPPERBOUND:%.*]] = alloca i32, align 4702// CHECK3-NEXT:    [[P_STRIDE:%.*]] = alloca i32, align 4703// CHECK3-NEXT:    [[P_LASTITER28:%.*]] = alloca i32, align 4704// CHECK3-NEXT:    [[P_LOWERBOUND29:%.*]] = alloca i32, align 4705// CHECK3-NEXT:    [[P_UPPERBOUND30:%.*]] = alloca i32, align 4706// CHECK3-NEXT:    [[P_STRIDE31:%.*]] = alloca i32, align 4707// CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4708// CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 4709// CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4710// CHECK3-NEXT:    [[DOTCAPTURE_EXPR_34:%.*]] = alloca i32, align 4711// CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 4712// CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4713// CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4714// CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4715// CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4716// CHECK3-NEXT:    [[I36:%.*]] = alloca i32, align 4717// CHECK3-NEXT:    [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1718// CHECK3-NEXT:    [[R:%.*]] = alloca i32, align 4719// CHECK3-NEXT:    store i32 0, ptr [[RETVAL]], align 4720// CHECK3-NEXT:    store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 4721// CHECK3-NEXT:    store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 8722// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])723// CHECK3-NEXT:    br label [[OMP_PARALLEL:%.*]]724// CHECK3:       omp_parallel:725// CHECK3-NEXT:    [[GEP_ARGC_ADDR:%.*]] = getelementptr { ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0726// CHECK3-NEXT:    store ptr [[ARGC_ADDR]], ptr [[GEP_ARGC_ADDR]], align 8727// CHECK3-NEXT:    [[GEP_ARGV_ADDR:%.*]] = getelementptr { ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1728// CHECK3-NEXT:    store ptr [[ARGV_ADDR]], ptr [[GEP_ARGV_ADDR]], align 8729// CHECK3-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @main..omp_par, ptr [[STRUCTARG]])730// CHECK3-NEXT:    br label [[OMP_PAR_OUTLINED_EXIT:%.*]]731// CHECK3:       omp.par.exit:732// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_PREHEADER:%.*]]733// CHECK3:       omp_section_loop.preheader:734// CHECK3-NEXT:    store i32 0, ptr [[P_LOWERBOUND]], align 4735// CHECK3-NEXT:    store i32 0, ptr [[P_UPPERBOUND]], align 4736// CHECK3-NEXT:    store i32 1, ptr [[P_STRIDE]], align 4737// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM11:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])738// CHECK3-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM11]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i32 1, i32 0)739// CHECK3-NEXT:    [[TMP0:%.*]] = load i32, ptr [[P_LOWERBOUND]], align 4740// CHECK3-NEXT:    [[TMP1:%.*]] = load i32, ptr [[P_UPPERBOUND]], align 4741// CHECK3-NEXT:    [[TMP2:%.*]] = sub i32 [[TMP1]], [[TMP0]]742// CHECK3-NEXT:    [[TMP3:%.*]] = add i32 [[TMP2]], 1743// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_HEADER:%.*]]744// CHECK3:       omp_section_loop.header:745// CHECK3-NEXT:    [[OMP_SECTION_LOOP_IV:%.*]] = phi i32 [ 0, [[OMP_SECTION_LOOP_PREHEADER]] ], [ [[OMP_SECTION_LOOP_NEXT:%.*]], [[OMP_SECTION_LOOP_INC:%.*]] ]746// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_COND:%.*]]747// CHECK3:       omp_section_loop.cond:748// CHECK3-NEXT:    [[OMP_SECTION_LOOP_CMP:%.*]] = icmp ult i32 [[OMP_SECTION_LOOP_IV]], [[TMP3]]749// CHECK3-NEXT:    br i1 [[OMP_SECTION_LOOP_CMP]], label [[OMP_SECTION_LOOP_BODY:%.*]], label [[OMP_SECTION_LOOP_EXIT:%.*]]750// CHECK3:       omp_section_loop.body:751// CHECK3-NEXT:    [[TMP4:%.*]] = add i32 [[OMP_SECTION_LOOP_IV]], [[TMP0]]752// CHECK3-NEXT:    [[TMP5:%.*]] = mul i32 [[TMP4]], 1753// CHECK3-NEXT:    [[TMP6:%.*]] = add i32 [[TMP5]], 0754// CHECK3-NEXT:    switch i32 [[TMP6]], label [[OMP_SECTION_LOOP_BODY_SECTIONS_AFTER:%.*]] [755// CHECK3-NEXT:      i32 0, label [[OMP_SECTION_LOOP_BODY_CASE:%.*]]756// CHECK3-NEXT:    ]757// CHECK3:       omp_section_loop.body.case:758// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM10:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])759// CHECK3-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM10]], i32 3)760// CHECK3-NEXT:    [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 0761// CHECK3-NEXT:    br i1 [[TMP8]], label [[OMP_SECTION_LOOP_BODY_CASE_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE_CNCL:%.*]]762// CHECK3:       omp_section_loop.body.case.split:763// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_BODY_CASE_SECTION_AFTER:%.*]]764// CHECK3:       omp_section_loop.body.case.section.after:765// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_BODY_SECTIONS_AFTER]]766// CHECK3:       omp_section_loop.body.sections.after:767// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_INC]]768// CHECK3:       omp_section_loop.inc:769// CHECK3-NEXT:    [[OMP_SECTION_LOOP_NEXT]] = add nuw i32 [[OMP_SECTION_LOOP_IV]], 1770// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_HEADER]]771// CHECK3:       omp_section_loop.exit:772// CHECK3-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM11]])773// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM12:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])774// CHECK3-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM12]])775// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_AFTER:%.*]]776// CHECK3:       omp_section_loop.after:777// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_PREHEADER16:%.*]]778// CHECK3:       omp_section_loop.preheader16:779// CHECK3-NEXT:    store i32 0, ptr [[P_LOWERBOUND29]], align 4780// CHECK3-NEXT:    store i32 1, ptr [[P_UPPERBOUND30]], align 4781// CHECK3-NEXT:    store i32 1, ptr [[P_STRIDE31]], align 4782// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM32:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])783// CHECK3-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM32]], i32 34, ptr [[P_LASTITER28]], ptr [[P_LOWERBOUND29]], ptr [[P_UPPERBOUND30]], ptr [[P_STRIDE31]], i32 1, i32 0)784// CHECK3-NEXT:    [[TMP9:%.*]] = load i32, ptr [[P_LOWERBOUND29]], align 4785// CHECK3-NEXT:    [[TMP10:%.*]] = load i32, ptr [[P_UPPERBOUND30]], align 4786// CHECK3-NEXT:    [[TMP11:%.*]] = sub i32 [[TMP10]], [[TMP9]]787// CHECK3-NEXT:    [[TMP12:%.*]] = add i32 [[TMP11]], 1788// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_HEADER17:%.*]]789// CHECK3:       omp_section_loop.header17:790// CHECK3-NEXT:    [[OMP_SECTION_LOOP_IV20:%.*]] = phi i32 [ 0, [[OMP_SECTION_LOOP_PREHEADER16]] ], [ [[OMP_SECTION_LOOP_NEXT22:%.*]], [[OMP_SECTION_LOOP_INC17:%.*]] ]791// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_COND18:%.*]]792// CHECK3:       omp_section_loop.cond18:793// CHECK3-NEXT:    [[OMP_SECTION_LOOP_CMP21:%.*]] = icmp ult i32 [[OMP_SECTION_LOOP_IV20]], [[TMP12]]794// CHECK3-NEXT:    br i1 [[OMP_SECTION_LOOP_CMP21]], label [[OMP_SECTION_LOOP_BODY19:%.*]], label [[OMP_SECTION_LOOP_EXIT21:%.*]]795// CHECK3:       omp_section_loop.body19:796// CHECK3-NEXT:    [[TMP13:%.*]] = add i32 [[OMP_SECTION_LOOP_IV20]], [[TMP9]]797// CHECK3-NEXT:    [[TMP14:%.*]] = mul i32 [[TMP13]], 1798// CHECK3-NEXT:    [[TMP15:%.*]] = add i32 [[TMP14]], 0799// CHECK3-NEXT:    switch i32 [[TMP15]], label [[OMP_SECTION_LOOP_BODY16_SECTIONS_AFTER:%.*]] [800// CHECK3-NEXT:      i32 0, label [[OMP_SECTION_LOOP_BODY_CASE26:%.*]]801// CHECK3-NEXT:      i32 1, label [[OMP_SECTION_LOOP_BODY_CASE29:%.*]]802// CHECK3-NEXT:    ]803// CHECK3:       omp_section_loop.body.case26:804// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM24:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])805// CHECK3-NEXT:    [[TMP16:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM24]], i32 3)806// CHECK3-NEXT:    [[TMP17:%.*]] = icmp eq i32 [[TMP16]], 0807// CHECK3-NEXT:    br i1 [[TMP17]], label [[OMP_SECTION_LOOP_BODY_CASE26_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE26_CNCL:%.*]]808// CHECK3:       omp_section_loop.body.case26.split:809// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_BODY_CASE26_SECTION_AFTER:%.*]]810// CHECK3:       omp_section_loop.body.case26.section.after:811// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_BODY16_SECTIONS_AFTER]]812// CHECK3:       omp_section_loop.body.case29:813// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM27:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])814// CHECK3-NEXT:    [[TMP18:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM27]], i32 3)815// CHECK3-NEXT:    [[TMP19:%.*]] = icmp eq i32 [[TMP18]], 0816// CHECK3-NEXT:    br i1 [[TMP19]], label [[OMP_SECTION_LOOP_BODY_CASE29_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE29_CNCL:%.*]]817// CHECK3:       omp_section_loop.body.case29.split:818// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_BODY_CASE25_SECTION_AFTER29:%.*]]819// CHECK3:       omp_section_loop.body.case29.section.after30:820// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_BODY_CASE29_SECTION_AFTER:%.*]]821// CHECK3:       omp_section_loop.body.case29.section.after:822// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_BODY19_SECTIONS_AFTER:.*]]823// CHECK3:       omp_section_loop.body19.sections.after:824// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_INC20:.*]]825// CHECK3:       omp_section_loop.inc20:826// CHECK3-NEXT:    [[OMP_SECTION_LOOP_NEXT22]] = add nuw i32 [[OMP_SECTION_LOOP_IV20]], 1827// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_HEADER17]]828// CHECK3:       omp_section_loop.exit21:829// CHECK3-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM32]])830// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM33:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])831// CHECK3-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM33]])832// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_AFTER22:%.*]]833// CHECK3:       omp_section_loop.after22:834// CHECK3-NEXT:    [[TMP20:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4835// CHECK3-NEXT:    store i32 [[TMP20]], ptr [[DOTCAPTURE_EXPR_]], align 4836// CHECK3-NEXT:    [[TMP21:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4837// CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP21]], 0838// CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1839// CHECK3-NEXT:    [[SUB35:%.*]] = sub nsw i32 [[DIV]], 1840// CHECK3-NEXT:    store i32 [[SUB35]], ptr [[DOTCAPTURE_EXPR_34]], align 4841// CHECK3-NEXT:    store i32 0, ptr [[I]], align 4842// CHECK3-NEXT:    [[TMP22:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4843// CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP22]]844// CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]845// CHECK3:       omp.precond.then:846// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4847// CHECK3-NEXT:    [[TMP23:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_34]], align 4848// CHECK3-NEXT:    store i32 [[TMP23]], ptr [[DOTOMP_UB]], align 4849// CHECK3-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4850// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4851// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM37:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB6:[0-9]+]])852// CHECK3-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB4:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM37]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)853// CHECK3-NEXT:    [[TMP24:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4854// CHECK3-NEXT:    [[TMP25:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_34]], align 4855// CHECK3-NEXT:    [[CMP38:%.*]] = icmp sgt i32 [[TMP24]], [[TMP25]]856// CHECK3-NEXT:    br i1 [[CMP38]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]857// CHECK3:       cond.true:858// CHECK3-NEXT:    [[TMP26:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_34]], align 4859// CHECK3-NEXT:    br label [[COND_END:%.*]]860// CHECK3:       cond.false:861// CHECK3-NEXT:    [[TMP27:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4862// CHECK3-NEXT:    br label [[COND_END]]863// CHECK3:       cond.end:864// CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP26]], [[COND_TRUE]] ], [ [[TMP27]], [[COND_FALSE]] ]865// CHECK3-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4866// CHECK3-NEXT:    [[TMP28:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4867// CHECK3-NEXT:    store i32 [[TMP28]], ptr [[DOTOMP_IV]], align 4868// CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]869// CHECK3:       omp.inner.for.cond:870// CHECK3-NEXT:    [[TMP29:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4871// CHECK3-NEXT:    [[TMP30:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4872// CHECK3-NEXT:    [[CMP39:%.*]] = icmp sle i32 [[TMP29]], [[TMP30]]873// CHECK3-NEXT:    br i1 [[CMP39]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]874// CHECK3:       omp.inner.for.body:875// CHECK3-NEXT:    [[TMP31:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4876// CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP31]], 1877// CHECK3-NEXT:    [[ADD40:%.*]] = add nsw i32 0, [[MUL]]878// CHECK3-NEXT:    store i32 [[ADD40]], ptr [[I36]], align 4879// CHECK3-NEXT:    [[TMP32:%.*]] = load float, ptr @flag, align 4880// CHECK3-NEXT:    [[TOBOOL41:%.*]] = fcmp une float [[TMP32]], 0.000000e+00881// CHECK3-NEXT:    br i1 [[TOBOOL41]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_ELSE:%.*]]882// CHECK3:       omp_if.then:883// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM42:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB8:[0-9]+]])884// CHECK3-NEXT:    [[TMP33:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM42]], i32 2)885// CHECK3-NEXT:    [[TMP34:%.*]] = icmp ne i32 [[TMP33]], 0886// CHECK3-NEXT:    br i1 [[TMP34]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]887// CHECK3:       .cancel.exit:888// CHECK3-NEXT:    br label [[CANCEL_EXIT:%.*]]889// CHECK3:       omp_section_loop.body.case.cncl:890// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_EXIT:.*]]891// CHECK3:       omp_section_loop.body.case26.cncl:892// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_EXIT18:.*]]893// CHECK3:       omp_section_loop.body.case29.cncl:894// CHECK3-NEXT:    br label [[OMP_SECTION_LOOP_EXIT21:.*]]895// CHECK3:       .cancel.continue:896// CHECK3-NEXT:    br label [[OMP_IF_END:%.*]]897// CHECK3:       omp_if.else:898// CHECK3-NEXT:    br label [[OMP_IF_END]]899// CHECK3:       omp_if.end:900// CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]901// CHECK3:       omp.body.continue:902// CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]903// CHECK3:       omp.inner.for.inc:904// CHECK3-NEXT:    [[TMP35:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4905// CHECK3-NEXT:    [[ADD43:%.*]] = add nsw i32 [[TMP35]], 1906// CHECK3-NEXT:    store i32 [[ADD43]], ptr [[DOTOMP_IV]], align 4907// CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]908// CHECK3:       omp.inner.for.end:909// CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]910// CHECK3:       omp.loop.exit:911// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM45:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB10:[0-9]+]])912// CHECK3-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM45]])913// CHECK3-NEXT:    br label [[OMP_PRECOND_END]]914// CHECK3:       cancel.exit:915// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM44:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB10]])916// CHECK3-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM44]])917// CHECK3-NEXT:    br label [[CANCEL_CONT:%.*]]918// CHECK3:       omp.precond.end:919// CHECK3-NEXT:    br label [[CANCEL_CONT]]920// CHECK3:       cancel.cont:921// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM46:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])922// CHECK3-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM46]])923// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM47:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB14:[0-9]+]])924// CHECK3-NEXT:    [[TMP36:%.*]] = call ptr @__kmpc_omp_task_alloc(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM47]], i32 1, i64 40, i64 1, ptr @.omp_task_entry.)925// CHECK3-NEXT:    [[TMP37:%.*]] = getelementptr inbounds nuw [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], ptr [[TMP36]], i32 0, i32 0926// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM48:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB14]])927// CHECK3-NEXT:    [[TMP38:%.*]] = call i32 @__kmpc_omp_task(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM48]], ptr [[TMP36]])928// CHECK3-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @main.omp_outlined)929// CHECK3-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 0, ptr @main.omp_outlined.1)930// CHECK3-NEXT:    store i32 0, ptr [[R]], align 4931// CHECK3-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 2, ptr @main.omp_outlined.2, ptr [[ARGC_ADDR]], ptr [[R]])932// CHECK3-NEXT:    [[TMP39:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4933// CHECK3-NEXT:    ret i32 [[TMP39]]934//935//936// CHECK3-LABEL: define {{[^@]+}}@main..omp_par937// CHECK3-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1:[0-9]+]] {938// CHECK3-NEXT:  omp.par.entry:939// CHECK3-NEXT:    [[GEP_ARGC_ADDR:%.*]] = getelementptr { ptr, ptr }, ptr [[TMP0]], i32 0, i32 0940// CHECK3-NEXT:    [[LOADGEP_ARGC_ADDR:%.*]] = load ptr, ptr [[GEP_ARGC_ADDR]], align 8941// CHECK3-NEXT:    [[GEP_ARGV_ADDR:%.*]] = getelementptr { ptr, ptr }, ptr [[TMP0]], i32 0, i32 1942// CHECK3-NEXT:    [[LOADGEP_ARGV_ADDR:%.*]] = load ptr, ptr [[GEP_ARGV_ADDR]], align 8943// CHECK3-NEXT:    [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4944// CHECK3-NEXT:    [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4945// CHECK3-NEXT:    store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4946// CHECK3-NEXT:    [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4947// CHECK3-NEXT:    br label [[OMP_PAR_REGION:%.*]]948// CHECK3:       omp.par.region:949// CHECK3-NEXT:    [[TMP2:%.*]] = load float, ptr @flag, align 4950// CHECK3-NEXT:    [[TOBOOL:%.*]] = fcmp une float [[TMP2]], 0.000000e+00951// CHECK3-NEXT:    br i1 [[TOBOOL]], label [[TMP14:%.*]], label [[TMP3:%.*]]952// CHECK3:       3:953// CHECK3-NEXT:    %[[GTN:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)954// CHECK3-NEXT:    %[[CANCEL_POINT:.*]] = call i32 @__kmpc_cancellationpoint(ptr @1, i32 %[[GTN]], i32 1)955// CHECK3-NEXT:    %[[COND:.*]] = icmp eq i32 %[[CANCEL_POINT]], 0956// CHECK3-NEXT:    br i1 %[[COND]], label %[[SPLIT:.*]], label %[[CNCL:.*]]957// CHECK3:       .cncl:958// CHECK3-NEXT:    br label %[[FINI:.*]]959// CHECK3:       .fini:960// CHECK3-NEXT:    br label %[[EXIT_STUB:omp.par.exit.exitStub]]961// CHECK3:       .split:962// CHECK3-NEXT:    br label [[TMP6:%.*]]963// CHECK3:       6:964// CHECK3-NEXT:    [[TMP5:%.*]] = load i32, ptr [[LOADGEP_ARGC_ADDR]], align 4965// CHECK3-NEXT:    [[CONV:%.*]] = trunc i32 [[TMP5]] to i8966// CHECK3-NEXT:    [[TMP6:%.*]] = load ptr, ptr [[LOADGEP_ARGV_ADDR]], align 8967// CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[TMP6]], i64 0968// CHECK3-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[ARRAYIDX]], align 8969// CHECK3-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i8, ptr [[TMP7]], i64 0970// CHECK3-NEXT:    store i8 [[CONV]], ptr [[ARRAYIDX3]], align 1971// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])972// CHECK3-NEXT:    [[TMP8:%.*]] = call i32 @__kmpc_cancel_barrier(ptr @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM4]])973// CHECK3-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 0974// CHECK3-NEXT:    br i1 [[TMP9]], label [[DOTCONT:%.*]], label [[DOTCNCL5:%.*]]975// CHECK3:       .cncl7:976// CHECK3-NEXT:    br label %[[FINI]]977// CHECK3:       .cont:978// CHECK3-NEXT:    [[TMP10:%.*]] = load i32, ptr [[LOADGEP_ARGC_ADDR]], align 4979// CHECK3-NEXT:    [[TMP11:%.*]] = load ptr, ptr [[LOADGEP_ARGV_ADDR]], align 8980// CHECK3-NEXT:    [[ARRAYIDX6:%.*]] = getelementptr inbounds ptr, ptr [[TMP11]], i64 0981// CHECK3-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[ARRAYIDX6]], align 8982// CHECK3-NEXT:    [[ARRAYIDX7:%.*]] = getelementptr inbounds i8, ptr [[TMP12]], i64 0983// CHECK3-NEXT:    [[TMP13:%.*]] = load i8, ptr [[ARRAYIDX7]], align 1984// CHECK3-NEXT:    [[CONV8:%.*]] = sext i8 [[TMP13]] to i32985// CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[CONV8]], [[TMP10]]986// CHECK3-NEXT:    [[CONV9:%.*]] = trunc i32 [[ADD]] to i8987// CHECK3-NEXT:    store i8 [[CONV9]], ptr [[ARRAYIDX7]], align 1988// CHECK3-NEXT:    br label [[OMP_PAR_REGION_PARALLEL_AFTER:%.*]]989// CHECK3:       omp.par.region.parallel.after:990// CHECK3-NEXT:    br label [[OMP_PAR_PRE_FINALIZE:%.*]]991// CHECK3:       omp.par.pre_finalize:992// CHECK3-NEXT:    br label %[[FINI]]993// CHECK3:       16:994// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])995// CHECK3-NEXT:    [[TMP15:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 1)996// CHECK3-NEXT:    [[TMP16:%.*]] = icmp eq i32 [[TMP15]], 0997// CHECK3-NEXT:    br i1 [[TMP16]], label [[DOTSPLIT:%.*]], label [[DOTCNCL:%.*]]998// CHECK3:       .cncl4:999// CHECK3-NEXT:    br label %[[FINI]]1000// CHECK3:       .split3:1001// CHECK3-NEXT:    br label {{.+}}1002// CHECK3:       omp.par.exit.exitStub:1003// CHECK3-NEXT:    ret void1004//1005//1006// CHECK3-LABEL: define {{[^@]+}}@.omp_task_entry.1007// CHECK3-SAME: (i32 noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {1008// CHECK3-NEXT:  entry:1009// CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 41010// CHECK3-NEXT:    [[DOTPART_ID__ADDR_I:%.*]] = alloca ptr, align 81011// CHECK3-NEXT:    [[DOTPRIVATES__ADDR_I:%.*]] = alloca ptr, align 81012// CHECK3-NEXT:    [[DOTCOPY_FN__ADDR_I:%.*]] = alloca ptr, align 81013// CHECK3-NEXT:    [[DOTTASK_T__ADDR_I:%.*]] = alloca ptr, align 81014// CHECK3-NEXT:    [[__CONTEXT_ADDR_I:%.*]] = alloca ptr, align 81015// CHECK3-NEXT:    [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 41016// CHECK3-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 41017// CHECK3-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 81018// CHECK3-NEXT:    store i32 [[TMP0]], ptr [[DOTADDR]], align 41019// CHECK3-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 81020// CHECK3-NEXT:    [[TMP2:%.*]] = load i32, ptr [[DOTADDR]], align 41021// CHECK3-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81022// CHECK3-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], ptr [[TMP3]], i32 0, i32 01023// CHECK3-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw [[STRUCT_KMP_TASK_T:%.*]], ptr [[TMP4]], i32 0, i32 21024// CHECK3-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[STRUCT_KMP_TASK_T]], ptr [[TMP4]], i32 0, i32 01025// CHECK3-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81026// CHECK3-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META3:![0-9]+]])1027// CHECK3-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META6:![0-9]+]])1028// CHECK3-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])1029// CHECK3-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])1030// CHECK3-NEXT:    store i32 [[TMP2]], ptr [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias [[META12:![0-9]+]]1031// CHECK3-NEXT:    store ptr [[TMP5]], ptr [[DOTPART_ID__ADDR_I]], align 8, !noalias [[META12]]1032// CHECK3-NEXT:    store ptr null, ptr [[DOTPRIVATES__ADDR_I]], align 8, !noalias [[META12]]1033// CHECK3-NEXT:    store ptr null, ptr [[DOTCOPY_FN__ADDR_I]], align 8, !noalias [[META12]]1034// CHECK3-NEXT:    store ptr [[TMP3]], ptr [[DOTTASK_T__ADDR_I]], align 8, !noalias [[META12]]1035// CHECK3-NEXT:    store ptr [[TMP7]], ptr [[__CONTEXT_ADDR_I]], align 8, !noalias [[META12]]1036// CHECK3-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[__CONTEXT_ADDR_I]], align 8, !noalias [[META12]]1037// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM_I:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB12:[0-9]+]])1038// CHECK3-NEXT:    [[TMP9:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM_I]], i32 4)1039// CHECK3-NEXT:    [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 01040// CHECK3-NEXT:    br i1 [[TMP10]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]]1041// CHECK3:       .cancel.exit.i:1042// CHECK3-NEXT:    store i32 1, ptr [[CLEANUP_DEST_SLOT_I]], align 4, !noalias [[META12]]1043// CHECK3-NEXT:    br label [[DOTOMP_OUTLINED__EXIT:%.*]]1044// CHECK3:       .cancel.continue.i:1045// CHECK3-NEXT:    store i32 0, ptr [[CLEANUP_DEST_SLOT_I]], align 4, !noalias [[META12]]1046// CHECK3-NEXT:    br label [[DOTOMP_OUTLINED__EXIT]]1047// CHECK3:       .omp_outlined..exit:1048// CHECK3-NEXT:    [[CLEANUP_DEST_I:%.*]] = load i32, ptr [[CLEANUP_DEST_SLOT_I]], align 4, !noalias [[META12]]1049// CHECK3-NEXT:    ret i32 01050//1051//1052// CHECK3-LABEL: define {{[^@]+}}@main.omp_outlined1053// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR5:[0-9]+]] {1054// CHECK3-NEXT:  entry:1055// CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81056// CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81057// CHECK3-NEXT:    [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 41058// CHECK3-NEXT:    [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 41059// CHECK3-NEXT:    [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 41060// CHECK3-NEXT:    [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 41061// CHECK3-NEXT:    [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 41062// CHECK3-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81063// CHECK3-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81064// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_LB_]], align 41065// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_UB_]], align 41066// CHECK3-NEXT:    store i32 1, ptr [[DOTOMP_SECTIONS_ST_]], align 41067// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_IL_]], align 41068// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB17:[0-9]+]])1069// CHECK3-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB15:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[DOTOMP_SECTIONS_IL_]], ptr [[DOTOMP_SECTIONS_LB_]], ptr [[DOTOMP_SECTIONS_UB_]], ptr [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)1070// CHECK3-NEXT:    [[TMP0:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_UB_]], align 41071// CHECK3-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[TMP0]], 01072// CHECK3-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[TMP0]], i32 01073// CHECK3-NEXT:    store i32 [[TMP2]], ptr [[DOTOMP_SECTIONS_UB_]], align 41074// CHECK3-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_LB_]], align 41075// CHECK3-NEXT:    store i32 [[TMP3]], ptr [[DOTOMP_SECTIONS_IV_]], align 41076// CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1077// CHECK3:       omp.inner.for.cond:1078// CHECK3-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 41079// CHECK3-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_UB_]], align 41080// CHECK3-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]1081// CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1082// CHECK3:       omp.inner.for.body:1083// CHECK3-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 41084// CHECK3-NEXT:    switch i32 [[TMP6]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [1085// CHECK3-NEXT:      i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]1086// CHECK3-NEXT:    ]1087// CHECK3:       .omp.sections.case:1088// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1089// CHECK3-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 3)1090// CHECK3-NEXT:    [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 01091// CHECK3-NEXT:    br i1 [[TMP8]], label [[DOTOMP_SECTIONS_CASE_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE_CNCL:%.*]]1092// CHECK3:       .omp.sections.case.split:1093// CHECK3-NEXT:    br label [[DOTOMP_SECTIONS_EXIT]]1094// CHECK3:       .omp.sections.case.cncl:1095// CHECK3-NEXT:    br label [[FINI:%.*]]1096// CHECK3:       .omp.sections.exit:1097// CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1098// CHECK3:       omp.inner.for.inc:1099// CHECK3-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 41100// CHECK3-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP9]], 11101// CHECK3-NEXT:    store i32 [[INC]], ptr [[DOTOMP_SECTIONS_IV_]], align 41102// CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]1103// CHECK3:       omp.inner.for.end:1104// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB19:[0-9]+]])1105// CHECK3-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM3]])1106// CHECK3-NEXT:    br label [[CANCEL_CONT:.*]]1107// CHECK3:       cancel.cont:1108// CHECK3-NEXT:    ret void1109// CHECK3:       cancel.exit:1110// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB19]])1111// CHECK3-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM2]])1112// CHECK3-NEXT:    br label [[CANCEL_CONT]]1113//1114//1115// CHECK3-LABEL: define {{[^@]+}}@main.omp_outlined.11116// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR5]] {1117// CHECK3-NEXT:  entry:1118// CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81119// CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81120// CHECK3-NEXT:    [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 41121// CHECK3-NEXT:    [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 41122// CHECK3-NEXT:    [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 41123// CHECK3-NEXT:    [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 41124// CHECK3-NEXT:    [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 41125// CHECK3-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81126// CHECK3-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81127// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_LB_]], align 41128// CHECK3-NEXT:    store i32 1, ptr [[DOTOMP_SECTIONS_UB_]], align 41129// CHECK3-NEXT:    store i32 1, ptr [[DOTOMP_SECTIONS_ST_]], align 41130// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_SECTIONS_IL_]], align 41131// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB21:[0-9]+]])1132// CHECK3-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[DOTOMP_SECTIONS_IL_]], ptr [[DOTOMP_SECTIONS_LB_]], ptr [[DOTOMP_SECTIONS_UB_]], ptr [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1)1133// CHECK3-NEXT:    [[TMP0:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_UB_]], align 41134// CHECK3-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[TMP0]], 11135// CHECK3-NEXT:    [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[TMP0]], i32 11136// CHECK3-NEXT:    store i32 [[TMP2]], ptr [[DOTOMP_SECTIONS_UB_]], align 41137// CHECK3-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_LB_]], align 41138// CHECK3-NEXT:    store i32 [[TMP3]], ptr [[DOTOMP_SECTIONS_IV_]], align 41139// CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1140// CHECK3:       omp.inner.for.cond:1141// CHECK3-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 41142// CHECK3-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_UB_]], align 41143// CHECK3-NEXT:    [[CMP:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]]1144// CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1145// CHECK3:       omp.inner.for.body:1146// CHECK3-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 41147// CHECK3-NEXT:    switch i32 [[TMP6]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [1148// CHECK3-NEXT:      i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]]1149// CHECK3-NEXT:      i32 1, label [[DOTOMP_SECTIONS_CASE2:%.*]]1150// CHECK3-NEXT:    ]1151// CHECK3:       .omp.sections.case:1152// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1153// CHECK3-NEXT:    [[TMP7:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 3)1154// CHECK3-NEXT:    [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 01155// CHECK3-NEXT:    br i1 [[TMP8]], label [[DOTOMP_SECTIONS_CASE_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE_CNCL:%.*]]1156// CHECK3:       .omp.sections.case.split:1157// CHECK3-NEXT:    br label [[DOTOMP_SECTIONS_EXIT]]1158// CHECK3:       .omp.sections.case.cncl:1159// CHECK3-NEXT:    br label [[DOTFINI:.%*]]1160// CHECK3:       .fini:1161// CHECK3-NEXT:    br label [[CANCEL_CONT:%.*]]1162// CHECK3:       .omp.sections.case2:1163// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1164// CHECK3-NEXT:    [[TMP9:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM3]], i32 3)1165// CHECK3-NEXT:    [[TMP10:%.*]] = icmp eq i32 [[TMP9]], 01166// CHECK3-NEXT:    br i1 [[TMP10]], label [[DOTOMP_SECTIONS_CASE2_SPLIT:%.*]], label [[DOTOMP_SECTIONS_CASE2_CNCL:%.*]]1167// CHECK3:       .omp.sections.case2.split:1168// CHECK3-NEXT:    br label [[DOTOMP_SECTIONS_CASE2_SECTION_AFTER:%.*]]1169// CHECK3:       .omp.sections.case2.section.after:1170// CHECK3-NEXT:    br label [[OMP_REGION_FINALIZE:.*]]1171// CHECK3:       omp_region.finalize:1172// CHECK3-NEXT:    br label [[OMP_SECTIONS_EXIT:.*]]1173// CHECK3:       .omp.sections.case2.cncl:1174// CHECK3-NEXT:    br label [[FINI:.*]]1175// CHECK3:       .omp.sections.exit:1176// CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1177// CHECK3:       omp.inner.for.inc:1178// CHECK3-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTOMP_SECTIONS_IV_]], align 41179// CHECK3-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP11]], 11180// CHECK3-NEXT:    store i32 [[INC]], ptr [[DOTOMP_SECTIONS_IV_]], align 41181// CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]1182// CHECK3:       omp.inner.for.end:1183// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM5:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB23:[0-9]+]])1184// CHECK3-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM5]])1185// CHECK3-NEXT:    br label [[CANCEL_CONT]]1186// CHECK3:       cancel.cont:1187// CHECK3-NEXT:    ret void1188// CHECK3:       cancel.exit:1189// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM4:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB23]])1190// CHECK3-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB15]], i32 [[OMP_GLOBAL_THREAD_NUM4]])1191// CHECK3-NEXT:    br label [[CANCEL_CONT]]1192//1193//1194// CHECK3-LABEL: define {{[^@]+}}@main.omp_outlined.21195// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[ARGC:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[R:%.*]]) #[[ATTR5]] {1196// CHECK3-NEXT:  entry:1197// CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81198// CHECK3-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81199// CHECK3-NEXT:    [[ARGC_ADDR:%.*]] = alloca ptr, align 81200// CHECK3-NEXT:    [[R_ADDR:%.*]] = alloca ptr, align 81201// CHECK3-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 41202// CHECK3-NEXT:    [[TMP:%.*]] = alloca i32, align 41203// CHECK3-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41204// CHECK3-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41205// CHECK3-NEXT:    [[I:%.*]] = alloca i32, align 41206// CHECK3-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 41207// CHECK3-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 41208// CHECK3-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41209// CHECK3-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41210// CHECK3-NEXT:    [[R3:%.*]] = alloca i32, align 41211// CHECK3-NEXT:    [[I4:%.*]] = alloca i32, align 41212// CHECK3-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 81213// CHECK3-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81214// CHECK3-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81215// CHECK3-NEXT:    store ptr [[ARGC]], ptr [[ARGC_ADDR]], align 81216// CHECK3-NEXT:    store ptr [[R]], ptr [[R_ADDR]], align 81217// CHECK3-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[ARGC_ADDR]], align 81218// CHECK3-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[R_ADDR]], align 81219// CHECK3-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 41220// CHECK3-NEXT:    store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR_]], align 41221// CHECK3-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41222// CHECK3-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP3]], 01223// CHECK3-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 11224// CHECK3-NEXT:    [[SUB2:%.*]] = sub nsw i32 [[DIV]], 11225// CHECK3-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41226// CHECK3-NEXT:    store i32 0, ptr [[I]], align 41227// CHECK3-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41228// CHECK3-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP4]]1229// CHECK3-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]1230// CHECK3:       omp.precond.then:1231// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 41232// CHECK3-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41233// CHECK3-NEXT:    store i32 [[TMP5]], ptr [[DOTOMP_UB]], align 41234// CHECK3-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41235// CHECK3-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41236// CHECK3-NEXT:    store i32 0, ptr [[R3]], align 41237// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB25:[0-9]+]])1238// CHECK3-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1239// CHECK3-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41240// CHECK3-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41241// CHECK3-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP6]], [[TMP7]]1242// CHECK3-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1243// CHECK3:       cond.true:1244// CHECK3-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41245// CHECK3-NEXT:    br label [[COND_END:%.*]]1246// CHECK3:       cond.false:1247// CHECK3-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41248// CHECK3-NEXT:    br label [[COND_END]]1249// CHECK3:       cond.end:1250// CHECK3-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP8]], [[COND_TRUE]] ], [ [[TMP9]], [[COND_FALSE]] ]1251// CHECK3-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 41252// CHECK3-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41253// CHECK3-NEXT:    store i32 [[TMP10]], ptr [[DOTOMP_IV]], align 41254// CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1255// CHECK3:       omp.inner.for.cond:1256// CHECK3-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41257// CHECK3-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41258// CHECK3-NEXT:    [[CMP6:%.*]] = icmp sle i32 [[TMP11]], [[TMP12]]1259// CHECK3-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1260// CHECK3:       omp.inner.for.body:1261// CHECK3-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41262// CHECK3-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP13]], 11263// CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]1264// CHECK3-NEXT:    store i32 [[ADD]], ptr [[I4]], align 41265// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM7:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB27:[0-9]+]])1266// CHECK3-NEXT:    [[TMP14:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM7]], i32 2)1267// CHECK3-NEXT:    [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 01268// CHECK3-NEXT:    br i1 [[TMP15]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]]1269// CHECK3:       .cancel.exit:1270// CHECK3-NEXT:    br label [[CANCEL_EXIT:%.*]]1271// CHECK3:       .cancel.continue:1272// CHECK3-NEXT:    [[TMP16:%.*]] = load i32, ptr [[I4]], align 41273// CHECK3-NEXT:    [[TMP17:%.*]] = load i32, ptr [[R3]], align 41274// CHECK3-NEXT:    [[ADD8:%.*]] = add nsw i32 [[TMP17]], [[TMP16]]1275// CHECK3-NEXT:    store i32 [[ADD8]], ptr [[R3]], align 41276// CHECK3-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]1277// CHECK3:       omp.body.continue:1278// CHECK3-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1279// CHECK3:       omp.inner.for.inc:1280// CHECK3-NEXT:    [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41281// CHECK3-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP18]], 11282// CHECK3-NEXT:    store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 41283// CHECK3-NEXT:    br label [[OMP_INNER_FOR_COND]]1284// CHECK3:       omp.inner.for.end:1285// CHECK3-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1286// CHECK3:       omp.loop.exit:1287// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM11:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB29:[0-9]+]])1288// CHECK3-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM11]])1289// CHECK3-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01290// CHECK3-NEXT:    store ptr [[R3]], ptr [[TMP19]], align 81291// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM12:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB29]])1292// CHECK3-NEXT:    [[TMP20:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB30:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM12]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @main.omp_outlined.2.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1293// CHECK3-NEXT:    switch i32 [[TMP20]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1294// CHECK3-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1295// CHECK3-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1296// CHECK3-NEXT:    ]1297// CHECK3:       .omp.reduction.case1:1298// CHECK3-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP1]], align 41299// CHECK3-NEXT:    [[TMP22:%.*]] = load i32, ptr [[R3]], align 41300// CHECK3-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP21]], [[TMP22]]1301// CHECK3-NEXT:    store i32 [[ADD13]], ptr [[TMP1]], align 41302// CHECK3-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB30]], i32 [[OMP_GLOBAL_THREAD_NUM12]], ptr @.gomp_critical_user_.reduction.var)1303// CHECK3-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1304// CHECK3:       cancel.exit:1305// CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM10:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB29]])1306// CHECK3-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB4]], i32 [[OMP_GLOBAL_THREAD_NUM10]])1307// CHECK3-NEXT:    br label [[CANCEL_CONT:%.*]]1308// CHECK3:       .omp.reduction.case2:1309// CHECK3-NEXT:    [[TMP23:%.*]] = load i32, ptr [[R3]], align 41310// CHECK3-NEXT:    [[TMP24:%.*]] = atomicrmw add ptr [[TMP1]], i32 [[TMP23]] monotonic, align 41311// CHECK3-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1312// CHECK3:       .omp.reduction.default:1313// CHECK3-NEXT:    br label [[OMP_PRECOND_END]]1314// CHECK3:       omp.precond.end:1315// CHECK3-NEXT:    br label [[CANCEL_CONT]]1316// CHECK3:       cancel.cont:1317// CHECK3-NEXT:    ret void1318//1319//1320// CHECK3-LABEL: define {{[^@]+}}@main.omp_outlined.2.omp.reduction.reduction_func1321// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR4]] {1322// CHECK3-NEXT:  entry:1323// CHECK3-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 81324// CHECK3-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 81325// CHECK3-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 81326// CHECK3-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 81327// CHECK3-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81328// CHECK3-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81329// CHECK3-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 01330// CHECK3-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81331// CHECK3-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 01332// CHECK3-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81333// CHECK3-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41334// CHECK3-NEXT:    [[TMP9:%.*]] = load i32, ptr [[TMP5]], align 41335// CHECK3-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP8]], [[TMP9]]1336// CHECK3-NEXT:    store i32 [[ADD]], ptr [[TMP7]], align 41337// CHECK3-NEXT:    ret void1338//1339