brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.3 KiB · 85dcae2 Raw
417 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 -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm %s -o - | FileCheck %s --check-prefix=IR3 4// Check same results after serialization round-trip5// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-pch -o %t %s6// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -include-pch %t -emit-llvm %s -o - | FileCheck %s --check-prefix=IR-PCH7 8// expected-no-diagnostics9 10#ifndef HEADER11#define HEADER12int foo() {13  int i;14  int j;15  int sum[10][10];16 17  #pragma omp teams loop reduction(+:sum) collapse(2) bind(parallel) \18      order(concurrent) lastprivate(j)19  for(i=0; i<10; i++)20    for(j=0; j<10; j++)21      sum[i][j] += i;22 23  return 0;24}25#endif26// IR-LABEL: define {{[^@]+}}@_Z3foov27// IR-SAME: () #[[ATTR0:[0-9]+]] {28// IR-NEXT:  entry:29// IR-NEXT:    [[I:%.*]] = alloca i32, align 430// IR-NEXT:    [[J:%.*]] = alloca i32, align 431// IR-NEXT:    [[SUM:%.*]] = alloca [10 x [10 x i32]], align 1632// IR-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3:[0-9]+]], i32 2, ptr @_Z3foov.omp_outlined, ptr [[J]], ptr [[SUM]])33// IR-NEXT:    ret i32 034//35//36// IR-LABEL: define {{[^@]+}}@_Z3foov.omp_outlined37// IR-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[J:%.*]], ptr noundef nonnull align 4 dereferenceable(400) [[SUM:%.*]]) #[[ATTR1:[0-9]+]] {38// IR-NEXT:  entry:39// IR-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 840// IR-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 841// IR-NEXT:    [[J_ADDR:%.*]] = alloca ptr, align 842// IR-NEXT:    [[SUM_ADDR:%.*]] = alloca ptr, align 843// IR-NEXT:    [[SUM1:%.*]] = alloca [10 x [10 x i32]], align 1644// IR-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 445// IR-NEXT:    [[TMP:%.*]] = alloca i32, align 446// IR-NEXT:    [[_TMP2:%.*]] = alloca i32, align 447// IR-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 448// IR-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 449// IR-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 450// IR-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 451// IR-NEXT:    [[J3:%.*]] = alloca i32, align 452// IR-NEXT:    [[I:%.*]] = alloca i32, align 453// IR-NEXT:    [[J4:%.*]] = alloca i32, align 454// IR-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 855// IR-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 856// IR-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 857// IR-NEXT:    store ptr [[J]], ptr [[J_ADDR]], align 858// IR-NEXT:    store ptr [[SUM]], ptr [[SUM_ADDR]], align 859// IR-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[J_ADDR]], align 860// IR-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[SUM_ADDR]], align 861// IR-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [10 x [10 x i32]], ptr [[SUM1]], i32 0, i32 0, i32 062// IR-NEXT:    [[TMP2:%.*]] = getelementptr i32, ptr [[ARRAY_BEGIN]], i64 10063// IR-NEXT:    [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP2]]64// IR-NEXT:    br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]65// IR:       omp.arrayinit.body:66// IR-NEXT:    [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]67// IR-NEXT:    store i32 0, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 468// IR-NEXT:    [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 169// IR-NEXT:    [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP2]]70// IR-NEXT:    br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]71// IR:       omp.arrayinit.done:72// IR-NEXT:    store i32 0, ptr [[DOTOMP_COMB_LB]], align 473// IR-NEXT:    store i32 99, ptr [[DOTOMP_COMB_UB]], align 474// IR-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 475// IR-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 476// IR-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 877// IR-NEXT:    [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 478// IR-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP4]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)79// IR-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 480// IR-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 9981// IR-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]82// IR:       cond.true:83// IR-NEXT:    br label [[COND_END:%.*]]84// IR:       cond.false:85// IR-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 486// IR-NEXT:    br label [[COND_END]]87// IR:       cond.end:88// IR-NEXT:    [[COND:%.*]] = phi i32 [ 99, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]89// IR-NEXT:    store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 490// IR-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 491// IR-NEXT:    store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 492// IR-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]93// IR:       omp.inner.for.cond:94// IR-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 495// IR-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 496// IR-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]97// IR-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]98// IR:       omp.inner.for.body:99// IR-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4100// IR-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP10]], 10101// IR-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV]], 1102// IR-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]103// IR-NEXT:    store i32 [[ADD]], ptr [[I]], align 4104// IR-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4105// IR-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4106// IR-NEXT:    [[DIV6:%.*]] = sdiv i32 [[TMP12]], 10107// IR-NEXT:    [[MUL7:%.*]] = mul nsw i32 [[DIV6]], 10108// IR-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP11]], [[MUL7]]109// IR-NEXT:    [[MUL8:%.*]] = mul nsw i32 [[SUB]], 1110// IR-NEXT:    [[ADD9:%.*]] = add nsw i32 0, [[MUL8]]111// IR-NEXT:    store i32 [[ADD9]], ptr [[J3]], align 4112// IR-NEXT:    [[TMP13:%.*]] = load i32, ptr [[I]], align 4113// IR-NEXT:    [[TMP14:%.*]] = load i32, ptr [[I]], align 4114// IR-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP14]] to i64115// IR-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x [10 x i32]], ptr [[SUM1]], i64 0, i64 [[IDXPROM]]116// IR-NEXT:    [[TMP15:%.*]] = load i32, ptr [[J3]], align 4117// IR-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP15]] to i64118// IR-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds [10 x i32], ptr [[ARRAYIDX]], i64 0, i64 [[IDXPROM10]]119// IR-NEXT:    [[TMP16:%.*]] = load i32, ptr [[ARRAYIDX11]], align 4120// IR-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP16]], [[TMP13]]121// IR-NEXT:    store i32 [[ADD12]], ptr [[ARRAYIDX11]], align 4122// IR-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]123// IR:       omp.body.continue:124// IR-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]125// IR:       omp.inner.for.inc:126// IR-NEXT:    [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4127// IR-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP17]], 1128// IR-NEXT:    store i32 [[ADD13]], ptr [[DOTOMP_IV]], align 4129// IR-NEXT:    br label [[OMP_INNER_FOR_COND]]130// IR:       omp.inner.for.end:131// IR-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]132// IR:       omp.loop.exit:133// IR-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8134// IR-NEXT:    [[TMP19:%.*]] = load i32, ptr [[TMP18]], align 4135// IR-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP19]])136// IR-NEXT:    [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4137// IR-NEXT:    [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0138// IR-NEXT:    br i1 [[TMP21]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]139// IR:       .omp.lastprivate.then:140// IR-NEXT:    store i32 10, ptr [[J3]], align 4141// IR-NEXT:    [[TMP22:%.*]] = load i32, ptr [[J3]], align 4142// IR-NEXT:    store i32 [[TMP22]], ptr [[TMP0]], align 4143// IR-NEXT:    br label [[DOTOMP_LASTPRIVATE_DONE]]144// IR:       .omp.lastprivate.done:145// IR-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0146// IR-NEXT:    store ptr [[SUM1]], ptr [[TMP23]], align 8147// IR-NEXT:    [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8148// IR-NEXT:    [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4149// IR-NEXT:    [[TMP26:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2:[0-9]+]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3foov.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)150// IR-NEXT:    switch i32 [[TMP26]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [151// IR-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]152// IR-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]153// IR-NEXT:    ]154// IR:       .omp.reduction.case1:155// IR-NEXT:    [[TMP27:%.*]] = getelementptr i32, ptr [[TMP1]], i64 100156// IR-NEXT:    [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP1]], [[TMP27]]157// IR-NEXT:    br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE18:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]158// IR:       omp.arraycpy.body:159// IR-NEXT:    [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[SUM1]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]160// IR-NEXT:    [[OMP_ARRAYCPY_DESTELEMENTPAST14:%.*]] = phi ptr [ [[TMP1]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT16:%.*]], [[OMP_ARRAYCPY_BODY]] ]161// IR-NEXT:    [[TMP28:%.*]] = load i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST14]], align 4162// IR-NEXT:    [[TMP29:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 4163// IR-NEXT:    [[ADD15:%.*]] = add nsw i32 [[TMP28]], [[TMP29]]164// IR-NEXT:    store i32 [[ADD15]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST14]], align 4165// IR-NEXT:    [[OMP_ARRAYCPY_DEST_ELEMENT16]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST14]], i32 1166// IR-NEXT:    [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1167// IR-NEXT:    [[OMP_ARRAYCPY_DONE17:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT16]], [[TMP27]]168// IR-NEXT:    br i1 [[OMP_ARRAYCPY_DONE17]], label [[OMP_ARRAYCPY_DONE18]], label [[OMP_ARRAYCPY_BODY]]169// IR:       omp.arraycpy.done18:170// IR-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)171// IR-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]172// IR:       .omp.reduction.case2:173// IR-NEXT:    [[TMP30:%.*]] = getelementptr i32, ptr [[TMP1]], i64 100174// IR-NEXT:    [[OMP_ARRAYCPY_ISEMPTY19:%.*]] = icmp eq ptr [[TMP1]], [[TMP30]]175// IR-NEXT:    br i1 [[OMP_ARRAYCPY_ISEMPTY19]], label [[OMP_ARRAYCPY_DONE26:%.*]], label [[OMP_ARRAYCPY_BODY20:%.*]]176// IR:       omp.arraycpy.body20:177// IR-NEXT:    [[OMP_ARRAYCPY_SRCELEMENTPAST21:%.*]] = phi ptr [ [[SUM1]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT24:%.*]], [[OMP_ARRAYCPY_BODY20]] ]178// IR-NEXT:    [[OMP_ARRAYCPY_DESTELEMENTPAST22:%.*]] = phi ptr [ [[TMP1]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT23:%.*]], [[OMP_ARRAYCPY_BODY20]] ]179// IR-NEXT:    [[TMP31:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST21]], align 4180// IR-NEXT:    [[TMP32:%.*]] = atomicrmw add ptr [[OMP_ARRAYCPY_DESTELEMENTPAST22]], i32 [[TMP31]] monotonic, align 4181// IR-NEXT:    [[OMP_ARRAYCPY_DEST_ELEMENT23]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST22]], i32 1182// IR-NEXT:    [[OMP_ARRAYCPY_SRC_ELEMENT24]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST21]], i32 1183// IR-NEXT:    [[OMP_ARRAYCPY_DONE25:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT23]], [[TMP30]]184// IR-NEXT:    br i1 [[OMP_ARRAYCPY_DONE25]], label [[OMP_ARRAYCPY_DONE26]], label [[OMP_ARRAYCPY_BODY20]]185// IR:       omp.arraycpy.done26:186// IR-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]187// IR:       .omp.reduction.default:188// IR-NEXT:    ret void189//190//191// IR-LABEL: define {{[^@]+}}@_Z3foov.omp_outlined.omp.reduction.reduction_func192// IR-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR3:[0-9]+]] {193// IR-NEXT:  entry:194// IR-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8195// IR-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8196// IR-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8197// IR-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8198// IR-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8199// IR-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8200// IR-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0201// IR-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8202// IR-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0203// IR-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8204// IR-NEXT:    [[TMP8:%.*]] = getelementptr i32, ptr [[TMP7]], i64 100205// IR-NEXT:    [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]206// IR-NEXT:    br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]207// IR:       omp.arraycpy.body:208// IR-NEXT:    [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]209// IR-NEXT:    [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]210// IR-NEXT:    [[TMP9:%.*]] = load i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4211// IR-NEXT:    [[TMP10:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 4212// IR-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]213// IR-NEXT:    store i32 [[ADD]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4214// IR-NEXT:    [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1215// IR-NEXT:    [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1216// IR-NEXT:    [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]217// IR-NEXT:    br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]218// IR:       omp.arraycpy.done2:219// IR-NEXT:    ret void220//221//222// IR-PCH-LABEL: define {{[^@]+}}@_Z3foov223// IR-PCH-SAME: () #[[ATTR0:[0-9]+]] {224// IR-PCH-NEXT:  entry:225// IR-PCH-NEXT:    [[I:%.*]] = alloca i32, align 4226// IR-PCH-NEXT:    [[J:%.*]] = alloca i32, align 4227// IR-PCH-NEXT:    [[SUM:%.*]] = alloca [10 x [10 x i32]], align 16228// IR-PCH-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_teams(ptr @[[GLOB3:[0-9]+]], i32 2, ptr @_Z3foov.omp_outlined, ptr [[J]], ptr [[SUM]])229// IR-PCH-NEXT:    ret i32 0230//231//232// IR-PCH-LABEL: define {{[^@]+}}@_Z3foov.omp_outlined233// IR-PCH-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[J:%.*]], ptr noundef nonnull align 4 dereferenceable(400) [[SUM:%.*]]) #[[ATTR1:[0-9]+]] {234// IR-PCH-NEXT:  entry:235// IR-PCH-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8236// IR-PCH-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8237// IR-PCH-NEXT:    [[J_ADDR:%.*]] = alloca ptr, align 8238// IR-PCH-NEXT:    [[SUM_ADDR:%.*]] = alloca ptr, align 8239// IR-PCH-NEXT:    [[SUM1:%.*]] = alloca [10 x [10 x i32]], align 16240// IR-PCH-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4241// IR-PCH-NEXT:    [[TMP:%.*]] = alloca i32, align 4242// IR-PCH-NEXT:    [[_TMP2:%.*]] = alloca i32, align 4243// IR-PCH-NEXT:    [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4244// IR-PCH-NEXT:    [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4245// IR-PCH-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4246// IR-PCH-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4247// IR-PCH-NEXT:    [[J3:%.*]] = alloca i32, align 4248// IR-PCH-NEXT:    [[I:%.*]] = alloca i32, align 4249// IR-PCH-NEXT:    [[J4:%.*]] = alloca i32, align 4250// IR-PCH-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8251// IR-PCH-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8252// IR-PCH-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8253// IR-PCH-NEXT:    store ptr [[J]], ptr [[J_ADDR]], align 8254// IR-PCH-NEXT:    store ptr [[SUM]], ptr [[SUM_ADDR]], align 8255// IR-PCH-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[J_ADDR]], align 8256// IR-PCH-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[SUM_ADDR]], align 8257// IR-PCH-NEXT:    [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [10 x [10 x i32]], ptr [[SUM1]], i32 0, i32 0, i32 0258// IR-PCH-NEXT:    [[TMP2:%.*]] = getelementptr i32, ptr [[ARRAY_BEGIN]], i64 100259// IR-PCH-NEXT:    [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq ptr [[ARRAY_BEGIN]], [[TMP2]]260// IR-PCH-NEXT:    br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]]261// IR-PCH:       omp.arrayinit.body:262// IR-PCH-NEXT:    [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ]263// IR-PCH-NEXT:    store i32 0, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4264// IR-PCH-NEXT:    [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1265// IR-PCH-NEXT:    [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP2]]266// IR-PCH-NEXT:    br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]]267// IR-PCH:       omp.arrayinit.done:268// IR-PCH-NEXT:    store i32 0, ptr [[DOTOMP_COMB_LB]], align 4269// IR-PCH-NEXT:    store i32 99, ptr [[DOTOMP_COMB_UB]], align 4270// IR-PCH-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4271// IR-PCH-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4272// IR-PCH-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8273// IR-PCH-NEXT:    [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4274// IR-PCH-NEXT:    call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP4]], i32 92, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_COMB_LB]], ptr [[DOTOMP_COMB_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)275// IR-PCH-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4276// IR-PCH-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP5]], 99277// IR-PCH-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]278// IR-PCH:       cond.true:279// IR-PCH-NEXT:    br label [[COND_END:%.*]]280// IR-PCH:       cond.false:281// IR-PCH-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4282// IR-PCH-NEXT:    br label [[COND_END]]283// IR-PCH:       cond.end:284// IR-PCH-NEXT:    [[COND:%.*]] = phi i32 [ 99, [[COND_TRUE]] ], [ [[TMP6]], [[COND_FALSE]] ]285// IR-PCH-NEXT:    store i32 [[COND]], ptr [[DOTOMP_COMB_UB]], align 4286// IR-PCH-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_COMB_LB]], align 4287// IR-PCH-NEXT:    store i32 [[TMP7]], ptr [[DOTOMP_IV]], align 4288// IR-PCH-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]289// IR-PCH:       omp.inner.for.cond:290// IR-PCH-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4291// IR-PCH-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_COMB_UB]], align 4292// IR-PCH-NEXT:    [[CMP5:%.*]] = icmp sle i32 [[TMP8]], [[TMP9]]293// IR-PCH-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]294// IR-PCH:       omp.inner.for.body:295// IR-PCH-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4296// IR-PCH-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP10]], 10297// IR-PCH-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV]], 1298// IR-PCH-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]299// IR-PCH-NEXT:    store i32 [[ADD]], ptr [[I]], align 4300// IR-PCH-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4301// IR-PCH-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4302// IR-PCH-NEXT:    [[DIV6:%.*]] = sdiv i32 [[TMP12]], 10303// IR-PCH-NEXT:    [[MUL7:%.*]] = mul nsw i32 [[DIV6]], 10304// IR-PCH-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP11]], [[MUL7]]305// IR-PCH-NEXT:    [[MUL8:%.*]] = mul nsw i32 [[SUB]], 1306// IR-PCH-NEXT:    [[ADD9:%.*]] = add nsw i32 0, [[MUL8]]307// IR-PCH-NEXT:    store i32 [[ADD9]], ptr [[J3]], align 4308// IR-PCH-NEXT:    [[TMP13:%.*]] = load i32, ptr [[I]], align 4309// IR-PCH-NEXT:    [[TMP14:%.*]] = load i32, ptr [[I]], align 4310// IR-PCH-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP14]] to i64311// IR-PCH-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x [10 x i32]], ptr [[SUM1]], i64 0, i64 [[IDXPROM]]312// IR-PCH-NEXT:    [[TMP15:%.*]] = load i32, ptr [[J3]], align 4313// IR-PCH-NEXT:    [[IDXPROM10:%.*]] = sext i32 [[TMP15]] to i64314// IR-PCH-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds [10 x i32], ptr [[ARRAYIDX]], i64 0, i64 [[IDXPROM10]]315// IR-PCH-NEXT:    [[TMP16:%.*]] = load i32, ptr [[ARRAYIDX11]], align 4316// IR-PCH-NEXT:    [[ADD12:%.*]] = add nsw i32 [[TMP16]], [[TMP13]]317// IR-PCH-NEXT:    store i32 [[ADD12]], ptr [[ARRAYIDX11]], align 4318// IR-PCH-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]319// IR-PCH:       omp.body.continue:320// IR-PCH-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]321// IR-PCH:       omp.inner.for.inc:322// IR-PCH-NEXT:    [[TMP17:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4323// IR-PCH-NEXT:    [[ADD13:%.*]] = add nsw i32 [[TMP17]], 1324// IR-PCH-NEXT:    store i32 [[ADD13]], ptr [[DOTOMP_IV]], align 4325// IR-PCH-NEXT:    br label [[OMP_INNER_FOR_COND]]326// IR-PCH:       omp.inner.for.end:327// IR-PCH-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]328// IR-PCH:       omp.loop.exit:329// IR-PCH-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8330// IR-PCH-NEXT:    [[TMP19:%.*]] = load i32, ptr [[TMP18]], align 4331// IR-PCH-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP19]])332// IR-PCH-NEXT:    [[TMP20:%.*]] = load i32, ptr [[DOTOMP_IS_LAST]], align 4333// IR-PCH-NEXT:    [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0334// IR-PCH-NEXT:    br i1 [[TMP21]], label [[DOTOMP_LASTPRIVATE_THEN:%.*]], label [[DOTOMP_LASTPRIVATE_DONE:%.*]]335// IR-PCH:       .omp.lastprivate.then:336// IR-PCH-NEXT:    store i32 10, ptr [[J3]], align 4337// IR-PCH-NEXT:    [[TMP22:%.*]] = load i32, ptr [[J3]], align 4338// IR-PCH-NEXT:    store i32 [[TMP22]], ptr [[TMP0]], align 4339// IR-PCH-NEXT:    br label [[DOTOMP_LASTPRIVATE_DONE]]340// IR-PCH:       .omp.lastprivate.done:341// IR-PCH-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0342// IR-PCH-NEXT:    store ptr [[SUM1]], ptr [[TMP23]], align 8343// IR-PCH-NEXT:    [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8344// IR-PCH-NEXT:    [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4345// IR-PCH-NEXT:    [[TMP26:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2:[0-9]+]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3foov.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)346// IR-PCH-NEXT:    switch i32 [[TMP26]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [347// IR-PCH-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]348// IR-PCH-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]349// IR-PCH-NEXT:    ]350// IR-PCH:       .omp.reduction.case1:351// IR-PCH-NEXT:    [[TMP27:%.*]] = getelementptr i32, ptr [[TMP1]], i64 100352// IR-PCH-NEXT:    [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP1]], [[TMP27]]353// IR-PCH-NEXT:    br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE18:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]354// IR-PCH:       omp.arraycpy.body:355// IR-PCH-NEXT:    [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[SUM1]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]356// IR-PCH-NEXT:    [[OMP_ARRAYCPY_DESTELEMENTPAST14:%.*]] = phi ptr [ [[TMP1]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT16:%.*]], [[OMP_ARRAYCPY_BODY]] ]357// IR-PCH-NEXT:    [[TMP28:%.*]] = load i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST14]], align 4358// IR-PCH-NEXT:    [[TMP29:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 4359// IR-PCH-NEXT:    [[ADD15:%.*]] = add nsw i32 [[TMP28]], [[TMP29]]360// IR-PCH-NEXT:    store i32 [[ADD15]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST14]], align 4361// IR-PCH-NEXT:    [[OMP_ARRAYCPY_DEST_ELEMENT16]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST14]], i32 1362// IR-PCH-NEXT:    [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1363// IR-PCH-NEXT:    [[OMP_ARRAYCPY_DONE17:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT16]], [[TMP27]]364// IR-PCH-NEXT:    br i1 [[OMP_ARRAYCPY_DONE17]], label [[OMP_ARRAYCPY_DONE18]], label [[OMP_ARRAYCPY_BODY]]365// IR-PCH:       omp.arraycpy.done18:366// IR-PCH-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)367// IR-PCH-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]368// IR-PCH:       .omp.reduction.case2:369// IR-PCH-NEXT:    [[TMP30:%.*]] = getelementptr i32, ptr [[TMP1]], i64 100370// IR-PCH-NEXT:    [[OMP_ARRAYCPY_ISEMPTY19:%.*]] = icmp eq ptr [[TMP1]], [[TMP30]]371// IR-PCH-NEXT:    br i1 [[OMP_ARRAYCPY_ISEMPTY19]], label [[OMP_ARRAYCPY_DONE26:%.*]], label [[OMP_ARRAYCPY_BODY20:%.*]]372// IR-PCH:       omp.arraycpy.body20:373// IR-PCH-NEXT:    [[OMP_ARRAYCPY_SRCELEMENTPAST21:%.*]] = phi ptr [ [[SUM1]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT24:%.*]], [[OMP_ARRAYCPY_BODY20]] ]374// IR-PCH-NEXT:    [[OMP_ARRAYCPY_DESTELEMENTPAST22:%.*]] = phi ptr [ [[TMP1]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT23:%.*]], [[OMP_ARRAYCPY_BODY20]] ]375// IR-PCH-NEXT:    [[TMP31:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST21]], align 4376// IR-PCH-NEXT:    [[TMP32:%.*]] = atomicrmw add ptr [[OMP_ARRAYCPY_DESTELEMENTPAST22]], i32 [[TMP31]] monotonic, align 4377// IR-PCH-NEXT:    [[OMP_ARRAYCPY_DEST_ELEMENT23]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST22]], i32 1378// IR-PCH-NEXT:    [[OMP_ARRAYCPY_SRC_ELEMENT24]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST21]], i32 1379// IR-PCH-NEXT:    [[OMP_ARRAYCPY_DONE25:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT23]], [[TMP30]]380// IR-PCH-NEXT:    br i1 [[OMP_ARRAYCPY_DONE25]], label [[OMP_ARRAYCPY_DONE26]], label [[OMP_ARRAYCPY_BODY20]]381// IR-PCH:       omp.arraycpy.done26:382// IR-PCH-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]383// IR-PCH:       .omp.reduction.default:384// IR-PCH-NEXT:    ret void385//386//387// IR-PCH-LABEL: define {{[^@]+}}@_Z3foov.omp_outlined.omp.reduction.reduction_func388// IR-PCH-SAME: (ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR3:[0-9]+]] {389// IR-PCH-NEXT:  entry:390// IR-PCH-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8391// IR-PCH-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8392// IR-PCH-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8393// IR-PCH-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8394// IR-PCH-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8395// IR-PCH-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8396// IR-PCH-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0397// IR-PCH-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8398// IR-PCH-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0399// IR-PCH-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8400// IR-PCH-NEXT:    [[TMP8:%.*]] = getelementptr i32, ptr [[TMP7]], i64 100401// IR-PCH-NEXT:    [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq ptr [[TMP7]], [[TMP8]]402// IR-PCH-NEXT:    br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]]403// IR-PCH:       omp.arraycpy.body:404// IR-PCH-NEXT:    [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi ptr [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]405// IR-PCH-NEXT:    [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi ptr [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ]406// IR-PCH-NEXT:    [[TMP9:%.*]] = load i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4407// IR-PCH-NEXT:    [[TMP10:%.*]] = load i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 4408// IR-PCH-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP9]], [[TMP10]]409// IR-PCH-NEXT:    store i32 [[ADD]], ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4410// IR-PCH-NEXT:    [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1411// IR-PCH-NEXT:    [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, ptr [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1412// IR-PCH-NEXT:    [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq ptr [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]]413// IR-PCH-NEXT:    br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]]414// IR-PCH:       omp.arraycpy.done2:415// IR-PCH-NEXT:    ret void416//417