brintos

brintos / llvm-project-archived public Read only

0
0
Text · 26.5 KiB · ce9aa5d Raw
435 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 %s3// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm %s -o - | FileCheck %s --check-prefix=IR4 5// RUN: %clang_cc1 -DOMP60 -fopenmp-version=60 -verify -triple x86_64-pc-linux-gnu -fopenmp %s6// RUN: %clang_cc1 -DOMP60 -fopenmp-version=60 -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm %s -o - | FileCheck %s --check-prefix=IR-OMP607 8// Check same results after serialization round-trip9// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-pch -o %t %s10// RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -fopenmp -include-pch %t -emit-llvm %s -o - | FileCheck %s --check-prefix=IR-PCH11 12// RUN: %clang_cc1 -DOMP60 -fopenmp-version=60 -verify -triple x86_64-pc-linux-gnu -fopenmp -emit-pch -o %t %s13// RUN: %clang_cc1 -DOMP60 -fopenmp-version=60 -verify -triple x86_64-pc-linux-gnu -fopenmp -include-pch %t -emit-llvm %s -o - | FileCheck %s --check-prefix=IR-PCH-OMP6014 15// expected-no-diagnostics16 17#ifndef HEADER18#define HEADER19 20#define N 6421int foo() {22  int x = 0;23  int result[N] = {0};24 25 #ifdef OMP6026 #pragma omp parallel loop num_threads(strict: N) severity(fatal) message("msg") allocate(x) private(x) collapse(2)27 #else28 #pragma omp parallel loop num_threads(N) allocate(x) private(x) collapse(2)29 #endif30  for (int i = 0; i < N; i++)31    for (int j = 0; j < N; j++)32      result[i] = i + j + x;33  return 0;34}35#endif36// IR-LABEL: define {{[^@]+}}@_Z3foov37// IR-SAME: () #[[ATTR0:[0-9]+]] {38// IR-NEXT:  entry:39// IR-NEXT:    [[X:%.*]] = alloca i32, align 440// IR-NEXT:    [[RESULT:%.*]] = alloca [64 x i32], align 1641// IR-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]])42// IR-NEXT:    store i32 0, ptr [[X]], align 443// IR-NEXT:    call void @llvm.memset.p0.i64(ptr align 16 [[RESULT]], i8 0, i64 256, i1 false)44// IR-NEXT:    call void @__kmpc_push_num_threads(ptr @[[GLOB2]], i32 [[TMP0]], i32 64)45// IR-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @_Z3foov.omp_outlined, ptr [[RESULT]])46// IR-NEXT:    ret i32 047//48//49// IR-LABEL: define {{[^@]+}}@_Z3foov.omp_outlined50// IR-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(256) [[RESULT:%.*]]) #[[ATTR2:[0-9]+]] {51// IR-NEXT:  entry:52// IR-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 853// IR-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 854// IR-NEXT:    [[RESULT_ADDR:%.*]] = alloca ptr, align 855// IR-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 456// IR-NEXT:    [[TMP:%.*]] = alloca i32, align 457// IR-NEXT:    [[_TMP1:%.*]] = alloca i32, align 458// IR-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 459// IR-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 460// IR-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 461// IR-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 462// IR-NEXT:    [[I:%.*]] = alloca i32, align 463// IR-NEXT:    [[J:%.*]] = alloca i32, align 464// IR-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 865// IR-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 866// IR-NEXT:    store ptr [[RESULT]], ptr [[RESULT_ADDR]], align 867// IR-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[RESULT_ADDR]], align 8, !nonnull [[META3:![0-9]+]], !align [[META4:![0-9]+]]68// IR-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 469// IR-NEXT:    store i32 4095, ptr [[DOTOMP_UB]], align 470// IR-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 471// IR-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 472// IR-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 873// IR-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 474// IR-NEXT:    [[DOTX__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP2]], i64 4, ptr null)75// IR-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)76// IR-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 477// IR-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 409578// IR-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]79// IR:       cond.true:80// IR-NEXT:    br label [[COND_END:%.*]]81// IR:       cond.false:82// IR-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 483// IR-NEXT:    br label [[COND_END]]84// IR:       cond.end:85// IR-NEXT:    [[COND:%.*]] = phi i32 [ 4095, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]86// IR-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 487// IR-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 488// IR-NEXT:    store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 489// IR-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]90// IR:       omp.inner.for.cond:91// IR-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 492// IR-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 493// IR-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]94// IR-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]95// IR:       omp.inner.for.cond.cleanup:96// IR-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]97// IR:       omp.inner.for.body:98// IR-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 499// IR-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP8]], 64100// IR-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV]], 1101// IR-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]102// IR-NEXT:    store i32 [[ADD]], ptr [[I]], align 4103// IR-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4104// IR-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4105// IR-NEXT:    [[DIV3:%.*]] = sdiv i32 [[TMP10]], 64106// IR-NEXT:    [[MUL4:%.*]] = mul nsw i32 [[DIV3]], 64107// IR-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP9]], [[MUL4]]108// IR-NEXT:    [[MUL5:%.*]] = mul nsw i32 [[SUB]], 1109// IR-NEXT:    [[ADD6:%.*]] = add nsw i32 0, [[MUL5]]110// IR-NEXT:    store i32 [[ADD6]], ptr [[J]], align 4111// IR-NEXT:    [[TMP11:%.*]] = load i32, ptr [[I]], align 4112// IR-NEXT:    [[TMP12:%.*]] = load i32, ptr [[J]], align 4113// IR-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]114// IR-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTX__VOID_ADDR]], align 4115// IR-NEXT:    [[ADD8:%.*]] = add nsw i32 [[ADD7]], [[TMP13]]116// IR-NEXT:    [[TMP14:%.*]] = load i32, ptr [[I]], align 4117// IR-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP14]] to i64118// IR-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [64 x i32], ptr [[TMP0]], i64 0, i64 [[IDXPROM]]119// IR-NEXT:    store i32 [[ADD8]], ptr [[ARRAYIDX]], align 4120// IR-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]121// IR:       omp.body.continue:122// IR-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]123// IR:       omp.inner.for.inc:124// IR-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4125// IR-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP15]], 1126// IR-NEXT:    store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 4127// IR-NEXT:    br label [[OMP_INNER_FOR_COND]]128// IR:       omp.inner.for.end:129// IR-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]130// IR:       omp.loop.exit:131// IR-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])132// IR-NEXT:    call void @__kmpc_free(i32 [[TMP2]], ptr [[DOTX__VOID_ADDR]], ptr null)133// IR-NEXT:    ret void134//135//136// IR-OMP60-LABEL: define {{[^@]+}}@_Z3foov137// IR-OMP60-SAME: () #[[ATTR0:[0-9]+]] {138// IR-OMP60-NEXT:  entry:139// IR-OMP60-NEXT:    [[X:%.*]] = alloca i32, align 4140// IR-OMP60-NEXT:    [[RESULT:%.*]] = alloca [64 x i32], align 16141// IR-OMP60-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]])142// IR-OMP60-NEXT:    store i32 0, ptr [[X]], align 4143// IR-OMP60-NEXT:    call void @llvm.memset.p0.i64(ptr align 16 [[RESULT]], i8 0, i64 256, i1 false)144// IR-OMP60-NEXT:    call void @__kmpc_push_num_threads_strict(ptr @[[GLOB2]], i32 [[TMP0]], i32 64, i32 2, ptr @.str)145// IR-OMP60-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @_Z3foov.omp_outlined, ptr [[RESULT]])146// IR-OMP60-NEXT:    ret i32 0147//148//149// IR-OMP60-LABEL: define {{[^@]+}}@_Z3foov.omp_outlined150// IR-OMP60-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(256) [[RESULT:%.*]]) #[[ATTR2:[0-9]+]] {151// IR-OMP60-NEXT:  entry:152// IR-OMP60-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8153// IR-OMP60-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8154// IR-OMP60-NEXT:    [[RESULT_ADDR:%.*]] = alloca ptr, align 8155// IR-OMP60-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4156// IR-OMP60-NEXT:    [[TMP:%.*]] = alloca i32, align 4157// IR-OMP60-NEXT:    [[_TMP1:%.*]] = alloca i32, align 4158// IR-OMP60-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4159// IR-OMP60-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4160// IR-OMP60-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4161// IR-OMP60-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4162// IR-OMP60-NEXT:    [[I:%.*]] = alloca i32, align 4163// IR-OMP60-NEXT:    [[J:%.*]] = alloca i32, align 4164// IR-OMP60-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8165// IR-OMP60-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8166// IR-OMP60-NEXT:    store ptr [[RESULT]], ptr [[RESULT_ADDR]], align 8167// IR-OMP60-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[RESULT_ADDR]], align 8, !nonnull [[META3:![0-9]+]], !align [[META4:![0-9]+]]168// IR-OMP60-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4169// IR-OMP60-NEXT:    store i32 4095, ptr [[DOTOMP_UB]], align 4170// IR-OMP60-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4171// IR-OMP60-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4172// IR-OMP60-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8173// IR-OMP60-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4174// IR-OMP60-NEXT:    [[DOTX__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP2]], i64 4, ptr null)175// IR-OMP60-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)176// IR-OMP60-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4177// IR-OMP60-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 4095178// IR-OMP60-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]179// IR-OMP60:       cond.true:180// IR-OMP60-NEXT:    br label [[COND_END:%.*]]181// IR-OMP60:       cond.false:182// IR-OMP60-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4183// IR-OMP60-NEXT:    br label [[COND_END]]184// IR-OMP60:       cond.end:185// IR-OMP60-NEXT:    [[COND:%.*]] = phi i32 [ 4095, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]186// IR-OMP60-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4187// IR-OMP60-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4188// IR-OMP60-NEXT:    store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 4189// IR-OMP60-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]190// IR-OMP60:       omp.inner.for.cond:191// IR-OMP60-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4192// IR-OMP60-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4193// IR-OMP60-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]194// IR-OMP60-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]195// IR-OMP60:       omp.inner.for.cond.cleanup:196// IR-OMP60-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]197// IR-OMP60:       omp.inner.for.body:198// IR-OMP60-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4199// IR-OMP60-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP8]], 64200// IR-OMP60-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV]], 1201// IR-OMP60-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]202// IR-OMP60-NEXT:    store i32 [[ADD]], ptr [[I]], align 4203// IR-OMP60-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4204// IR-OMP60-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4205// IR-OMP60-NEXT:    [[DIV3:%.*]] = sdiv i32 [[TMP10]], 64206// IR-OMP60-NEXT:    [[MUL4:%.*]] = mul nsw i32 [[DIV3]], 64207// IR-OMP60-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP9]], [[MUL4]]208// IR-OMP60-NEXT:    [[MUL5:%.*]] = mul nsw i32 [[SUB]], 1209// IR-OMP60-NEXT:    [[ADD6:%.*]] = add nsw i32 0, [[MUL5]]210// IR-OMP60-NEXT:    store i32 [[ADD6]], ptr [[J]], align 4211// IR-OMP60-NEXT:    [[TMP11:%.*]] = load i32, ptr [[I]], align 4212// IR-OMP60-NEXT:    [[TMP12:%.*]] = load i32, ptr [[J]], align 4213// IR-OMP60-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]214// IR-OMP60-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTX__VOID_ADDR]], align 4215// IR-OMP60-NEXT:    [[ADD8:%.*]] = add nsw i32 [[ADD7]], [[TMP13]]216// IR-OMP60-NEXT:    [[TMP14:%.*]] = load i32, ptr [[I]], align 4217// IR-OMP60-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP14]] to i64218// IR-OMP60-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [64 x i32], ptr [[TMP0]], i64 0, i64 [[IDXPROM]]219// IR-OMP60-NEXT:    store i32 [[ADD8]], ptr [[ARRAYIDX]], align 4220// IR-OMP60-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]221// IR-OMP60:       omp.body.continue:222// IR-OMP60-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]223// IR-OMP60:       omp.inner.for.inc:224// IR-OMP60-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4225// IR-OMP60-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP15]], 1226// IR-OMP60-NEXT:    store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 4227// IR-OMP60-NEXT:    br label [[OMP_INNER_FOR_COND]]228// IR-OMP60:       omp.inner.for.end:229// IR-OMP60-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]230// IR-OMP60:       omp.loop.exit:231// IR-OMP60-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])232// IR-OMP60-NEXT:    call void @__kmpc_free(i32 [[TMP2]], ptr [[DOTX__VOID_ADDR]], ptr null)233// IR-OMP60-NEXT:    ret void234//235//236// IR-PCH-LABEL: define {{[^@]+}}@_Z3foov237// IR-PCH-SAME: () #[[ATTR0:[0-9]+]] {238// IR-PCH-NEXT:  entry:239// IR-PCH-NEXT:    [[X:%.*]] = alloca i32, align 4240// IR-PCH-NEXT:    [[RESULT:%.*]] = alloca [64 x i32], align 16241// IR-PCH-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]])242// IR-PCH-NEXT:    store i32 0, ptr [[X]], align 4243// IR-PCH-NEXT:    call void @llvm.memset.p0.i64(ptr align 16 [[RESULT]], i8 0, i64 256, i1 false)244// IR-PCH-NEXT:    call void @__kmpc_push_num_threads(ptr @[[GLOB2]], i32 [[TMP0]], i32 64)245// IR-PCH-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @_Z3foov.omp_outlined, ptr [[RESULT]])246// IR-PCH-NEXT:    ret i32 0247//248//249// IR-PCH-LABEL: define {{[^@]+}}@_Z3foov.omp_outlined250// IR-PCH-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(256) [[RESULT:%.*]]) #[[ATTR2:[0-9]+]] {251// IR-PCH-NEXT:  entry:252// IR-PCH-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8253// IR-PCH-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8254// IR-PCH-NEXT:    [[RESULT_ADDR:%.*]] = alloca ptr, align 8255// IR-PCH-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4256// IR-PCH-NEXT:    [[TMP:%.*]] = alloca i32, align 4257// IR-PCH-NEXT:    [[_TMP1:%.*]] = alloca i32, align 4258// IR-PCH-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4259// IR-PCH-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4260// IR-PCH-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4261// IR-PCH-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4262// IR-PCH-NEXT:    [[I:%.*]] = alloca i32, align 4263// IR-PCH-NEXT:    [[J:%.*]] = alloca i32, align 4264// IR-PCH-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8265// IR-PCH-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8266// IR-PCH-NEXT:    store ptr [[RESULT]], ptr [[RESULT_ADDR]], align 8267// IR-PCH-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[RESULT_ADDR]], align 8, !nonnull [[META3:![0-9]+]], !align [[META4:![0-9]+]]268// IR-PCH-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4269// IR-PCH-NEXT:    store i32 4095, ptr [[DOTOMP_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:    [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8273// IR-PCH-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4274// IR-PCH-NEXT:    [[DOTX__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP2]], i64 4, ptr null)275// IR-PCH-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)276// IR-PCH-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4277// IR-PCH-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 4095278// IR-PCH-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]279// IR-PCH:       cond.true:280// IR-PCH-NEXT:    br label [[COND_END:%.*]]281// IR-PCH:       cond.false:282// IR-PCH-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4283// IR-PCH-NEXT:    br label [[COND_END]]284// IR-PCH:       cond.end:285// IR-PCH-NEXT:    [[COND:%.*]] = phi i32 [ 4095, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]286// IR-PCH-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4287// IR-PCH-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4288// IR-PCH-NEXT:    store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 4289// IR-PCH-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]290// IR-PCH:       omp.inner.for.cond:291// IR-PCH-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4292// IR-PCH-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4293// IR-PCH-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]294// IR-PCH-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]295// IR-PCH:       omp.inner.for.cond.cleanup:296// IR-PCH-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]297// IR-PCH:       omp.inner.for.body:298// IR-PCH-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4299// IR-PCH-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP8]], 64300// IR-PCH-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV]], 1301// IR-PCH-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]302// IR-PCH-NEXT:    store i32 [[ADD]], ptr [[I]], align 4303// IR-PCH-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4304// IR-PCH-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4305// IR-PCH-NEXT:    [[DIV3:%.*]] = sdiv i32 [[TMP10]], 64306// IR-PCH-NEXT:    [[MUL4:%.*]] = mul nsw i32 [[DIV3]], 64307// IR-PCH-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP9]], [[MUL4]]308// IR-PCH-NEXT:    [[MUL5:%.*]] = mul nsw i32 [[SUB]], 1309// IR-PCH-NEXT:    [[ADD6:%.*]] = add nsw i32 0, [[MUL5]]310// IR-PCH-NEXT:    store i32 [[ADD6]], ptr [[J]], align 4311// IR-PCH-NEXT:    [[TMP11:%.*]] = load i32, ptr [[I]], align 4312// IR-PCH-NEXT:    [[TMP12:%.*]] = load i32, ptr [[J]], align 4313// IR-PCH-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]314// IR-PCH-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTX__VOID_ADDR]], align 4315// IR-PCH-NEXT:    [[ADD8:%.*]] = add nsw i32 [[ADD7]], [[TMP13]]316// IR-PCH-NEXT:    [[TMP14:%.*]] = load i32, ptr [[I]], align 4317// IR-PCH-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP14]] to i64318// IR-PCH-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [64 x i32], ptr [[TMP0]], i64 0, i64 [[IDXPROM]]319// IR-PCH-NEXT:    store i32 [[ADD8]], ptr [[ARRAYIDX]], align 4320// IR-PCH-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]321// IR-PCH:       omp.body.continue:322// IR-PCH-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]323// IR-PCH:       omp.inner.for.inc:324// IR-PCH-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4325// IR-PCH-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP15]], 1326// IR-PCH-NEXT:    store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 4327// IR-PCH-NEXT:    br label [[OMP_INNER_FOR_COND]]328// IR-PCH:       omp.inner.for.end:329// IR-PCH-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]330// IR-PCH:       omp.loop.exit:331// IR-PCH-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])332// IR-PCH-NEXT:    call void @__kmpc_free(i32 [[TMP2]], ptr [[DOTX__VOID_ADDR]], ptr null)333// IR-PCH-NEXT:    ret void334//335//336// IR-PCH-OMP60-LABEL: define {{[^@]+}}@_Z3foov337// IR-PCH-OMP60-SAME: () #[[ATTR0:[0-9]+]] {338// IR-PCH-OMP60-NEXT:  entry:339// IR-PCH-OMP60-NEXT:    [[X:%.*]] = alloca i32, align 4340// IR-PCH-OMP60-NEXT:    [[RESULT:%.*]] = alloca [64 x i32], align 16341// IR-PCH-OMP60-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]])342// IR-PCH-OMP60-NEXT:    store i32 0, ptr [[X]], align 4343// IR-PCH-OMP60-NEXT:    call void @llvm.memset.p0.i64(ptr align 16 [[RESULT]], i8 0, i64 256, i1 false)344// IR-PCH-OMP60-NEXT:    call void @__kmpc_push_num_threads_strict(ptr @[[GLOB2]], i32 [[TMP0]], i32 64, i32 2, ptr @.str)345// IR-PCH-OMP60-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 1, ptr @_Z3foov.omp_outlined, ptr [[RESULT]])346// IR-PCH-OMP60-NEXT:    ret i32 0347//348//349// IR-PCH-OMP60-LABEL: define {{[^@]+}}@_Z3foov.omp_outlined350// IR-PCH-OMP60-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(256) [[RESULT:%.*]]) #[[ATTR2:[0-9]+]] {351// IR-PCH-OMP60-NEXT:  entry:352// IR-PCH-OMP60-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8353// IR-PCH-OMP60-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8354// IR-PCH-OMP60-NEXT:    [[RESULT_ADDR:%.*]] = alloca ptr, align 8355// IR-PCH-OMP60-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4356// IR-PCH-OMP60-NEXT:    [[TMP:%.*]] = alloca i32, align 4357// IR-PCH-OMP60-NEXT:    [[_TMP1:%.*]] = alloca i32, align 4358// IR-PCH-OMP60-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4359// IR-PCH-OMP60-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4360// IR-PCH-OMP60-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4361// IR-PCH-OMP60-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4362// IR-PCH-OMP60-NEXT:    [[I:%.*]] = alloca i32, align 4363// IR-PCH-OMP60-NEXT:    [[J:%.*]] = alloca i32, align 4364// IR-PCH-OMP60-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8365// IR-PCH-OMP60-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8366// IR-PCH-OMP60-NEXT:    store ptr [[RESULT]], ptr [[RESULT_ADDR]], align 8367// IR-PCH-OMP60-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[RESULT_ADDR]], align 8, !nonnull [[META3:![0-9]+]], !align [[META4:![0-9]+]]368// IR-PCH-OMP60-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4369// IR-PCH-OMP60-NEXT:    store i32 4095, ptr [[DOTOMP_UB]], align 4370// IR-PCH-OMP60-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4371// IR-PCH-OMP60-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4372// IR-PCH-OMP60-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8373// IR-PCH-OMP60-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4374// IR-PCH-OMP60-NEXT:    [[DOTX__VOID_ADDR:%.*]] = call ptr @__kmpc_alloc(i32 [[TMP2]], i64 4, ptr null)375// IR-PCH-OMP60-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)376// IR-PCH-OMP60-NEXT:    [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4377// IR-PCH-OMP60-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP3]], 4095378// IR-PCH-OMP60-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]379// IR-PCH-OMP60:       cond.true:380// IR-PCH-OMP60-NEXT:    br label [[COND_END:%.*]]381// IR-PCH-OMP60:       cond.false:382// IR-PCH-OMP60-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4383// IR-PCH-OMP60-NEXT:    br label [[COND_END]]384// IR-PCH-OMP60:       cond.end:385// IR-PCH-OMP60-NEXT:    [[COND:%.*]] = phi i32 [ 4095, [[COND_TRUE]] ], [ [[TMP4]], [[COND_FALSE]] ]386// IR-PCH-OMP60-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4387// IR-PCH-OMP60-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4388// IR-PCH-OMP60-NEXT:    store i32 [[TMP5]], ptr [[DOTOMP_IV]], align 4389// IR-PCH-OMP60-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]390// IR-PCH-OMP60:       omp.inner.for.cond:391// IR-PCH-OMP60-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4392// IR-PCH-OMP60-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4393// IR-PCH-OMP60-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]]394// IR-PCH-OMP60-NEXT:    br i1 [[CMP2]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]]395// IR-PCH-OMP60:       omp.inner.for.cond.cleanup:396// IR-PCH-OMP60-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]397// IR-PCH-OMP60:       omp.inner.for.body:398// IR-PCH-OMP60-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4399// IR-PCH-OMP60-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP8]], 64400// IR-PCH-OMP60-NEXT:    [[MUL:%.*]] = mul nsw i32 [[DIV]], 1401// IR-PCH-OMP60-NEXT:    [[ADD:%.*]] = add nsw i32 0, [[MUL]]402// IR-PCH-OMP60-NEXT:    store i32 [[ADD]], ptr [[I]], align 4403// IR-PCH-OMP60-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4404// IR-PCH-OMP60-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4405// IR-PCH-OMP60-NEXT:    [[DIV3:%.*]] = sdiv i32 [[TMP10]], 64406// IR-PCH-OMP60-NEXT:    [[MUL4:%.*]] = mul nsw i32 [[DIV3]], 64407// IR-PCH-OMP60-NEXT:    [[SUB:%.*]] = sub nsw i32 [[TMP9]], [[MUL4]]408// IR-PCH-OMP60-NEXT:    [[MUL5:%.*]] = mul nsw i32 [[SUB]], 1409// IR-PCH-OMP60-NEXT:    [[ADD6:%.*]] = add nsw i32 0, [[MUL5]]410// IR-PCH-OMP60-NEXT:    store i32 [[ADD6]], ptr [[J]], align 4411// IR-PCH-OMP60-NEXT:    [[TMP11:%.*]] = load i32, ptr [[I]], align 4412// IR-PCH-OMP60-NEXT:    [[TMP12:%.*]] = load i32, ptr [[J]], align 4413// IR-PCH-OMP60-NEXT:    [[ADD7:%.*]] = add nsw i32 [[TMP11]], [[TMP12]]414// IR-PCH-OMP60-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTX__VOID_ADDR]], align 4415// IR-PCH-OMP60-NEXT:    [[ADD8:%.*]] = add nsw i32 [[ADD7]], [[TMP13]]416// IR-PCH-OMP60-NEXT:    [[TMP14:%.*]] = load i32, ptr [[I]], align 4417// IR-PCH-OMP60-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP14]] to i64418// IR-PCH-OMP60-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [64 x i32], ptr [[TMP0]], i64 0, i64 [[IDXPROM]]419// IR-PCH-OMP60-NEXT:    store i32 [[ADD8]], ptr [[ARRAYIDX]], align 4420// IR-PCH-OMP60-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]421// IR-PCH-OMP60:       omp.body.continue:422// IR-PCH-OMP60-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]423// IR-PCH-OMP60:       omp.inner.for.inc:424// IR-PCH-OMP60-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4425// IR-PCH-OMP60-NEXT:    [[ADD9:%.*]] = add nsw i32 [[TMP15]], 1426// IR-PCH-OMP60-NEXT:    store i32 [[ADD9]], ptr [[DOTOMP_IV]], align 4427// IR-PCH-OMP60-NEXT:    br label [[OMP_INNER_FOR_COND]]428// IR-PCH-OMP60:       omp.inner.for.end:429// IR-PCH-OMP60-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]430// IR-PCH-OMP60:       omp.loop.exit:431// IR-PCH-OMP60-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP2]])432// IR-PCH-OMP60-NEXT:    call void @__kmpc_free(i32 [[TMP2]], ptr [[DOTX__VOID_ADDR]], ptr null)433// IR-PCH-OMP60-NEXT:    ret void434//435