brintos

brintos / llvm-project-archived public Read only

0
0
Text · 42.5 KiB · c8a6863 Raw
711 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --check-globals --include-generated-funcs --replace-value-regex "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _ --global-value-regex ".omp.reduction..internal[a-zA-Z_0-9.]+"2// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fopenmp -fopenmp-version=60 -x c++ -std=c++17  -emit-llvm %s -o - | FileCheck %s3// expected-no-diagnostics4#define N 105class Sum {6  int val;7 8public:9  Sum(int v = 0) : val(v) {}10  Sum operator+(const Sum &rhs) const { return Sum(val + rhs.val); }11  Sum &operator+=(const Sum &rhs) {12    val += rhs.val;13    return *this;14  }15};16#pragma omp declare reduction(sum_reduction:Sum : omp_out += omp_in)           \17    initializer(omp_priv = Sum(0))18 19void func_red() {20  Sum result(0);21  Sum array[N];22 23  for (int i = 0; i < N; i++) {24    array[i] = Sum(i);25  }26 27#pragma omp parallel private(result) num_threads(4)28  {29#pragma omp for reduction(sum_reduction : result)30    for (int i = 0; i < N; i++) {31      result = result + array[i];32    }33  }34}35 36void do_red(int n, int *v, int &sum_v) {37  sum_v = 0;38#pragma omp for reduction(original(private), + : sum_v)39  for (int i = 0; i < n; i++) {40    sum_v += v[i];41  }42}43void do_red_extended(int n, int *v, int &sum_v, int &prod_v) {44  sum_v = 0;45  prod_v = 1;46 47#pragma omp for reduction(original(private), + : sum_v)                        \48    reduction(original(private), * : prod_v)49  for (int i = 0; i < n; i++) {50    sum_v += v[i];51    prod_v *= v[i];52  }53}54int main(void) {55  int v[N];56  for (int i = 0; i < N; i++)57    v[i] = i;58#pragma omp parallel num_threads(4)59  {60    int s_v;61    do_red(N, v, s_v);62  }63 64  int sum_v_ext = 0, prod_v_ext = 1;65#pragma omp parallel num_threads(4)66  {67    do_red_extended(N, v, sum_v_ext, prod_v_ext);68  }69  return 0;70}71 72//.73// CHECK: @.omp.reduction..internal_pivate_.result.result_996 = common global %class.Sum zeroinitializer, align 474// CHECK: @.omp.reduction..internal_pivate_.sum_v.sum_v_1188 = common global i32 0, align 475// CHECK: @.omp.reduction..internal_pivate_.sum_v.sum_v_1392 = common global i32 0, align 476// CHECK: @.omp.reduction..internal_pivate_.prod_v.prod_v_1461 = common global i32 0, align 477//.78// CHECK-LABEL: define {{[^@]+}}@_Z8func_redv79// CHECK-SAME: () #[[ATTR0:[0-9]+]] {80// CHECK-NEXT:  entry:81// CHECK-NEXT:    [[RESULT:%.*]] = alloca [[CLASS_SUM:%.*]], align 482// CHECK-NEXT:    [[ARRAY:%.*]] = alloca [10 x %class.Sum], align 1683// CHECK-NEXT:    [[I:%.*]] = alloca i32, align 484// CHECK-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_SUM]], align 485// CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB3:[0-9]+]])86// CHECK-NEXT:    call void @_ZN3SumC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[RESULT]], i32 noundef 0)87// CHECK-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [10 x %class.Sum], ptr [[ARRAY]], i32 0, i32 088// CHECK-NEXT:    [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_SUM]], ptr [[ARRAY_BEGIN]], i64 1089// CHECK-NEXT:    br label [[ARRAYCTOR_LOOP:%.*]]90// CHECK:       arrayctor.loop:91// CHECK-NEXT:    [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ]92// CHECK-NEXT:    call void @_ZN3SumC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]], i32 noundef 0)93// CHECK-NEXT:    [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_SUM]], ptr [[ARRAYCTOR_CUR]], i64 194// CHECK-NEXT:    [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]]95// CHECK-NEXT:    br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]]96// CHECK:       arrayctor.cont:97// CHECK-NEXT:    store i32 0, ptr [[I]], align 498// CHECK-NEXT:    br label [[FOR_COND:%.*]]99// CHECK:       for.cond:100// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[I]], align 4101// CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[TMP1]], 10102// CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]103// CHECK:       for.body:104// CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[I]], align 4105// CHECK-NEXT:    call void @_ZN3SumC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[REF_TMP]], i32 noundef [[TMP2]])106// CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[I]], align 4107// CHECK-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP3]] to i64108// CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x %class.Sum], ptr [[ARRAY]], i64 0, i64 [[IDXPROM]]109// CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ARRAYIDX]], ptr align 4 [[REF_TMP]], i64 4, i1 false)110// CHECK-NEXT:    br label [[FOR_INC:%.*]]111// CHECK:       for.inc:112// CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[I]], align 4113// CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP4]], 1114// CHECK-NEXT:    store i32 [[INC]], ptr [[I]], align 4115// CHECK-NEXT:    br label [[FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]]116// CHECK:       for.end:117// CHECK-NEXT:    call void @__kmpc_push_num_threads(ptr @[[GLOB3]], i32 [[TMP0]], i32 4)118// CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @_Z8func_redv.omp_outlined, ptr [[ARRAY]])119// CHECK-NEXT:    ret void120//121//122// CHECK-LABEL: define {{[^@]+}}@_ZN3SumC1Ei123// CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[V:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 {124// CHECK-NEXT:  entry:125// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8126// CHECK-NEXT:    [[V_ADDR:%.*]] = alloca i32, align 4127// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8128// CHECK-NEXT:    store i32 [[V]], ptr [[V_ADDR]], align 4129// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8130// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[V_ADDR]], align 4131// CHECK-NEXT:    call void @_ZN3SumC2Ei(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]], i32 noundef [[TMP0]])132// CHECK-NEXT:    ret void133//134//135// CHECK-LABEL: define {{[^@]+}}@_Z8func_redv.omp_outlined136// CHECK-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(40) [[ARRAY:%.*]]) #[[ATTR2:[0-9]+]] {137// CHECK-NEXT:  entry:138// CHECK-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8139// CHECK-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8140// CHECK-NEXT:    [[ARRAY_ADDR:%.*]] = alloca ptr, align 8141// CHECK-NEXT:    [[RESULT:%.*]] = alloca [[CLASS_SUM:%.*]], align 4142// CHECK-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4143// CHECK-NEXT:    [[TMP:%.*]] = alloca i32, align 4144// CHECK-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4145// CHECK-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4146// CHECK-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4147// CHECK-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4148// CHECK-NEXT:    [[RESULT1:%.*]] = alloca [[CLASS_SUM]], align 4149// CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4150// CHECK-NEXT:    [[REF_TMP:%.*]] = alloca [[CLASS_SUM]], align 4151// CHECK-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [0 x ptr], align 8152// CHECK-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8153// CHECK-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8154// CHECK-NEXT:    store ptr [[ARRAY]], ptr [[ARRAY_ADDR]], align 8155// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[ARRAY_ADDR]], align 8156// CHECK-NEXT:    call void @_ZN3SumC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[RESULT]], i32 noundef 0)157// CHECK-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4158// CHECK-NEXT:    store i32 9, ptr [[DOTOMP_UB]], align 4159// CHECK-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4160// CHECK-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4161// CHECK-NEXT:    call void @.omp_initializer.(ptr noundef [[RESULT1]], ptr noundef [[RESULT]])162// CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8163// CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4164// CHECK-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP2]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)165// CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4166// CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 9167// CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]168// CHECK:       cond.true:169// CHECK-NEXT:    br label [[COND_END:%.*]]170// CHECK:       cond.false:171// CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4172// CHECK-NEXT:    br label [[COND_END]]173// CHECK:       cond.end:174// CHECK-NEXT:    [[COND:%.*]] = phi i32 [ 9, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]175// CHECK-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4176// CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4177// CHECK-NEXT:    store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 4178// CHECK-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]179// CHECK:       omp.inner.for.cond:180// CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4181// CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4182// CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]183// CHECK-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]184// CHECK:       omp.inner.for.body:185// CHECK-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4186// CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP8]], 1187// CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]188// CHECK-NEXT:    store i32 [[ADD]], ptr [[I]], align 4189// CHECK-NEXT:    [[TMP9:%.*]] = load i32, ptr [[I]], align 4190// CHECK-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP9]] to i64191// CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x %class.Sum], ptr [[TMP0]], i64 0, i64 [[IDXPROM]]192// CHECK-NEXT:    [[CALL:%.*]] = call i32 @_ZNK3SumplERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[RESULT1]], ptr noundef nonnull align 4 dereferenceable(4) [[ARRAYIDX]])193// CHECK-NEXT:    [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[CLASS_SUM]], ptr [[REF_TMP]], i32 0, i32 0194// CHECK-NEXT:    store i32 [[CALL]], ptr [[COERCE_DIVE]], align 4195// CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[RESULT1]], ptr align 4 [[REF_TMP]], i64 4, i1 false)196// CHECK-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]197// CHECK:       omp.body.continue:198// CHECK-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]199// CHECK:       omp.inner.for.inc:200// CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4201// CHECK-NEXT:    [[ADD3:%.*]] = add nsw i32 [[TMP10]], 1202// CHECK-NEXT:    store i32 [[ADD3]], ptr [[DOTOMP_IV]], align 4203// CHECK-NEXT:    br label [[OMP_INNER_FOR_COND]]204// CHECK:       omp.inner.for.end:205// CHECK-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]206// CHECK:       omp.loop.exit:207// CHECK-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])208// CHECK-NEXT:    [[TMP11:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2:[0-9]+]], i32 [[TMP2]], i32 0, i64 0, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z8func_redv.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)209// CHECK-NEXT:    switch i32 [[TMP11]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [210// CHECK-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]211// CHECK-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]212// CHECK-NEXT:    ]213// CHECK:       .omp.reduction.case1:214// CHECK-NEXT:    call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP2]], ptr @.gomp_critical_user_.reduction.var)215// CHECK-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]216// CHECK:       .omp.reduction.case2:217// CHECK-NEXT:    call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP2]], ptr @.gomp_critical_user_.reduction.var)218// CHECK-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]219// CHECK:       .omp.reduction.default:220// CHECK-NEXT:    [[TMP12:%.*]] = icmp eq i32 [[TMP2]], 0221// CHECK-NEXT:    br i1 [[TMP12]], label [[INIT:%.*]], label [[INIT_END:%.*]]222// CHECK:       init:223// CHECK-NEXT:    call void @_ZN3SumC1Ei(ptr noundef nonnull align 4 dereferenceable(4) @.omp.reduction..internal_pivate_.result.result_996, i32 noundef 0)224// CHECK-NEXT:    br label [[INIT_END]]225// CHECK:       init.end:226// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])227// CHECK-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP2]], ptr @.gomp_critical_user_.reduction_critical.var)228// CHECK-NEXT:    call void @.omp_combiner.(ptr noundef @.omp.reduction..internal_pivate_.result.result_996, ptr noundef [[RESULT1]])229// CHECK-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP2]], ptr @.gomp_critical_user_.reduction_critical.var)230// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])231// CHECK-NEXT:    [[TMP13:%.*]] = load [[CLASS_SUM]], ptr @.omp.reduction..internal_pivate_.result.result_996, align 4232// CHECK-NEXT:    store [[CLASS_SUM]] [[TMP13]], ptr [[RESULT1]], align 4233// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])234// CHECK-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP2]], ptr @.gomp_critical_user_.reduction_critical.var)235// CHECK-NEXT:    call void @.omp_combiner.(ptr noundef [[RESULT]], ptr noundef [[RESULT1]])236// CHECK-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP2]], ptr @.gomp_critical_user_.reduction_critical.var)237// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB4:[0-9]+]], i32 [[TMP2]])238// CHECK-NEXT:    ret void239//240//241// CHECK-LABEL: define {{[^@]+}}@.omp_combiner.242// CHECK-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR3:[0-9]+]] {243// CHECK-NEXT:  entry:244// CHECK-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8245// CHECK-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8246// CHECK-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8247// CHECK-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8248// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 8249// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8250// CHECK-NEXT:    [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN3SumpLERKS_(ptr noundef nonnull align 4 dereferenceable(4) [[TMP3]], ptr noundef nonnull align 4 dereferenceable(4) [[TMP2]])251// CHECK-NEXT:    ret void252//253//254// CHECK-LABEL: define {{[^@]+}}@_ZN3SumpLERKS_255// CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[RHS:%.*]]) #[[ATTR0]] comdat align 2 {256// CHECK-NEXT:  entry:257// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8258// CHECK-NEXT:    [[RHS_ADDR:%.*]] = alloca ptr, align 8259// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8260// CHECK-NEXT:    store ptr [[RHS]], ptr [[RHS_ADDR]], align 8261// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8262// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[RHS_ADDR]], align 8263// CHECK-NEXT:    [[VAL:%.*]] = getelementptr inbounds nuw [[CLASS_SUM:%.*]], ptr [[TMP0]], i32 0, i32 0264// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[VAL]], align 4265// CHECK-NEXT:    [[VAL2:%.*]] = getelementptr inbounds nuw [[CLASS_SUM]], ptr [[THIS1]], i32 0, i32 0266// CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[VAL2]], align 4267// CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP2]], [[TMP1]]268// CHECK-NEXT:    store i32 [[ADD]], ptr [[VAL2]], align 4269// CHECK-NEXT:    ret ptr [[THIS1]]270//271//272// CHECK-LABEL: define {{[^@]+}}@.omp_initializer.273// CHECK-SAME: (ptr noalias noundef [[TMP0:%.*]], ptr noalias noundef [[TMP1:%.*]]) #[[ATTR3]] {274// CHECK-NEXT:  entry:275// CHECK-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8276// CHECK-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8277// CHECK-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8278// CHECK-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8279// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR1]], align 8280// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8281// CHECK-NEXT:    call void @_ZN3SumC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[TMP3]], i32 noundef 0)282// CHECK-NEXT:    ret void283//284//285// CHECK-LABEL: define {{[^@]+}}@_ZNK3SumplERKS_286// CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[RHS:%.*]]) #[[ATTR0]] comdat align 2 {287// CHECK-NEXT:  entry:288// CHECK-NEXT:    [[RETVAL:%.*]] = alloca [[CLASS_SUM:%.*]], align 4289// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8290// CHECK-NEXT:    [[RHS_ADDR:%.*]] = alloca ptr, align 8291// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8292// CHECK-NEXT:    store ptr [[RHS]], ptr [[RHS_ADDR]], align 8293// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8294// CHECK-NEXT:    [[VAL:%.*]] = getelementptr inbounds nuw [[CLASS_SUM]], ptr [[THIS1]], i32 0, i32 0295// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[VAL]], align 4296// CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RHS_ADDR]], align 8297// CHECK-NEXT:    [[VAL2:%.*]] = getelementptr inbounds nuw [[CLASS_SUM]], ptr [[TMP1]], i32 0, i32 0298// CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[VAL2]], align 4299// CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], [[TMP2]]300// CHECK-NEXT:    call void @_ZN3SumC1Ei(ptr noundef nonnull align 4 dereferenceable(4) [[RETVAL]], i32 noundef [[ADD]])301// CHECK-NEXT:    [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[CLASS_SUM]], ptr [[RETVAL]], i32 0, i32 0302// CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[COERCE_DIVE]], align 4303// CHECK-NEXT:    ret i32 [[TMP3]]304//305//306// CHECK-LABEL: define {{[^@]+}}@_Z8func_redv.omp_outlined.omp.reduction.reduction_func307// CHECK-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR5:[0-9]+]] {308// CHECK-NEXT:  entry:309// CHECK-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8310// CHECK-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8311// CHECK-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8312// CHECK-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8313// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8314// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8315// CHECK-NEXT:    ret void316//317//318// CHECK-LABEL: define {{[^@]+}}@_ZN3SumC2Ei319// CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[V:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 {320// CHECK-NEXT:  entry:321// CHECK-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8322// CHECK-NEXT:    [[V_ADDR:%.*]] = alloca i32, align 4323// CHECK-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8324// CHECK-NEXT:    store i32 [[V]], ptr [[V_ADDR]], align 4325// CHECK-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8326// CHECK-NEXT:    [[VAL:%.*]] = getelementptr inbounds nuw [[CLASS_SUM:%.*]], ptr [[THIS1]], i32 0, i32 0327// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[V_ADDR]], align 4328// CHECK-NEXT:    store i32 [[TMP0]], ptr [[VAL]], align 4329// CHECK-NEXT:    ret void330//331//332// CHECK-LABEL: define {{[^@]+}}@_Z6do_rediPiRi333// CHECK-SAME: (i32 noundef [[N:%.*]], ptr noundef [[V:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SUM_V:%.*]]) #[[ATTR0]] {334// CHECK-NEXT:  entry:335// CHECK-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4336// CHECK-NEXT:    [[V_ADDR:%.*]] = alloca ptr, align 8337// CHECK-NEXT:    [[SUM_V_ADDR:%.*]] = alloca ptr, align 8338// CHECK-NEXT:    [[TMP:%.*]] = alloca ptr, align 8339// CHECK-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4340// CHECK-NEXT:    [[_TMP1:%.*]] = alloca i32, align 4341// CHECK-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4342// CHECK-NEXT:    [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4343// CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4344// CHECK-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4345// CHECK-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4346// CHECK-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4347// CHECK-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4348// CHECK-NEXT:    [[SUM_V4:%.*]] = alloca i32, align 4349// CHECK-NEXT:    [[_TMP5:%.*]] = alloca ptr, align 8350// CHECK-NEXT:    [[I6:%.*]] = alloca i32, align 4351// CHECK-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [0 x ptr], align 8352// CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB3]])353// CHECK-NEXT:    store i32 [[N]], ptr [[N_ADDR]], align 4354// CHECK-NEXT:    store ptr [[V]], ptr [[V_ADDR]], align 8355// CHECK-NEXT:    store ptr [[SUM_V]], ptr [[SUM_V_ADDR]], align 8356// CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[SUM_V_ADDR]], align 8357// CHECK-NEXT:    store i32 0, ptr [[TMP1]], align 4358// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[SUM_V_ADDR]], align 8359// CHECK-NEXT:    store ptr [[TMP2]], ptr [[TMP]], align 8360// CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[N_ADDR]], align 4361// CHECK-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4362// CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4363// CHECK-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP4]], 0364// CHECK-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1365// CHECK-NEXT:    [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1366// CHECK-NEXT:    store i32 [[SUB3]], ptr [[DOTCAPTURE_EXPR_2]], align 4367// CHECK-NEXT:    store i32 0, ptr [[I]], align 4368// CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4369// CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP5]]370// CHECK-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]371// CHECK:       omp.precond.then:372// CHECK-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4373// CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4374// CHECK-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4375// CHECK-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4376// CHECK-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4377// CHECK-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP]], align 8378// CHECK-NEXT:    store i32 0, ptr [[SUM_V4]], align 4379// CHECK-NEXT:    store ptr [[SUM_V4]], ptr [[_TMP5]], align 8380// CHECK-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP0]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)381// CHECK-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4382// CHECK-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4383// CHECK-NEXT:    [[CMP7:%.*]] = icmp sgt i32 [[TMP8]], [[TMP9]]384// CHECK-NEXT:    br i1 [[CMP7]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]385// CHECK:       cond.true:386// CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4387// CHECK-NEXT:    br label [[COND_END:%.*]]388// CHECK:       cond.false:389// CHECK-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4390// CHECK-NEXT:    br label [[COND_END]]391// CHECK:       cond.end:392// CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP10]], [[COND_TRUE]] ], [ [[TMP11]], [[COND_FALSE]] ]393// CHECK-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4394// CHECK-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4395// CHECK-NEXT:    store i32 [[TMP12]], ptr [[DOTOMP_IV]], align 4396// CHECK-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]397// CHECK:       omp.inner.for.cond:398// CHECK-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4399// CHECK-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4400// CHECK-NEXT:    [[CMP8:%.*]] = icmp sle i32 [[TMP13]], [[TMP14]]401// CHECK-NEXT:    br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]402// CHECK:       omp.inner.for.body:403// CHECK-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4404// CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP15]], 1405// CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]406// CHECK-NEXT:    store i32 [[ADD]], ptr [[I6]], align 4407// CHECK-NEXT:    [[TMP16:%.*]] = load ptr, ptr [[V_ADDR]], align 8408// CHECK-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I6]], align 4409// CHECK-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP17]] to i64410// CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP16]], i64 [[IDXPROM]]411// CHECK-NEXT:    [[TMP18:%.*]] = load i32, ptr [[ARRAYIDX]], align 4412// CHECK-NEXT:    [[TMP19:%.*]] = load ptr, ptr [[_TMP5]], align 8413// CHECK-NEXT:    [[TMP20:%.*]] = load i32, ptr [[TMP19]], align 4414// CHECK-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP20]], [[TMP18]]415// CHECK-NEXT:    store i32 [[ADD9]], ptr [[TMP19]], align 4416// CHECK-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]417// CHECK:       omp.body.continue:418// CHECK-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]419// CHECK:       omp.inner.for.inc:420// CHECK-NEXT:    [[TMP21:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4421// CHECK-NEXT:    [[ADD10:%.*]] = add nsw i32 [[TMP21]], 1422// CHECK-NEXT:    store i32 [[ADD10]], ptr [[DOTOMP_IV]], align 4423// CHECK-NEXT:    br label [[OMP_INNER_FOR_COND]]424// CHECK:       omp.inner.for.end:425// CHECK-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]426// CHECK:       omp.loop.exit:427// CHECK-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP0]])428// CHECK-NEXT:    [[TMP22:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP0]], i32 0, i64 0, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z6do_rediPiRi.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)429// CHECK-NEXT:    switch i32 [[TMP22]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [430// CHECK-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]431// CHECK-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]432// CHECK-NEXT:    ]433// CHECK:       .omp.reduction.case1:434// CHECK-NEXT:    call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction.var)435// CHECK-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]436// CHECK:       .omp.reduction.case2:437// CHECK-NEXT:    call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction.var)438// CHECK-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]439// CHECK:       .omp.reduction.default:440// CHECK-NEXT:    [[TMP23:%.*]] = icmp eq i32 [[TMP0]], 0441// CHECK-NEXT:    br i1 [[TMP23]], label [[INIT:%.*]], label [[INIT_END:%.*]]442// CHECK:       init:443// CHECK-NEXT:    store i32 0, ptr @.omp.reduction..internal_pivate_.sum_v.sum_v_1188, align 4444// CHECK-NEXT:    br label [[INIT_END]]445// CHECK:       init.end:446// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])447// CHECK-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction_critical.var)448// CHECK-NEXT:    [[TMP24:%.*]] = load i32, ptr @.omp.reduction..internal_pivate_.sum_v.sum_v_1188, align 4449// CHECK-NEXT:    [[TMP25:%.*]] = load i32, ptr [[SUM_V4]], align 4450// CHECK-NEXT:    [[ADD11:%.*]] = add nsw i32 [[TMP24]], [[TMP25]]451// CHECK-NEXT:    store i32 [[ADD11]], ptr @.omp.reduction..internal_pivate_.sum_v.sum_v_1188, align 4452// CHECK-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction_critical.var)453// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])454// CHECK-NEXT:    [[TMP26:%.*]] = load i32, ptr @.omp.reduction..internal_pivate_.sum_v.sum_v_1188, align 4455// CHECK-NEXT:    store i32 [[TMP26]], ptr [[SUM_V4]], align 4456// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])457// CHECK-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction_critical.var)458// CHECK-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP7]], align 4459// CHECK-NEXT:    [[TMP28:%.*]] = load i32, ptr [[SUM_V4]], align 4460// CHECK-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP27]], [[TMP28]]461// CHECK-NEXT:    store i32 [[ADD12]], ptr [[TMP7]], align 4462// CHECK-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction_critical.var)463// CHECK-NEXT:    br label [[OMP_PRECOND_END]]464// CHECK:       omp.precond.end:465// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP0]])466// CHECK-NEXT:    ret void467//468//469// CHECK-LABEL: define {{[^@]+}}@_Z6do_rediPiRi.omp.reduction.reduction_func470// CHECK-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR5]] {471// CHECK-NEXT:  entry:472// CHECK-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8473// CHECK-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8474// CHECK-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8475// CHECK-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8476// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8477// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8478// CHECK-NEXT:    ret void479//480//481// CHECK-LABEL: define {{[^@]+}}@_Z15do_red_extendediPiRiS0_482// CHECK-SAME: (i32 noundef [[N:%.*]], ptr noundef [[V:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[SUM_V:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[PROD_V:%.*]]) #[[ATTR0]] {483// CHECK-NEXT:  entry:484// CHECK-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4485// CHECK-NEXT:    [[V_ADDR:%.*]] = alloca ptr, align 8486// CHECK-NEXT:    [[SUM_V_ADDR:%.*]] = alloca ptr, align 8487// CHECK-NEXT:    [[PROD_V_ADDR:%.*]] = alloca ptr, align 8488// CHECK-NEXT:    [[TMP:%.*]] = alloca ptr, align 8489// CHECK-NEXT:    [[_TMP1:%.*]] = alloca ptr, align 8490// CHECK-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4491// CHECK-NEXT:    [[_TMP2:%.*]] = alloca i32, align 4492// CHECK-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4493// CHECK-NEXT:    [[DOTCAPTURE_EXPR_3:%.*]] = alloca i32, align 4494// CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4495// CHECK-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4496// CHECK-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4497// CHECK-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4498// CHECK-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4499// CHECK-NEXT:    [[SUM_V5:%.*]] = alloca i32, align 4500// CHECK-NEXT:    [[_TMP6:%.*]] = alloca ptr, align 8501// CHECK-NEXT:    [[PROD_V7:%.*]] = alloca i32, align 4502// CHECK-NEXT:    [[_TMP8:%.*]] = alloca ptr, align 8503// CHECK-NEXT:    [[I9:%.*]] = alloca i32, align 4504// CHECK-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [0 x ptr], align 8505// CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB3]])506// CHECK-NEXT:    store i32 [[N]], ptr [[N_ADDR]], align 4507// CHECK-NEXT:    store ptr [[V]], ptr [[V_ADDR]], align 8508// CHECK-NEXT:    store ptr [[SUM_V]], ptr [[SUM_V_ADDR]], align 8509// CHECK-NEXT:    store ptr [[PROD_V]], ptr [[PROD_V_ADDR]], align 8510// CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[SUM_V_ADDR]], align 8511// CHECK-NEXT:    store i32 0, ptr [[TMP1]], align 4512// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[PROD_V_ADDR]], align 8513// CHECK-NEXT:    store i32 1, ptr [[TMP2]], align 4514// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[SUM_V_ADDR]], align 8515// CHECK-NEXT:    store ptr [[TMP3]], ptr [[TMP]], align 8516// CHECK-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[PROD_V_ADDR]], align 8517// CHECK-NEXT:    store ptr [[TMP4]], ptr [[_TMP1]], align 8518// CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[N_ADDR]], align 4519// CHECK-NEXT:    store i32 [[TMP5]], ptr [[DOTCAPTURE_EXPR_]], align 4520// CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4521// CHECK-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP6]], 0522// CHECK-NEXT:    [[DIV:%.*]] = sdiv i32 [[SUB]], 1523// CHECK-NEXT:    [[SUB4:%.*]] = sub nsw i32 [[DIV]], 1524// CHECK-NEXT:    store i32 [[SUB4]], ptr [[DOTCAPTURE_EXPR_3]], align 4525// CHECK-NEXT:    store i32 0, ptr [[I]], align 4526// CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4527// CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 0, [[TMP7]]528// CHECK-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]529// CHECK:       omp.precond.then:530// CHECK-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4531// CHECK-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_3]], align 4532// CHECK-NEXT:    store i32 [[TMP8]], ptr [[DOTOMP_UB]], align 4533// CHECK-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4534// CHECK-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4535// CHECK-NEXT:    [[TMP9:%.*]] = load ptr, ptr [[TMP]], align 8536// CHECK-NEXT:    store i32 0, ptr [[SUM_V5]], align 4537// CHECK-NEXT:    store ptr [[SUM_V5]], ptr [[_TMP6]], align 8538// CHECK-NEXT:    [[TMP10:%.*]] = load ptr, ptr [[_TMP1]], align 8539// CHECK-NEXT:    store i32 1, ptr [[PROD_V7]], align 4540// CHECK-NEXT:    store ptr [[PROD_V7]], ptr [[_TMP8]], align 8541// CHECK-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP0]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)542// CHECK-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4543// CHECK-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_3]], align 4544// CHECK-NEXT:    [[CMP10:%.*]] = icmp sgt i32 [[TMP11]], [[TMP12]]545// CHECK-NEXT:    br i1 [[CMP10]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]546// CHECK:       cond.true:547// CHECK-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_3]], align 4548// CHECK-NEXT:    br label [[COND_END:%.*]]549// CHECK:       cond.false:550// CHECK-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4551// CHECK-NEXT:    br label [[COND_END]]552// CHECK:       cond.end:553// CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ]554// CHECK-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4555// CHECK-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4556// CHECK-NEXT:    store i32 [[TMP15]], ptr [[DOTOMP_IV]], align 4557// CHECK-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]558// CHECK:       omp.inner.for.cond:559// CHECK-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4560// CHECK-NEXT:    [[TMP17:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4561// CHECK-NEXT:    [[CMP11:%.*]] = icmp sle i32 [[TMP16]], [[TMP17]]562// CHECK-NEXT:    br i1 [[CMP11]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]563// CHECK:       omp.inner.for.body:564// CHECK-NEXT:    [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4565// CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP18]], 1566// CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]567// CHECK-NEXT:    store i32 [[ADD]], ptr [[I9]], align 4568// CHECK-NEXT:    [[TMP19:%.*]] = load ptr, ptr [[V_ADDR]], align 8569// CHECK-NEXT:    [[TMP20:%.*]] = load i32, ptr [[I9]], align 4570// CHECK-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP20]] to i64571// CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP19]], i64 [[IDXPROM]]572// CHECK-NEXT:    [[TMP21:%.*]] = load i32, ptr [[ARRAYIDX]], align 4573// CHECK-NEXT:    [[TMP22:%.*]] = load ptr, ptr [[_TMP6]], align 8574// CHECK-NEXT:    [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4575// CHECK-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP23]], [[TMP21]]576// CHECK-NEXT:    store i32 [[ADD12]], ptr [[TMP22]], align 4577// CHECK-NEXT:    [[TMP24:%.*]] = load ptr, ptr [[V_ADDR]], align 8578// CHECK-NEXT:    [[TMP25:%.*]] = load i32, ptr [[I9]], align 4579// CHECK-NEXT:    [[IDXPROM13:%.*]] = sext i32 [[TMP25]] to i64580// CHECK-NEXT:    [[ARRAYIDX14:%.*]] = getelementptr inbounds i32, ptr [[TMP24]], i64 [[IDXPROM13]]581// CHECK-NEXT:    [[TMP26:%.*]] = load i32, ptr [[ARRAYIDX14]], align 4582// CHECK-NEXT:    [[TMP27:%.*]] = load ptr, ptr [[_TMP8]], align 8583// CHECK-NEXT:    [[TMP28:%.*]] = load i32, ptr [[TMP27]], align 4584// CHECK-NEXT:    [[MUL15:%.*]] = mul nsw i32 [[TMP28]], [[TMP26]]585// CHECK-NEXT:    store i32 [[MUL15]], ptr [[TMP27]], align 4586// CHECK-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]587// CHECK:       omp.body.continue:588// CHECK-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]589// CHECK:       omp.inner.for.inc:590// CHECK-NEXT:    [[TMP29:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4591// CHECK-NEXT:    [[ADD16:%.*]] = add nsw i32 [[TMP29]], 1592// CHECK-NEXT:    store i32 [[ADD16]], ptr [[DOTOMP_IV]], align 4593// CHECK-NEXT:    br label [[OMP_INNER_FOR_COND]]594// CHECK:       omp.inner.for.end:595// CHECK-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]596// CHECK:       omp.loop.exit:597// CHECK-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP0]])598// CHECK-NEXT:    [[TMP30:%.*]] = call i32 @__kmpc_reduce(ptr @[[GLOB2]], i32 [[TMP0]], i32 0, i64 0, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z15do_red_extendediPiRiS0_.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)599// CHECK-NEXT:    switch i32 [[TMP30]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [600// CHECK-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]601// CHECK-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]602// CHECK-NEXT:    ]603// CHECK:       .omp.reduction.case1:604// CHECK-NEXT:    call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction.var)605// CHECK-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]606// CHECK:       .omp.reduction.case2:607// CHECK-NEXT:    call void @__kmpc_end_reduce(ptr @[[GLOB2]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction.var)608// CHECK-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]609// CHECK:       .omp.reduction.default:610// CHECK-NEXT:    [[TMP31:%.*]] = icmp eq i32 [[TMP0]], 0611// CHECK-NEXT:    br i1 [[TMP31]], label [[INIT:%.*]], label [[INIT_END:%.*]]612// CHECK:       init:613// CHECK-NEXT:    store i32 0, ptr @.omp.reduction..internal_pivate_.sum_v.sum_v_1392, align 4614// CHECK-NEXT:    br label [[INIT_END]]615// CHECK:       init.end:616// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])617// CHECK-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction_critical.var)618// CHECK-NEXT:    [[TMP32:%.*]] = load i32, ptr @.omp.reduction..internal_pivate_.sum_v.sum_v_1392, align 4619// CHECK-NEXT:    [[TMP33:%.*]] = load i32, ptr [[SUM_V5]], align 4620// CHECK-NEXT:    [[ADD17:%.*]] = add nsw i32 [[TMP32]], [[TMP33]]621// CHECK-NEXT:    store i32 [[ADD17]], ptr @.omp.reduction..internal_pivate_.sum_v.sum_v_1392, align 4622// CHECK-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction_critical.var)623// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])624// CHECK-NEXT:    [[TMP34:%.*]] = load i32, ptr @.omp.reduction..internal_pivate_.sum_v.sum_v_1392, align 4625// CHECK-NEXT:    store i32 [[TMP34]], ptr [[SUM_V5]], align 4626// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])627// CHECK-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction_critical.var)628// CHECK-NEXT:    [[TMP35:%.*]] = load i32, ptr [[TMP9]], align 4629// CHECK-NEXT:    [[TMP36:%.*]] = load i32, ptr [[SUM_V5]], align 4630// CHECK-NEXT:    [[ADD18:%.*]] = add nsw i32 [[TMP35]], [[TMP36]]631// CHECK-NEXT:    store i32 [[ADD18]], ptr [[TMP9]], align 4632// CHECK-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction_critical.var)633// CHECK-NEXT:    [[TMP37:%.*]] = icmp eq i32 [[TMP0]], 0634// CHECK-NEXT:    br i1 [[TMP37]], label [[INIT19:%.*]], label [[INIT_END20:%.*]]635// CHECK:       init19:636// CHECK-NEXT:    store i32 1, ptr @.omp.reduction..internal_pivate_.prod_v.prod_v_1461, align 4637// CHECK-NEXT:    br label [[INIT_END20]]638// CHECK:       init.end20:639// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])640// CHECK-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction_critical.var)641// CHECK-NEXT:    [[TMP38:%.*]] = load i32, ptr @.omp.reduction..internal_pivate_.prod_v.prod_v_1461, align 4642// CHECK-NEXT:    [[TMP39:%.*]] = load i32, ptr [[PROD_V7]], align 4643// CHECK-NEXT:    [[MUL21:%.*]] = mul nsw i32 [[TMP38]], [[TMP39]]644// CHECK-NEXT:    store i32 [[MUL21]], ptr @.omp.reduction..internal_pivate_.prod_v.prod_v_1461, align 4645// CHECK-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction_critical.var)646// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])647// CHECK-NEXT:    [[TMP40:%.*]] = load i32, ptr @.omp.reduction..internal_pivate_.prod_v.prod_v_1461, align 4648// CHECK-NEXT:    store i32 [[TMP40]], ptr [[PROD_V7]], align 4649// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP0]])650// CHECK-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction_critical.var)651// CHECK-NEXT:    [[TMP41:%.*]] = load i32, ptr [[TMP10]], align 4652// CHECK-NEXT:    [[TMP42:%.*]] = load i32, ptr [[PROD_V7]], align 4653// CHECK-NEXT:    [[MUL22:%.*]] = mul nsw i32 [[TMP41]], [[TMP42]]654// CHECK-NEXT:    store i32 [[MUL22]], ptr [[TMP10]], align 4655// CHECK-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP0]], ptr @.gomp_critical_user_.reduction_critical.var)656// CHECK-NEXT:    br label [[OMP_PRECOND_END]]657// CHECK:       omp.precond.end:658// CHECK-NEXT:    call void @__kmpc_barrier(ptr @[[GLOB4]], i32 [[TMP0]])659// CHECK-NEXT:    ret void660//661//662// CHECK-LABEL: define {{[^@]+}}@_Z15do_red_extendediPiRiS0_.omp.reduction.reduction_func663// CHECK-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR5]] {664// CHECK-NEXT:  entry:665// CHECK-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8666// CHECK-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8667// CHECK-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8668// CHECK-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8669// CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8670// CHECK-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8671// CHECK-NEXT:    ret void672//673//674// CHECK-LABEL: define {{[^@]+}}@main675// CHECK-SAME: () #[[ATTR7:[0-9]+]] {676// CHECK-NEXT:  entry:677// CHECK-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4678// CHECK-NEXT:    [[V:%.*]] = alloca [10 x i32], align 16679// CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4680// CHECK-NEXT:    [[SUM_V_EXT:%.*]] = alloca i32, align 4681// CHECK-NEXT:    [[PROD_V_EXT:%.*]] = alloca i32, align 4682// CHECK-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB3]])683// CHECK-NEXT:    store i32 0, ptr [[RETVAL]], align 4684// CHECK-NEXT:    store i32 0, ptr [[I]], align 4685// CHECK-NEXT:    br label [[FOR_COND:%.*]]686// CHECK:       for.cond:687// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[I]], align 4688// CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[TMP1]], 10689// CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]690// CHECK:       for.body:691// CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[I]], align 4692// CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[I]], align 4693// CHECK-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP3]] to i64694// CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], ptr [[V]], i64 0, i64 [[IDXPROM]]695// CHECK-NEXT:    store i32 [[TMP2]], ptr [[ARRAYIDX]], align 4696// CHECK-NEXT:    br label [[FOR_INC:%.*]]697// CHECK:       for.inc:698// CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[I]], align 4699// CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP4]], 1700// CHECK-NEXT:    store i32 [[INC]], ptr [[I]], align 4701// CHECK-NEXT:    br label [[FOR_COND]], !llvm.loop [[LOOP7:![0-9]+]]702// CHECK:       for.end:703// CHECK-NEXT:    call void @__kmpc_push_num_threads(ptr @[[GLOB3]], i32 [[TMP0]], i32 4)704// CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 1, ptr @main.omp_outlined, ptr [[V]])705// CHECK-NEXT:    store i32 0, ptr [[SUM_V_EXT]], align 4706// CHECK-NEXT:    store i32 1, ptr [[PROD_V_EXT]], align 4707// CHECK-NEXT:    call void @__kmpc_push_num_threads(ptr @[[GLOB3]], i32 [[TMP0]], i32 4)708// CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @main.omp_outlined.1, ptr [[V]], ptr [[SUM_V_EXT]], ptr [[PROD_V_EXT]])709// CHECK-NEXT:    ret i32 0710 711