180865c01SMichael Kruse // 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 _ 280865c01SMichael Kruse 380865c01SMichael Kruse // expected-no-diagnostics 480865c01SMichael Kruse 580865c01SMichael Kruse // Check code generation 680865c01SMichael Kruse // RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -std=c++20 -fclang-abi-compat=latest -fopenmp -fopenmp-version=60 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK1 780865c01SMichael Kruse 880865c01SMichael Kruse // Check same results after serialization round-trip 980865c01SMichael Kruse // RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -std=c++20 -fclang-abi-compat=latest -fopenmp -fopenmp-version=60 -emit-pch -o %t %s 1080865c01SMichael Kruse // RUN: %clang_cc1 -verify -triple x86_64-pc-linux-gnu -std=c++20 -fclang-abi-compat=latest -fopenmp -fopenmp-version=60 -include-pch %t -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK2 1180865c01SMichael Kruse 1280865c01SMichael Kruse #ifndef HEADER 1380865c01SMichael Kruse #define HEADER 1480865c01SMichael Kruse 1580865c01SMichael Kruse // placeholder for loop body code. 1680865c01SMichael Kruse extern "C" void body(...) {} 1780865c01SMichael Kruse 1880865c01SMichael Kruse 1980865c01SMichael Kruse struct S { 2080865c01SMichael Kruse int i; 2180865c01SMichael Kruse S() { 2280865c01SMichael Kruse #pragma omp reverse 2380865c01SMichael Kruse for (i = 7; i < 17; i += 3) 2480865c01SMichael Kruse body(i); 2580865c01SMichael Kruse } 2680865c01SMichael Kruse } s; 2780865c01SMichael Kruse 2880865c01SMichael Kruse 2980865c01SMichael Kruse extern "C" void foo1(int start, int end, int step) { 3080865c01SMichael Kruse int i; 3180865c01SMichael Kruse #pragma omp reverse 3280865c01SMichael Kruse for (i = start; i < end; i += step) 3380865c01SMichael Kruse body(i); 3480865c01SMichael Kruse } 3580865c01SMichael Kruse 3680865c01SMichael Kruse 3780865c01SMichael Kruse extern "C" void foo2() { 3880865c01SMichael Kruse #pragma omp for 3980865c01SMichael Kruse #pragma omp reverse 4080865c01SMichael Kruse for (int i = 7; i < 17; i += 3) 4180865c01SMichael Kruse body(i); 4280865c01SMichael Kruse } 4380865c01SMichael Kruse 4480865c01SMichael Kruse 4580865c01SMichael Kruse extern "C" void foo3() { 4680865c01SMichael Kruse #pragma omp for collapse(3) 4780865c01SMichael Kruse for (int k = 7; k < 17; k += 3) 4880865c01SMichael Kruse #pragma omp reverse 4980865c01SMichael Kruse for (int i = 7; i < 17; i += 3) 5080865c01SMichael Kruse for (int j = 7; j < 17; j += 3) 5180865c01SMichael Kruse body(k, i, j); 5280865c01SMichael Kruse } 5380865c01SMichael Kruse 5480865c01SMichael Kruse 5580865c01SMichael Kruse extern "C" void foo4() { 5680865c01SMichael Kruse #pragma omp parallel for 5780865c01SMichael Kruse #pragma omp reverse 5880865c01SMichael Kruse for (int i = 7; i < 17; i += 3) 5980865c01SMichael Kruse body(i); 6080865c01SMichael Kruse } 6180865c01SMichael Kruse 6280865c01SMichael Kruse 6380865c01SMichael Kruse template<typename T, T Step> 6480865c01SMichael Kruse void foo5(T start, T end) { 6580865c01SMichael Kruse #pragma omp reverse 6680865c01SMichael Kruse for (T i = start; i < end; i += Step) 6780865c01SMichael Kruse body(i); 6880865c01SMichael Kruse } 6980865c01SMichael Kruse 7080865c01SMichael Kruse extern "C" void tfoo5() { 7180865c01SMichael Kruse foo5<int,3>(0, 42); 7280865c01SMichael Kruse } 7380865c01SMichael Kruse 7480865c01SMichael Kruse 7580865c01SMichael Kruse extern "C" void foo6() { 7680865c01SMichael Kruse double arr[128]; 7780865c01SMichael Kruse #pragma omp reverse 7880865c01SMichael Kruse for (int c = 42; auto && v : arr) 7980865c01SMichael Kruse body(v, c); 8080865c01SMichael Kruse } 8180865c01SMichael Kruse 8280865c01SMichael Kruse 8380865c01SMichael Kruse extern "C" void foo7() { 8480865c01SMichael Kruse double A[128]; 8580865c01SMichael Kruse 8680865c01SMichael Kruse #pragma omp for collapse(3) 8780865c01SMichael Kruse for (int k = 7; k < 17; k += 3) 8880865c01SMichael Kruse #pragma omp reverse 8980865c01SMichael Kruse for (int c = 42; auto && v : A) 9080865c01SMichael Kruse for (int j = 7; j < 17; j += 3) 9180865c01SMichael Kruse body(k, c, v, j); 9280865c01SMichael Kruse } 9380865c01SMichael Kruse 9480865c01SMichael Kruse #endif /* HEADER */ 9580865c01SMichael Kruse 96*94473f4dSHari Limaye 9780865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@body 9880865c01SMichael Kruse // CHECK1-SAME: (...) #[[ATTR0:[0-9]+]] { 9980865c01SMichael Kruse // CHECK1-NEXT: entry: 10080865c01SMichael Kruse // CHECK1-NEXT: ret void 10180865c01SMichael Kruse // 10280865c01SMichael Kruse // 10380865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@__cxx_global_var_init 10480865c01SMichael Kruse // CHECK1-SAME: () #[[ATTR1:[0-9]+]] section ".text.startup" { 10580865c01SMichael Kruse // CHECK1-NEXT: entry: 10680865c01SMichael Kruse // CHECK1-NEXT: call void @_ZN1SC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @s) 10780865c01SMichael Kruse // CHECK1-NEXT: ret void 10880865c01SMichael Kruse // 10980865c01SMichael Kruse // 11080865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@_ZN1SC1Ev 11180865c01SMichael Kruse // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 { 11280865c01SMichael Kruse // CHECK1-NEXT: entry: 11380865c01SMichael Kruse // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 11480865c01SMichael Kruse // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 11580865c01SMichael Kruse // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 11680865c01SMichael Kruse // CHECK1-NEXT: call void @_ZN1SC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) 11780865c01SMichael Kruse // CHECK1-NEXT: ret void 11880865c01SMichael Kruse // 11980865c01SMichael Kruse // 12080865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@_ZN1SC2Ev 12180865c01SMichael Kruse // CHECK1-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 { 12280865c01SMichael Kruse // CHECK1-NEXT: entry: 12380865c01SMichael Kruse // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 12480865c01SMichael Kruse // CHECK1-NEXT: [[I2:%.*]] = alloca ptr, align 8 12580865c01SMichael Kruse // CHECK1-NEXT: [[DOTFORWARD_IV_I:%.*]] = alloca i32, align 4 12680865c01SMichael Kruse // CHECK1-NEXT: [[DOTREVERSED_IV_I:%.*]] = alloca i32, align 4 12780865c01SMichael Kruse // CHECK1-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 12880865c01SMichael Kruse // CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 129*94473f4dSHari Limaye // CHECK1-NEXT: [[I:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 0 13080865c01SMichael Kruse // CHECK1-NEXT: store i32 7, ptr [[I]], align 4 131*94473f4dSHari Limaye // CHECK1-NEXT: [[I3:%.*]] = getelementptr inbounds nuw [[STRUCT_S]], ptr [[THIS1]], i32 0, i32 0 13280865c01SMichael Kruse // CHECK1-NEXT: store ptr [[I3]], ptr [[I2]], align 8 13380865c01SMichael Kruse // CHECK1-NEXT: store i32 0, ptr [[DOTFORWARD_IV_I]], align 4 13480865c01SMichael Kruse // CHECK1-NEXT: br label [[FOR_COND:%.*]] 13580865c01SMichael Kruse // CHECK1: for.cond: 13680865c01SMichael Kruse // CHECK1-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 13780865c01SMichael Kruse // CHECK1-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], 4 13880865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 13980865c01SMichael Kruse // CHECK1: for.body: 14080865c01SMichael Kruse // CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 14180865c01SMichael Kruse // CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 3, [[TMP1]] 14280865c01SMichael Kruse // CHECK1-NEXT: store i32 [[SUB]], ptr [[DOTREVERSED_IV_I]], align 4 14380865c01SMichael Kruse // CHECK1-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTREVERSED_IV_I]], align 4 14480865c01SMichael Kruse // CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP2]], 3 14580865c01SMichael Kruse // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 7, [[MUL]] 14680865c01SMichael Kruse // CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[I2]], align 8 14780865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD]], ptr [[TMP3]], align 4 14880865c01SMichael Kruse // CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[I2]], align 8 14980865c01SMichael Kruse // CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4 15080865c01SMichael Kruse // CHECK1-NEXT: call void (...) @body(i32 noundef [[TMP5]]) 15180865c01SMichael Kruse // CHECK1-NEXT: br label [[FOR_INC:%.*]] 15280865c01SMichael Kruse // CHECK1: for.inc: 15380865c01SMichael Kruse // CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 15480865c01SMichael Kruse // CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP6]], 1 15580865c01SMichael Kruse // CHECK1-NEXT: store i32 [[INC]], ptr [[DOTFORWARD_IV_I]], align 4 15680865c01SMichael Kruse // CHECK1-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]] 15780865c01SMichael Kruse // CHECK1: for.end: 15880865c01SMichael Kruse // CHECK1-NEXT: ret void 15980865c01SMichael Kruse // 16080865c01SMichael Kruse // 16180865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@foo1 16280865c01SMichael Kruse // CHECK1-SAME: (i32 noundef [[START:%.*]], i32 noundef [[END:%.*]], i32 noundef [[STEP:%.*]]) #[[ATTR0]] { 16380865c01SMichael Kruse // CHECK1-NEXT: entry: 16480865c01SMichael Kruse // CHECK1-NEXT: [[START_ADDR:%.*]] = alloca i32, align 4 16580865c01SMichael Kruse // CHECK1-NEXT: [[END_ADDR:%.*]] = alloca i32, align 4 16680865c01SMichael Kruse // CHECK1-NEXT: [[STEP_ADDR:%.*]] = alloca i32, align 4 16780865c01SMichael Kruse // CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4 16880865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 16980865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4 17080865c01SMichael Kruse // CHECK1-NEXT: [[DOTNEW_STEP:%.*]] = alloca i32, align 4 17180865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4 17280865c01SMichael Kruse // CHECK1-NEXT: [[DOTFORWARD_IV_I:%.*]] = alloca i32, align 4 17380865c01SMichael Kruse // CHECK1-NEXT: [[DOTREVERSED_IV_I:%.*]] = alloca i32, align 4 17480865c01SMichael Kruse // CHECK1-NEXT: store i32 [[START]], ptr [[START_ADDR]], align 4 17580865c01SMichael Kruse // CHECK1-NEXT: store i32 [[END]], ptr [[END_ADDR]], align 4 17680865c01SMichael Kruse // CHECK1-NEXT: store i32 [[STEP]], ptr [[STEP_ADDR]], align 4 17780865c01SMichael Kruse // CHECK1-NEXT: [[TMP0:%.*]] = load i32, ptr [[START_ADDR]], align 4 17880865c01SMichael Kruse // CHECK1-NEXT: store i32 [[TMP0]], ptr [[I]], align 4 17980865c01SMichael Kruse // CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[START_ADDR]], align 4 18080865c01SMichael Kruse // CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTCAPTURE_EXPR_]], align 4 18180865c01SMichael Kruse // CHECK1-NEXT: [[TMP2:%.*]] = load i32, ptr [[END_ADDR]], align 4 18280865c01SMichael Kruse // CHECK1-NEXT: store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR_1]], align 4 18380865c01SMichael Kruse // CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[STEP_ADDR]], align 4 18480865c01SMichael Kruse // CHECK1-NEXT: store i32 [[TMP3]], ptr [[DOTNEW_STEP]], align 4 18580865c01SMichael Kruse // CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4 18680865c01SMichael Kruse // CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4 18780865c01SMichael Kruse // CHECK1-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], [[TMP5]] 18880865c01SMichael Kruse // CHECK1-NEXT: [[SUB3:%.*]] = sub i32 [[SUB]], 1 18980865c01SMichael Kruse // CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTNEW_STEP]], align 4 19080865c01SMichael Kruse // CHECK1-NEXT: [[ADD:%.*]] = add i32 [[SUB3]], [[TMP6]] 19180865c01SMichael Kruse // CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTNEW_STEP]], align 4 19280865c01SMichael Kruse // CHECK1-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP7]] 19380865c01SMichael Kruse // CHECK1-NEXT: [[SUB4:%.*]] = sub i32 [[DIV]], 1 19480865c01SMichael Kruse // CHECK1-NEXT: store i32 [[SUB4]], ptr [[DOTCAPTURE_EXPR_2]], align 4 19580865c01SMichael Kruse // CHECK1-NEXT: store i32 0, ptr [[DOTFORWARD_IV_I]], align 4 19680865c01SMichael Kruse // CHECK1-NEXT: br label [[FOR_COND:%.*]] 19780865c01SMichael Kruse // CHECK1: for.cond: 19880865c01SMichael Kruse // CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 19980865c01SMichael Kruse // CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4 20080865c01SMichael Kruse // CHECK1-NEXT: [[ADD5:%.*]] = add i32 [[TMP9]], 1 20180865c01SMichael Kruse // CHECK1-NEXT: [[CMP:%.*]] = icmp ult i32 [[TMP8]], [[ADD5]] 20280865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 20380865c01SMichael Kruse // CHECK1: for.body: 20480865c01SMichael Kruse // CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4 20580865c01SMichael Kruse // CHECK1-NEXT: [[ADD6:%.*]] = add i32 [[TMP10]], 1 20680865c01SMichael Kruse // CHECK1-NEXT: [[SUB7:%.*]] = sub i32 [[ADD6]], 1 20780865c01SMichael Kruse // CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 20880865c01SMichael Kruse // CHECK1-NEXT: [[SUB8:%.*]] = sub i32 [[SUB7]], [[TMP11]] 20980865c01SMichael Kruse // CHECK1-NEXT: store i32 [[SUB8]], ptr [[DOTREVERSED_IV_I]], align 4 21080865c01SMichael Kruse // CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4 21180865c01SMichael Kruse // CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTREVERSED_IV_I]], align 4 21280865c01SMichael Kruse // CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTNEW_STEP]], align 4 21380865c01SMichael Kruse // CHECK1-NEXT: [[MUL:%.*]] = mul i32 [[TMP13]], [[TMP14]] 21480865c01SMichael Kruse // CHECK1-NEXT: [[ADD9:%.*]] = add i32 [[TMP12]], [[MUL]] 21580865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD9]], ptr [[I]], align 4 21680865c01SMichael Kruse // CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[I]], align 4 21780865c01SMichael Kruse // CHECK1-NEXT: call void (...) @body(i32 noundef [[TMP15]]) 21880865c01SMichael Kruse // CHECK1-NEXT: br label [[FOR_INC:%.*]] 21980865c01SMichael Kruse // CHECK1: for.inc: 22080865c01SMichael Kruse // CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 22180865c01SMichael Kruse // CHECK1-NEXT: [[INC:%.*]] = add i32 [[TMP16]], 1 22280865c01SMichael Kruse // CHECK1-NEXT: store i32 [[INC]], ptr [[DOTFORWARD_IV_I]], align 4 22380865c01SMichael Kruse // CHECK1-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP5:![0-9]+]] 22480865c01SMichael Kruse // CHECK1: for.end: 22580865c01SMichael Kruse // CHECK1-NEXT: ret void 22680865c01SMichael Kruse // 22780865c01SMichael Kruse // 22880865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@foo2 22980865c01SMichael Kruse // CHECK1-SAME: () #[[ATTR0]] { 23080865c01SMichael Kruse // CHECK1-NEXT: entry: 23180865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 23280865c01SMichael Kruse // CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4 23380865c01SMichael Kruse // CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4 23480865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 23580865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 23680865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 23780865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 23880865c01SMichael Kruse // CHECK1-NEXT: [[DOTFORWARD_IV_I:%.*]] = alloca i32, align 4 23980865c01SMichael Kruse // CHECK1-NEXT: [[DOTREVERSED_IV_I:%.*]] = alloca i32, align 4 24080865c01SMichael Kruse // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]]) 24180865c01SMichael Kruse // CHECK1-NEXT: store i32 7, ptr [[I]], align 4 24280865c01SMichael Kruse // CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4 24380865c01SMichael Kruse // CHECK1-NEXT: store i32 3, ptr [[DOTOMP_UB]], align 4 24480865c01SMichael Kruse // CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4 24580865c01SMichael Kruse // CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4 24680865c01SMichael Kruse // CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP0]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1) 24780865c01SMichael Kruse // CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 24880865c01SMichael Kruse // CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP1]], 3 24980865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 25080865c01SMichael Kruse // CHECK1: cond.true: 25180865c01SMichael Kruse // CHECK1-NEXT: br label [[COND_END:%.*]] 25280865c01SMichael Kruse // CHECK1: cond.false: 25380865c01SMichael Kruse // CHECK1-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 25480865c01SMichael Kruse // CHECK1-NEXT: br label [[COND_END]] 25580865c01SMichael Kruse // CHECK1: cond.end: 25680865c01SMichael Kruse // CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 3, [[COND_TRUE]] ], [ [[TMP2]], [[COND_FALSE]] ] 25780865c01SMichael Kruse // CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4 25880865c01SMichael Kruse // CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4 25980865c01SMichael Kruse // CHECK1-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 4 26080865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 26180865c01SMichael Kruse // CHECK1: omp.inner.for.cond: 26280865c01SMichael Kruse // CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 26380865c01SMichael Kruse // CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 26480865c01SMichael Kruse // CHECK1-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]] 26580865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 26680865c01SMichael Kruse // CHECK1: omp.inner.for.body: 26780865c01SMichael Kruse // CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 26880865c01SMichael Kruse // CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 1 26980865c01SMichael Kruse // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]] 27080865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD]], ptr [[DOTFORWARD_IV_I]], align 4 27180865c01SMichael Kruse // CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 27280865c01SMichael Kruse // CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 3, [[TMP7]] 27380865c01SMichael Kruse // CHECK1-NEXT: store i32 [[SUB]], ptr [[DOTREVERSED_IV_I]], align 4 27480865c01SMichael Kruse // CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTREVERSED_IV_I]], align 4 27580865c01SMichael Kruse // CHECK1-NEXT: [[MUL2:%.*]] = mul nsw i32 [[TMP8]], 3 27680865c01SMichael Kruse // CHECK1-NEXT: [[ADD3:%.*]] = add nsw i32 7, [[MUL2]] 27780865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD3]], ptr [[I]], align 4 27880865c01SMichael Kruse // CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[I]], align 4 27980865c01SMichael Kruse // CHECK1-NEXT: call void (...) @body(i32 noundef [[TMP9]]) 28080865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 28180865c01SMichael Kruse // CHECK1: omp.body.continue: 28280865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 28380865c01SMichael Kruse // CHECK1: omp.inner.for.inc: 28480865c01SMichael Kruse // CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 28580865c01SMichael Kruse // CHECK1-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP10]], 1 28680865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_IV]], align 4 28780865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]] 28880865c01SMichael Kruse // CHECK1: omp.inner.for.end: 28980865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 29080865c01SMichael Kruse // CHECK1: omp.loop.exit: 29180865c01SMichael Kruse // CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP0]]) 29280865c01SMichael Kruse // CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3:[0-9]+]], i32 [[TMP0]]) 29380865c01SMichael Kruse // CHECK1-NEXT: ret void 29480865c01SMichael Kruse // 29580865c01SMichael Kruse // 29680865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@foo3 29780865c01SMichael Kruse // CHECK1-SAME: () #[[ATTR0]] { 29880865c01SMichael Kruse // CHECK1-NEXT: entry: 29980865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 30080865c01SMichael Kruse // CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4 30180865c01SMichael Kruse // CHECK1-NEXT: [[_TMP1:%.*]] = alloca i32, align 4 30280865c01SMichael Kruse // CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 4 30380865c01SMichael Kruse // CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4 30480865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 30580865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 30680865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 30780865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 30880865c01SMichael Kruse // CHECK1-NEXT: [[K:%.*]] = alloca i32, align 4 30980865c01SMichael Kruse // CHECK1-NEXT: [[DOTFORWARD_IV_I:%.*]] = alloca i32, align 4 31080865c01SMichael Kruse // CHECK1-NEXT: [[J:%.*]] = alloca i32, align 4 31180865c01SMichael Kruse // CHECK1-NEXT: [[DOTREVERSED_IV_I:%.*]] = alloca i32, align 4 31280865c01SMichael Kruse // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]]) 31380865c01SMichael Kruse // CHECK1-NEXT: store i32 7, ptr [[I]], align 4 31480865c01SMichael Kruse // CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4 31580865c01SMichael Kruse // CHECK1-NEXT: store i32 63, ptr [[DOTOMP_UB]], align 4 31680865c01SMichael Kruse // CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4 31780865c01SMichael Kruse // CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4 31880865c01SMichael Kruse // CHECK1-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) 31980865c01SMichael Kruse // CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 32080865c01SMichael Kruse // CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP1]], 63 32180865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 32280865c01SMichael Kruse // CHECK1: cond.true: 32380865c01SMichael Kruse // CHECK1-NEXT: br label [[COND_END:%.*]] 32480865c01SMichael Kruse // CHECK1: cond.false: 32580865c01SMichael Kruse // CHECK1-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 32680865c01SMichael Kruse // CHECK1-NEXT: br label [[COND_END]] 32780865c01SMichael Kruse // CHECK1: cond.end: 32880865c01SMichael Kruse // CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 63, [[COND_TRUE]] ], [ [[TMP2]], [[COND_FALSE]] ] 32980865c01SMichael Kruse // CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4 33080865c01SMichael Kruse // CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4 33180865c01SMichael Kruse // CHECK1-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 4 33280865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 33380865c01SMichael Kruse // CHECK1: omp.inner.for.cond: 33480865c01SMichael Kruse // CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 33580865c01SMichael Kruse // CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 33680865c01SMichael Kruse // CHECK1-NEXT: [[CMP3:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]] 33780865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 33880865c01SMichael Kruse // CHECK1: omp.inner.for.body: 33980865c01SMichael Kruse // CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 34080865c01SMichael Kruse // CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP6]], 16 34180865c01SMichael Kruse // CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[DIV]], 3 34280865c01SMichael Kruse // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 7, [[MUL]] 34380865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD]], ptr [[K]], align 4 34480865c01SMichael Kruse // CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 34580865c01SMichael Kruse // CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 34680865c01SMichael Kruse // CHECK1-NEXT: [[DIV4:%.*]] = sdiv i32 [[TMP8]], 16 34780865c01SMichael Kruse // CHECK1-NEXT: [[MUL5:%.*]] = mul nsw i32 [[DIV4]], 16 34880865c01SMichael Kruse // CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP7]], [[MUL5]] 34980865c01SMichael Kruse // CHECK1-NEXT: [[DIV6:%.*]] = sdiv i32 [[SUB]], 4 35080865c01SMichael Kruse // CHECK1-NEXT: [[MUL7:%.*]] = mul nsw i32 [[DIV6]], 1 35180865c01SMichael Kruse // CHECK1-NEXT: [[ADD8:%.*]] = add nsw i32 0, [[MUL7]] 35280865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD8]], ptr [[DOTFORWARD_IV_I]], align 4 35380865c01SMichael Kruse // CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 35480865c01SMichael Kruse // CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 35580865c01SMichael Kruse // CHECK1-NEXT: [[DIV9:%.*]] = sdiv i32 [[TMP10]], 16 35680865c01SMichael Kruse // CHECK1-NEXT: [[MUL10:%.*]] = mul nsw i32 [[DIV9]], 16 35780865c01SMichael Kruse // CHECK1-NEXT: [[SUB11:%.*]] = sub nsw i32 [[TMP9]], [[MUL10]] 35880865c01SMichael Kruse // CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 35980865c01SMichael Kruse // CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 36080865c01SMichael Kruse // CHECK1-NEXT: [[DIV12:%.*]] = sdiv i32 [[TMP12]], 16 36180865c01SMichael Kruse // CHECK1-NEXT: [[MUL13:%.*]] = mul nsw i32 [[DIV12]], 16 36280865c01SMichael Kruse // CHECK1-NEXT: [[SUB14:%.*]] = sub nsw i32 [[TMP11]], [[MUL13]] 36380865c01SMichael Kruse // CHECK1-NEXT: [[DIV15:%.*]] = sdiv i32 [[SUB14]], 4 36480865c01SMichael Kruse // CHECK1-NEXT: [[MUL16:%.*]] = mul nsw i32 [[DIV15]], 4 36580865c01SMichael Kruse // CHECK1-NEXT: [[SUB17:%.*]] = sub nsw i32 [[SUB11]], [[MUL16]] 36680865c01SMichael Kruse // CHECK1-NEXT: [[MUL18:%.*]] = mul nsw i32 [[SUB17]], 3 36780865c01SMichael Kruse // CHECK1-NEXT: [[ADD19:%.*]] = add nsw i32 7, [[MUL18]] 36880865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD19]], ptr [[J]], align 4 36980865c01SMichael Kruse // CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 37080865c01SMichael Kruse // CHECK1-NEXT: [[SUB20:%.*]] = sub nsw i32 3, [[TMP13]] 37180865c01SMichael Kruse // CHECK1-NEXT: store i32 [[SUB20]], ptr [[DOTREVERSED_IV_I]], align 4 37280865c01SMichael Kruse // CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTREVERSED_IV_I]], align 4 37380865c01SMichael Kruse // CHECK1-NEXT: [[MUL21:%.*]] = mul nsw i32 [[TMP14]], 3 37480865c01SMichael Kruse // CHECK1-NEXT: [[ADD22:%.*]] = add nsw i32 7, [[MUL21]] 37580865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD22]], ptr [[I]], align 4 37680865c01SMichael Kruse // CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[K]], align 4 37780865c01SMichael Kruse // CHECK1-NEXT: [[TMP16:%.*]] = load i32, ptr [[I]], align 4 37880865c01SMichael Kruse // CHECK1-NEXT: [[TMP17:%.*]] = load i32, ptr [[J]], align 4 37980865c01SMichael Kruse // CHECK1-NEXT: call void (...) @body(i32 noundef [[TMP15]], i32 noundef [[TMP16]], i32 noundef [[TMP17]]) 38080865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 38180865c01SMichael Kruse // CHECK1: omp.body.continue: 38280865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 38380865c01SMichael Kruse // CHECK1: omp.inner.for.inc: 38480865c01SMichael Kruse // CHECK1-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 38580865c01SMichael Kruse // CHECK1-NEXT: [[ADD23:%.*]] = add nsw i32 [[TMP18]], 1 38680865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD23]], ptr [[DOTOMP_IV]], align 4 38780865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]] 38880865c01SMichael Kruse // CHECK1: omp.inner.for.end: 38980865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 39080865c01SMichael Kruse // CHECK1: omp.loop.exit: 39180865c01SMichael Kruse // CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP0]]) 39280865c01SMichael Kruse // CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[TMP0]]) 39380865c01SMichael Kruse // CHECK1-NEXT: ret void 39480865c01SMichael Kruse // 39580865c01SMichael Kruse // 39680865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@foo4 39780865c01SMichael Kruse // CHECK1-SAME: () #[[ATTR0]] { 39880865c01SMichael Kruse // CHECK1-NEXT: entry: 39980865c01SMichael Kruse // CHECK1-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 0, ptr @foo4.omp_outlined) 40080865c01SMichael Kruse // CHECK1-NEXT: ret void 40180865c01SMichael Kruse // 40280865c01SMichael Kruse // 40380865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@foo4.omp_outlined 40480865c01SMichael Kruse // CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR4:[0-9]+]] { 40580865c01SMichael Kruse // CHECK1-NEXT: entry: 40680865c01SMichael Kruse // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 40780865c01SMichael Kruse // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 40880865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 40980865c01SMichael Kruse // CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4 41080865c01SMichael Kruse // CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4 41180865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 41280865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 41380865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 41480865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 41580865c01SMichael Kruse // CHECK1-NEXT: [[DOTFORWARD_IV_I:%.*]] = alloca i32, align 4 41680865c01SMichael Kruse // CHECK1-NEXT: [[DOTREVERSED_IV_I:%.*]] = alloca i32, align 4 41780865c01SMichael Kruse // CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 41880865c01SMichael Kruse // CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 41980865c01SMichael Kruse // CHECK1-NEXT: store i32 7, ptr [[I]], align 4 42080865c01SMichael Kruse // CHECK1-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4 42180865c01SMichael Kruse // CHECK1-NEXT: store i32 3, ptr [[DOTOMP_UB]], align 4 42280865c01SMichael Kruse // CHECK1-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4 42380865c01SMichael Kruse // CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4 42480865c01SMichael Kruse // CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 42580865c01SMichael Kruse // CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4 42680865c01SMichael Kruse // CHECK1-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1) 42780865c01SMichael Kruse // CHECK1-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 42880865c01SMichael Kruse // CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 3 42980865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 43080865c01SMichael Kruse // CHECK1: cond.true: 43180865c01SMichael Kruse // CHECK1-NEXT: br label [[COND_END:%.*]] 43280865c01SMichael Kruse // CHECK1: cond.false: 43380865c01SMichael Kruse // CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 43480865c01SMichael Kruse // CHECK1-NEXT: br label [[COND_END]] 43580865c01SMichael Kruse // CHECK1: cond.end: 43680865c01SMichael Kruse // CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 3, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ] 43780865c01SMichael Kruse // CHECK1-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4 43880865c01SMichael Kruse // CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4 43980865c01SMichael Kruse // CHECK1-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4 44080865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 44180865c01SMichael Kruse // CHECK1: omp.inner.for.cond: 44280865c01SMichael Kruse // CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 44380865c01SMichael Kruse // CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 44480865c01SMichael Kruse // CHECK1-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]] 44580865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 44680865c01SMichael Kruse // CHECK1: omp.inner.for.body: 44780865c01SMichael Kruse // CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 44880865c01SMichael Kruse // CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1 44980865c01SMichael Kruse // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]] 45080865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD]], ptr [[DOTFORWARD_IV_I]], align 4 45180865c01SMichael Kruse // CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 45280865c01SMichael Kruse // CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 3, [[TMP8]] 45380865c01SMichael Kruse // CHECK1-NEXT: store i32 [[SUB]], ptr [[DOTREVERSED_IV_I]], align 4 45480865c01SMichael Kruse // CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTREVERSED_IV_I]], align 4 45580865c01SMichael Kruse // CHECK1-NEXT: [[MUL2:%.*]] = mul nsw i32 [[TMP9]], 3 45680865c01SMichael Kruse // CHECK1-NEXT: [[ADD3:%.*]] = add nsw i32 7, [[MUL2]] 45780865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD3]], ptr [[I]], align 4 45880865c01SMichael Kruse // CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[I]], align 4 45980865c01SMichael Kruse // CHECK1-NEXT: call void (...) @body(i32 noundef [[TMP10]]) 46080865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 46180865c01SMichael Kruse // CHECK1: omp.body.continue: 46280865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 46380865c01SMichael Kruse // CHECK1: omp.inner.for.inc: 46480865c01SMichael Kruse // CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 46580865c01SMichael Kruse // CHECK1-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP11]], 1 46680865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_IV]], align 4 46780865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]] 46880865c01SMichael Kruse // CHECK1: omp.inner.for.end: 46980865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 47080865c01SMichael Kruse // CHECK1: omp.loop.exit: 47180865c01SMichael Kruse // CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]]) 47280865c01SMichael Kruse // CHECK1-NEXT: ret void 47380865c01SMichael Kruse // 47480865c01SMichael Kruse // 47580865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@tfoo5 47680865c01SMichael Kruse // CHECK1-SAME: () #[[ATTR0]] { 47780865c01SMichael Kruse // CHECK1-NEXT: entry: 47880865c01SMichael Kruse // CHECK1-NEXT: call void @_Z4foo5IiTnT_Li3EEvS0_S0_(i32 noundef 0, i32 noundef 42) 47980865c01SMichael Kruse // CHECK1-NEXT: ret void 48080865c01SMichael Kruse // 48180865c01SMichael Kruse // 48280865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@_Z4foo5IiTnT_Li3EEvS0_S0_ 48380865c01SMichael Kruse // CHECK1-SAME: (i32 noundef [[START:%.*]], i32 noundef [[END:%.*]]) #[[ATTR0]] comdat { 48480865c01SMichael Kruse // CHECK1-NEXT: entry: 48580865c01SMichael Kruse // CHECK1-NEXT: [[START_ADDR:%.*]] = alloca i32, align 4 48680865c01SMichael Kruse // CHECK1-NEXT: [[END_ADDR:%.*]] = alloca i32, align 4 48780865c01SMichael Kruse // CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4 48880865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 48980865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4 49080865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4 49180865c01SMichael Kruse // CHECK1-NEXT: [[DOTFORWARD_IV_I:%.*]] = alloca i32, align 4 49280865c01SMichael Kruse // CHECK1-NEXT: [[DOTREVERSED_IV_I:%.*]] = alloca i32, align 4 49380865c01SMichael Kruse // CHECK1-NEXT: store i32 [[START]], ptr [[START_ADDR]], align 4 49480865c01SMichael Kruse // CHECK1-NEXT: store i32 [[END]], ptr [[END_ADDR]], align 4 49580865c01SMichael Kruse // CHECK1-NEXT: [[TMP0:%.*]] = load i32, ptr [[START_ADDR]], align 4 49680865c01SMichael Kruse // CHECK1-NEXT: store i32 [[TMP0]], ptr [[I]], align 4 49780865c01SMichael Kruse // CHECK1-NEXT: [[TMP1:%.*]] = load i32, ptr [[START_ADDR]], align 4 49880865c01SMichael Kruse // CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTCAPTURE_EXPR_]], align 4 49980865c01SMichael Kruse // CHECK1-NEXT: [[TMP2:%.*]] = load i32, ptr [[END_ADDR]], align 4 50080865c01SMichael Kruse // CHECK1-NEXT: store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR_1]], align 4 50180865c01SMichael Kruse // CHECK1-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4 50280865c01SMichael Kruse // CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4 50380865c01SMichael Kruse // CHECK1-NEXT: [[SUB:%.*]] = sub i32 [[TMP3]], [[TMP4]] 50480865c01SMichael Kruse // CHECK1-NEXT: [[SUB3:%.*]] = sub i32 [[SUB]], 1 50580865c01SMichael Kruse // CHECK1-NEXT: [[ADD:%.*]] = add i32 [[SUB3]], 3 50680865c01SMichael Kruse // CHECK1-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], 3 50780865c01SMichael Kruse // CHECK1-NEXT: [[SUB4:%.*]] = sub i32 [[DIV]], 1 50880865c01SMichael Kruse // CHECK1-NEXT: store i32 [[SUB4]], ptr [[DOTCAPTURE_EXPR_2]], align 4 50980865c01SMichael Kruse // CHECK1-NEXT: store i32 0, ptr [[DOTFORWARD_IV_I]], align 4 51080865c01SMichael Kruse // CHECK1-NEXT: br label [[FOR_COND:%.*]] 51180865c01SMichael Kruse // CHECK1: for.cond: 51280865c01SMichael Kruse // CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 51380865c01SMichael Kruse // CHECK1-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4 51480865c01SMichael Kruse // CHECK1-NEXT: [[ADD5:%.*]] = add i32 [[TMP6]], 1 51580865c01SMichael Kruse // CHECK1-NEXT: [[CMP:%.*]] = icmp ult i32 [[TMP5]], [[ADD5]] 51680865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 51780865c01SMichael Kruse // CHECK1: for.body: 51880865c01SMichael Kruse // CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4 51980865c01SMichael Kruse // CHECK1-NEXT: [[ADD6:%.*]] = add i32 [[TMP7]], 1 52080865c01SMichael Kruse // CHECK1-NEXT: [[SUB7:%.*]] = sub i32 [[ADD6]], 1 52180865c01SMichael Kruse // CHECK1-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 52280865c01SMichael Kruse // CHECK1-NEXT: [[SUB8:%.*]] = sub i32 [[SUB7]], [[TMP8]] 52380865c01SMichael Kruse // CHECK1-NEXT: store i32 [[SUB8]], ptr [[DOTREVERSED_IV_I]], align 4 52480865c01SMichael Kruse // CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4 52580865c01SMichael Kruse // CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTREVERSED_IV_I]], align 4 52680865c01SMichael Kruse // CHECK1-NEXT: [[MUL:%.*]] = mul i32 [[TMP10]], 3 52780865c01SMichael Kruse // CHECK1-NEXT: [[ADD9:%.*]] = add i32 [[TMP9]], [[MUL]] 52880865c01SMichael Kruse // CHECK1-NEXT: store i32 [[ADD9]], ptr [[I]], align 4 52980865c01SMichael Kruse // CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[I]], align 4 53080865c01SMichael Kruse // CHECK1-NEXT: call void (...) @body(i32 noundef [[TMP11]]) 53180865c01SMichael Kruse // CHECK1-NEXT: br label [[FOR_INC:%.*]] 53280865c01SMichael Kruse // CHECK1: for.inc: 53380865c01SMichael Kruse // CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 53480865c01SMichael Kruse // CHECK1-NEXT: [[INC:%.*]] = add i32 [[TMP12]], 1 53580865c01SMichael Kruse // CHECK1-NEXT: store i32 [[INC]], ptr [[DOTFORWARD_IV_I]], align 4 53680865c01SMichael Kruse // CHECK1-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP8:![0-9]+]] 53780865c01SMichael Kruse // CHECK1: for.end: 53880865c01SMichael Kruse // CHECK1-NEXT: ret void 53980865c01SMichael Kruse // 54080865c01SMichael Kruse // 54180865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@foo6 54280865c01SMichael Kruse // CHECK1-SAME: () #[[ATTR0]] { 54380865c01SMichael Kruse // CHECK1-NEXT: entry: 54480865c01SMichael Kruse // CHECK1-NEXT: [[ARR:%.*]] = alloca [128 x double], align 16 54580865c01SMichael Kruse // CHECK1-NEXT: [[C:%.*]] = alloca i32, align 4 54680865c01SMichael Kruse // CHECK1-NEXT: [[__RANGE2:%.*]] = alloca ptr, align 8 54780865c01SMichael Kruse // CHECK1-NEXT: [[__END2:%.*]] = alloca ptr, align 8 54880865c01SMichael Kruse // CHECK1-NEXT: [[__BEGIN2:%.*]] = alloca ptr, align 8 54980865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca ptr, align 8 55080865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_3:%.*]] = alloca ptr, align 8 55180865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_4:%.*]] = alloca i64, align 8 55280865c01SMichael Kruse // CHECK1-NEXT: [[DOTFORWARD_IV___BEGIN2:%.*]] = alloca i64, align 8 55380865c01SMichael Kruse // CHECK1-NEXT: [[DOTREVERSED_IV___BEGIN2:%.*]] = alloca i64, align 8 55480865c01SMichael Kruse // CHECK1-NEXT: [[V:%.*]] = alloca ptr, align 8 55580865c01SMichael Kruse // CHECK1-NEXT: store i32 42, ptr [[C]], align 4 55680865c01SMichael Kruse // CHECK1-NEXT: store ptr [[ARR]], ptr [[__RANGE2]], align 8 55780865c01SMichael Kruse // CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__RANGE2]], align 8 55880865c01SMichael Kruse // CHECK1-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [128 x double], ptr [[TMP0]], i64 0, i64 0 55980865c01SMichael Kruse // CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds double, ptr [[ARRAYDECAY]], i64 128 56080865c01SMichael Kruse // CHECK1-NEXT: store ptr [[ADD_PTR]], ptr [[__END2]], align 8 56180865c01SMichael Kruse // CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[__RANGE2]], align 8 56280865c01SMichael Kruse // CHECK1-NEXT: [[ARRAYDECAY1:%.*]] = getelementptr inbounds [128 x double], ptr [[TMP1]], i64 0, i64 0 56380865c01SMichael Kruse // CHECK1-NEXT: store ptr [[ARRAYDECAY1]], ptr [[__BEGIN2]], align 8 56480865c01SMichael Kruse // CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[__RANGE2]], align 8 56580865c01SMichael Kruse // CHECK1-NEXT: [[ARRAYDECAY2:%.*]] = getelementptr inbounds [128 x double], ptr [[TMP2]], i64 0, i64 0 56680865c01SMichael Kruse // CHECK1-NEXT: store ptr [[ARRAYDECAY2]], ptr [[DOTCAPTURE_EXPR_]], align 8 56780865c01SMichael Kruse // CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[__END2]], align 8 56880865c01SMichael Kruse // CHECK1-NEXT: store ptr [[TMP3]], ptr [[DOTCAPTURE_EXPR_3]], align 8 56980865c01SMichael Kruse // CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTCAPTURE_EXPR_3]], align 8 57080865c01SMichael Kruse // CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTCAPTURE_EXPR_]], align 8 57180865c01SMichael Kruse // CHECK1-NEXT: [[SUB_PTR_LHS_CAST:%.*]] = ptrtoint ptr [[TMP4]] to i64 57280865c01SMichael Kruse // CHECK1-NEXT: [[SUB_PTR_RHS_CAST:%.*]] = ptrtoint ptr [[TMP5]] to i64 57380865c01SMichael Kruse // CHECK1-NEXT: [[SUB_PTR_SUB:%.*]] = sub i64 [[SUB_PTR_LHS_CAST]], [[SUB_PTR_RHS_CAST]] 57480865c01SMichael Kruse // CHECK1-NEXT: [[SUB_PTR_DIV:%.*]] = sdiv exact i64 [[SUB_PTR_SUB]], 8 57580865c01SMichael Kruse // CHECK1-NEXT: [[SUB:%.*]] = sub nsw i64 [[SUB_PTR_DIV]], 1 57680865c01SMichael Kruse // CHECK1-NEXT: [[ADD:%.*]] = add nsw i64 [[SUB]], 1 57780865c01SMichael Kruse // CHECK1-NEXT: [[DIV:%.*]] = sdiv i64 [[ADD]], 1 57880865c01SMichael Kruse // CHECK1-NEXT: [[SUB5:%.*]] = sub nsw i64 [[DIV]], 1 57980865c01SMichael Kruse // CHECK1-NEXT: store i64 [[SUB5]], ptr [[DOTCAPTURE_EXPR_4]], align 8 58080865c01SMichael Kruse // CHECK1-NEXT: store i64 0, ptr [[DOTFORWARD_IV___BEGIN2]], align 8 58180865c01SMichael Kruse // CHECK1-NEXT: br label [[FOR_COND:%.*]] 58280865c01SMichael Kruse // CHECK1: for.cond: 58380865c01SMichael Kruse // CHECK1-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTFORWARD_IV___BEGIN2]], align 8 58480865c01SMichael Kruse // CHECK1-NEXT: [[TMP7:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_4]], align 8 58580865c01SMichael Kruse // CHECK1-NEXT: [[ADD6:%.*]] = add nsw i64 [[TMP7]], 1 58680865c01SMichael Kruse // CHECK1-NEXT: [[CMP:%.*]] = icmp slt i64 [[TMP6]], [[ADD6]] 58780865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 58880865c01SMichael Kruse // CHECK1: for.body: 58980865c01SMichael Kruse // CHECK1-NEXT: [[TMP8:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_4]], align 8 59080865c01SMichael Kruse // CHECK1-NEXT: [[ADD7:%.*]] = add nsw i64 [[TMP8]], 1 59180865c01SMichael Kruse // CHECK1-NEXT: [[SUB8:%.*]] = sub nsw i64 [[ADD7]], 1 59280865c01SMichael Kruse // CHECK1-NEXT: [[TMP9:%.*]] = load i64, ptr [[DOTFORWARD_IV___BEGIN2]], align 8 59380865c01SMichael Kruse // CHECK1-NEXT: [[SUB9:%.*]] = sub nsw i64 [[SUB8]], [[TMP9]] 59480865c01SMichael Kruse // CHECK1-NEXT: store i64 [[SUB9]], ptr [[DOTREVERSED_IV___BEGIN2]], align 8 59580865c01SMichael Kruse // CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DOTCAPTURE_EXPR_]], align 8 59680865c01SMichael Kruse // CHECK1-NEXT: [[TMP11:%.*]] = load i64, ptr [[DOTREVERSED_IV___BEGIN2]], align 8 59780865c01SMichael Kruse // CHECK1-NEXT: [[MUL:%.*]] = mul nsw i64 [[TMP11]], 1 59880865c01SMichael Kruse // CHECK1-NEXT: [[ADD_PTR10:%.*]] = getelementptr inbounds double, ptr [[TMP10]], i64 [[MUL]] 59980865c01SMichael Kruse // CHECK1-NEXT: store ptr [[ADD_PTR10]], ptr [[__BEGIN2]], align 8 60080865c01SMichael Kruse // CHECK1-NEXT: [[TMP12:%.*]] = load ptr, ptr [[__BEGIN2]], align 8 60180865c01SMichael Kruse // CHECK1-NEXT: store ptr [[TMP12]], ptr [[V]], align 8 60280865c01SMichael Kruse // CHECK1-NEXT: [[TMP13:%.*]] = load ptr, ptr [[V]], align 8 60380865c01SMichael Kruse // CHECK1-NEXT: [[TMP14:%.*]] = load double, ptr [[TMP13]], align 8 60480865c01SMichael Kruse // CHECK1-NEXT: [[TMP15:%.*]] = load i32, ptr [[C]], align 4 60580865c01SMichael Kruse // CHECK1-NEXT: call void (...) @body(double noundef [[TMP14]], i32 noundef [[TMP15]]) 60680865c01SMichael Kruse // CHECK1-NEXT: br label [[FOR_INC:%.*]] 60780865c01SMichael Kruse // CHECK1: for.inc: 60880865c01SMichael Kruse // CHECK1-NEXT: [[TMP16:%.*]] = load i64, ptr [[DOTFORWARD_IV___BEGIN2]], align 8 60980865c01SMichael Kruse // CHECK1-NEXT: [[INC:%.*]] = add nsw i64 [[TMP16]], 1 61080865c01SMichael Kruse // CHECK1-NEXT: store i64 [[INC]], ptr [[DOTFORWARD_IV___BEGIN2]], align 8 61180865c01SMichael Kruse // CHECK1-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP9:![0-9]+]] 61280865c01SMichael Kruse // CHECK1: for.end: 61380865c01SMichael Kruse // CHECK1-NEXT: ret void 61480865c01SMichael Kruse // 61580865c01SMichael Kruse // 61680865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@foo7 61780865c01SMichael Kruse // CHECK1-SAME: () #[[ATTR0]] { 61880865c01SMichael Kruse // CHECK1-NEXT: entry: 61980865c01SMichael Kruse // CHECK1-NEXT: [[A:%.*]] = alloca [128 x double], align 16 62080865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i64, align 8 62180865c01SMichael Kruse // CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4 62280865c01SMichael Kruse // CHECK1-NEXT: [[_TMP1:%.*]] = alloca i64, align 8 62380865c01SMichael Kruse // CHECK1-NEXT: [[_TMP2:%.*]] = alloca i32, align 4 62480865c01SMichael Kruse // CHECK1-NEXT: [[C:%.*]] = alloca i32, align 4 62580865c01SMichael Kruse // CHECK1-NEXT: [[__RANGE3:%.*]] = alloca ptr, align 8 62680865c01SMichael Kruse // CHECK1-NEXT: [[__END3:%.*]] = alloca ptr, align 8 62780865c01SMichael Kruse // CHECK1-NEXT: [[__BEGIN3:%.*]] = alloca ptr, align 8 62880865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca ptr, align 8 62980865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_5:%.*]] = alloca ptr, align 8 63080865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_6:%.*]] = alloca i64, align 8 63180865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_8:%.*]] = alloca i64, align 8 63280865c01SMichael Kruse // CHECK1-NEXT: [[DOTCAPTURE_EXPR_10:%.*]] = alloca i64, align 8 63380865c01SMichael Kruse // CHECK1-NEXT: [[K:%.*]] = alloca i32, align 4 63480865c01SMichael Kruse // CHECK1-NEXT: [[DOTFORWARD_IV___BEGIN3:%.*]] = alloca i64, align 8 63580865c01SMichael Kruse // CHECK1-NEXT: [[J:%.*]] = alloca i32, align 4 63680865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i64, align 8 63780865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i64, align 8 63880865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i64, align 8 63980865c01SMichael Kruse // CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 64080865c01SMichael Kruse // CHECK1-NEXT: [[K15:%.*]] = alloca i32, align 4 64180865c01SMichael Kruse // CHECK1-NEXT: [[DOTFORWARD_IV___BEGIN316:%.*]] = alloca i64, align 8 64280865c01SMichael Kruse // CHECK1-NEXT: [[J17:%.*]] = alloca i32, align 4 64380865c01SMichael Kruse // CHECK1-NEXT: [[DOTREVERSED_IV___BEGIN3:%.*]] = alloca i64, align 8 64480865c01SMichael Kruse // CHECK1-NEXT: [[V:%.*]] = alloca ptr, align 8 64580865c01SMichael Kruse // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]]) 64680865c01SMichael Kruse // CHECK1-NEXT: store i32 42, ptr [[C]], align 4 64780865c01SMichael Kruse // CHECK1-NEXT: store ptr [[A]], ptr [[__RANGE3]], align 8 64880865c01SMichael Kruse // CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[__RANGE3]], align 8 64980865c01SMichael Kruse // CHECK1-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [128 x double], ptr [[TMP1]], i64 0, i64 0 65080865c01SMichael Kruse // CHECK1-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds double, ptr [[ARRAYDECAY]], i64 128 65180865c01SMichael Kruse // CHECK1-NEXT: store ptr [[ADD_PTR]], ptr [[__END3]], align 8 65280865c01SMichael Kruse // CHECK1-NEXT: [[TMP2:%.*]] = load ptr, ptr [[__RANGE3]], align 8 65380865c01SMichael Kruse // CHECK1-NEXT: [[ARRAYDECAY3:%.*]] = getelementptr inbounds [128 x double], ptr [[TMP2]], i64 0, i64 0 65480865c01SMichael Kruse // CHECK1-NEXT: store ptr [[ARRAYDECAY3]], ptr [[__BEGIN3]], align 8 65580865c01SMichael Kruse // CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[__RANGE3]], align 8 65680865c01SMichael Kruse // CHECK1-NEXT: [[ARRAYDECAY4:%.*]] = getelementptr inbounds [128 x double], ptr [[TMP3]], i64 0, i64 0 65780865c01SMichael Kruse // CHECK1-NEXT: store ptr [[ARRAYDECAY4]], ptr [[DOTCAPTURE_EXPR_]], align 8 65880865c01SMichael Kruse // CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[__END3]], align 8 65980865c01SMichael Kruse // CHECK1-NEXT: store ptr [[TMP4]], ptr [[DOTCAPTURE_EXPR_5]], align 8 66080865c01SMichael Kruse // CHECK1-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTCAPTURE_EXPR_5]], align 8 66180865c01SMichael Kruse // CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTCAPTURE_EXPR_]], align 8 66280865c01SMichael Kruse // CHECK1-NEXT: [[SUB_PTR_LHS_CAST:%.*]] = ptrtoint ptr [[TMP5]] to i64 66380865c01SMichael Kruse // CHECK1-NEXT: [[SUB_PTR_RHS_CAST:%.*]] = ptrtoint ptr [[TMP6]] to i64 66480865c01SMichael Kruse // CHECK1-NEXT: [[SUB_PTR_SUB:%.*]] = sub i64 [[SUB_PTR_LHS_CAST]], [[SUB_PTR_RHS_CAST]] 66580865c01SMichael Kruse // CHECK1-NEXT: [[SUB_PTR_DIV:%.*]] = sdiv exact i64 [[SUB_PTR_SUB]], 8 66680865c01SMichael Kruse // CHECK1-NEXT: [[SUB:%.*]] = sub nsw i64 [[SUB_PTR_DIV]], 1 66780865c01SMichael Kruse // CHECK1-NEXT: [[ADD:%.*]] = add nsw i64 [[SUB]], 1 66880865c01SMichael Kruse // CHECK1-NEXT: [[DIV:%.*]] = sdiv i64 [[ADD]], 1 66980865c01SMichael Kruse // CHECK1-NEXT: [[SUB7:%.*]] = sub nsw i64 [[DIV]], 1 67080865c01SMichael Kruse // CHECK1-NEXT: store i64 [[SUB7]], ptr [[DOTCAPTURE_EXPR_6]], align 8 67180865c01SMichael Kruse // CHECK1-NEXT: [[TMP7:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_6]], align 8 67280865c01SMichael Kruse // CHECK1-NEXT: [[ADD9:%.*]] = add nsw i64 [[TMP7]], 1 67380865c01SMichael Kruse // CHECK1-NEXT: store i64 [[ADD9]], ptr [[DOTCAPTURE_EXPR_8]], align 8 67480865c01SMichael Kruse // CHECK1-NEXT: [[TMP8:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 67580865c01SMichael Kruse // CHECK1-NEXT: [[SUB11:%.*]] = sub nsw i64 [[TMP8]], 0 67680865c01SMichael Kruse // CHECK1-NEXT: [[DIV12:%.*]] = sdiv i64 [[SUB11]], 1 67780865c01SMichael Kruse // CHECK1-NEXT: [[MUL:%.*]] = mul nsw i64 4, [[DIV12]] 67880865c01SMichael Kruse // CHECK1-NEXT: [[MUL13:%.*]] = mul nsw i64 [[MUL]], 4 67980865c01SMichael Kruse // CHECK1-NEXT: [[SUB14:%.*]] = sub nsw i64 [[MUL13]], 1 68080865c01SMichael Kruse // CHECK1-NEXT: store i64 [[SUB14]], ptr [[DOTCAPTURE_EXPR_10]], align 8 68180865c01SMichael Kruse // CHECK1-NEXT: store i32 7, ptr [[K]], align 4 68280865c01SMichael Kruse // CHECK1-NEXT: store i64 0, ptr [[DOTFORWARD_IV___BEGIN3]], align 8 68380865c01SMichael Kruse // CHECK1-NEXT: store i32 7, ptr [[J]], align 4 68480865c01SMichael Kruse // CHECK1-NEXT: [[TMP9:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 68580865c01SMichael Kruse // CHECK1-NEXT: [[CMP:%.*]] = icmp slt i64 0, [[TMP9]] 68680865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]] 68780865c01SMichael Kruse // CHECK1: omp.precond.then: 68880865c01SMichael Kruse // CHECK1-NEXT: store i64 0, ptr [[DOTOMP_LB]], align 8 68980865c01SMichael Kruse // CHECK1-NEXT: [[TMP10:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_10]], align 8 69080865c01SMichael Kruse // CHECK1-NEXT: store i64 [[TMP10]], ptr [[DOTOMP_UB]], align 8 69180865c01SMichael Kruse // CHECK1-NEXT: store i64 1, ptr [[DOTOMP_STRIDE]], align 8 69280865c01SMichael Kruse // CHECK1-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4 69380865c01SMichael Kruse // CHECK1-NEXT: call void @__kmpc_for_static_init_8(ptr @[[GLOB1]], i32 [[TMP0]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i64 1, i64 1) 69480865c01SMichael Kruse // CHECK1-NEXT: [[TMP11:%.*]] = load i64, ptr [[DOTOMP_UB]], align 8 69580865c01SMichael Kruse // CHECK1-NEXT: [[TMP12:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_10]], align 8 69680865c01SMichael Kruse // CHECK1-NEXT: [[CMP18:%.*]] = icmp sgt i64 [[TMP11]], [[TMP12]] 69780865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP18]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 69880865c01SMichael Kruse // CHECK1: cond.true: 69980865c01SMichael Kruse // CHECK1-NEXT: [[TMP13:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_10]], align 8 70080865c01SMichael Kruse // CHECK1-NEXT: br label [[COND_END:%.*]] 70180865c01SMichael Kruse // CHECK1: cond.false: 70280865c01SMichael Kruse // CHECK1-NEXT: [[TMP14:%.*]] = load i64, ptr [[DOTOMP_UB]], align 8 70380865c01SMichael Kruse // CHECK1-NEXT: br label [[COND_END]] 70480865c01SMichael Kruse // CHECK1: cond.end: 70580865c01SMichael Kruse // CHECK1-NEXT: [[COND:%.*]] = phi i64 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ] 70680865c01SMichael Kruse // CHECK1-NEXT: store i64 [[COND]], ptr [[DOTOMP_UB]], align 8 70780865c01SMichael Kruse // CHECK1-NEXT: [[TMP15:%.*]] = load i64, ptr [[DOTOMP_LB]], align 8 70880865c01SMichael Kruse // CHECK1-NEXT: store i64 [[TMP15]], ptr [[DOTOMP_IV]], align 8 70980865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 71080865c01SMichael Kruse // CHECK1: omp.inner.for.cond: 71180865c01SMichael Kruse // CHECK1-NEXT: [[TMP16:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 71280865c01SMichael Kruse // CHECK1-NEXT: [[TMP17:%.*]] = load i64, ptr [[DOTOMP_UB]], align 8 71380865c01SMichael Kruse // CHECK1-NEXT: [[CMP19:%.*]] = icmp sle i64 [[TMP16]], [[TMP17]] 71480865c01SMichael Kruse // CHECK1-NEXT: br i1 [[CMP19]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 71580865c01SMichael Kruse // CHECK1: omp.inner.for.body: 71680865c01SMichael Kruse // CHECK1-NEXT: [[TMP18:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 71780865c01SMichael Kruse // CHECK1-NEXT: [[TMP19:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 71880865c01SMichael Kruse // CHECK1-NEXT: [[SUB20:%.*]] = sub nsw i64 [[TMP19]], 0 71980865c01SMichael Kruse // CHECK1-NEXT: [[DIV21:%.*]] = sdiv i64 [[SUB20]], 1 72080865c01SMichael Kruse // CHECK1-NEXT: [[MUL22:%.*]] = mul nsw i64 1, [[DIV21]] 72180865c01SMichael Kruse // CHECK1-NEXT: [[MUL23:%.*]] = mul nsw i64 [[MUL22]], 4 72280865c01SMichael Kruse // CHECK1-NEXT: [[DIV24:%.*]] = sdiv i64 [[TMP18]], [[MUL23]] 72380865c01SMichael Kruse // CHECK1-NEXT: [[MUL25:%.*]] = mul nsw i64 [[DIV24]], 3 72480865c01SMichael Kruse // CHECK1-NEXT: [[ADD26:%.*]] = add nsw i64 7, [[MUL25]] 72580865c01SMichael Kruse // CHECK1-NEXT: [[CONV:%.*]] = trunc i64 [[ADD26]] to i32 72680865c01SMichael Kruse // CHECK1-NEXT: store i32 [[CONV]], ptr [[K15]], align 4 72780865c01SMichael Kruse // CHECK1-NEXT: [[TMP20:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 72880865c01SMichael Kruse // CHECK1-NEXT: [[TMP21:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 72980865c01SMichael Kruse // CHECK1-NEXT: [[TMP22:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 73080865c01SMichael Kruse // CHECK1-NEXT: [[SUB27:%.*]] = sub nsw i64 [[TMP22]], 0 73180865c01SMichael Kruse // CHECK1-NEXT: [[DIV28:%.*]] = sdiv i64 [[SUB27]], 1 73280865c01SMichael Kruse // CHECK1-NEXT: [[MUL29:%.*]] = mul nsw i64 1, [[DIV28]] 73380865c01SMichael Kruse // CHECK1-NEXT: [[MUL30:%.*]] = mul nsw i64 [[MUL29]], 4 73480865c01SMichael Kruse // CHECK1-NEXT: [[DIV31:%.*]] = sdiv i64 [[TMP21]], [[MUL30]] 73580865c01SMichael Kruse // CHECK1-NEXT: [[TMP23:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 73680865c01SMichael Kruse // CHECK1-NEXT: [[SUB32:%.*]] = sub nsw i64 [[TMP23]], 0 73780865c01SMichael Kruse // CHECK1-NEXT: [[DIV33:%.*]] = sdiv i64 [[SUB32]], 1 73880865c01SMichael Kruse // CHECK1-NEXT: [[MUL34:%.*]] = mul nsw i64 1, [[DIV33]] 73980865c01SMichael Kruse // CHECK1-NEXT: [[MUL35:%.*]] = mul nsw i64 [[MUL34]], 4 74080865c01SMichael Kruse // CHECK1-NEXT: [[MUL36:%.*]] = mul nsw i64 [[DIV31]], [[MUL35]] 74180865c01SMichael Kruse // CHECK1-NEXT: [[SUB37:%.*]] = sub nsw i64 [[TMP20]], [[MUL36]] 74280865c01SMichael Kruse // CHECK1-NEXT: [[DIV38:%.*]] = sdiv i64 [[SUB37]], 4 74380865c01SMichael Kruse // CHECK1-NEXT: [[MUL39:%.*]] = mul nsw i64 [[DIV38]], 1 74480865c01SMichael Kruse // CHECK1-NEXT: [[ADD40:%.*]] = add nsw i64 0, [[MUL39]] 74580865c01SMichael Kruse // CHECK1-NEXT: store i64 [[ADD40]], ptr [[DOTFORWARD_IV___BEGIN316]], align 8 74680865c01SMichael Kruse // CHECK1-NEXT: [[TMP24:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 74780865c01SMichael Kruse // CHECK1-NEXT: [[TMP25:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 74880865c01SMichael Kruse // CHECK1-NEXT: [[TMP26:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 74980865c01SMichael Kruse // CHECK1-NEXT: [[SUB41:%.*]] = sub nsw i64 [[TMP26]], 0 75080865c01SMichael Kruse // CHECK1-NEXT: [[DIV42:%.*]] = sdiv i64 [[SUB41]], 1 75180865c01SMichael Kruse // CHECK1-NEXT: [[MUL43:%.*]] = mul nsw i64 1, [[DIV42]] 75280865c01SMichael Kruse // CHECK1-NEXT: [[MUL44:%.*]] = mul nsw i64 [[MUL43]], 4 75380865c01SMichael Kruse // CHECK1-NEXT: [[DIV45:%.*]] = sdiv i64 [[TMP25]], [[MUL44]] 75480865c01SMichael Kruse // CHECK1-NEXT: [[TMP27:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 75580865c01SMichael Kruse // CHECK1-NEXT: [[SUB46:%.*]] = sub nsw i64 [[TMP27]], 0 75680865c01SMichael Kruse // CHECK1-NEXT: [[DIV47:%.*]] = sdiv i64 [[SUB46]], 1 75780865c01SMichael Kruse // CHECK1-NEXT: [[MUL48:%.*]] = mul nsw i64 1, [[DIV47]] 75880865c01SMichael Kruse // CHECK1-NEXT: [[MUL49:%.*]] = mul nsw i64 [[MUL48]], 4 75980865c01SMichael Kruse // CHECK1-NEXT: [[MUL50:%.*]] = mul nsw i64 [[DIV45]], [[MUL49]] 76080865c01SMichael Kruse // CHECK1-NEXT: [[SUB51:%.*]] = sub nsw i64 [[TMP24]], [[MUL50]] 76180865c01SMichael Kruse // CHECK1-NEXT: [[TMP28:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 76280865c01SMichael Kruse // CHECK1-NEXT: [[TMP29:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 76380865c01SMichael Kruse // CHECK1-NEXT: [[TMP30:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 76480865c01SMichael Kruse // CHECK1-NEXT: [[SUB52:%.*]] = sub nsw i64 [[TMP30]], 0 76580865c01SMichael Kruse // CHECK1-NEXT: [[DIV53:%.*]] = sdiv i64 [[SUB52]], 1 76680865c01SMichael Kruse // CHECK1-NEXT: [[MUL54:%.*]] = mul nsw i64 1, [[DIV53]] 76780865c01SMichael Kruse // CHECK1-NEXT: [[MUL55:%.*]] = mul nsw i64 [[MUL54]], 4 76880865c01SMichael Kruse // CHECK1-NEXT: [[DIV56:%.*]] = sdiv i64 [[TMP29]], [[MUL55]] 76980865c01SMichael Kruse // CHECK1-NEXT: [[TMP31:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 77080865c01SMichael Kruse // CHECK1-NEXT: [[SUB57:%.*]] = sub nsw i64 [[TMP31]], 0 77180865c01SMichael Kruse // CHECK1-NEXT: [[DIV58:%.*]] = sdiv i64 [[SUB57]], 1 77280865c01SMichael Kruse // CHECK1-NEXT: [[MUL59:%.*]] = mul nsw i64 1, [[DIV58]] 77380865c01SMichael Kruse // CHECK1-NEXT: [[MUL60:%.*]] = mul nsw i64 [[MUL59]], 4 77480865c01SMichael Kruse // CHECK1-NEXT: [[MUL61:%.*]] = mul nsw i64 [[DIV56]], [[MUL60]] 77580865c01SMichael Kruse // CHECK1-NEXT: [[SUB62:%.*]] = sub nsw i64 [[TMP28]], [[MUL61]] 77680865c01SMichael Kruse // CHECK1-NEXT: [[DIV63:%.*]] = sdiv i64 [[SUB62]], 4 77780865c01SMichael Kruse // CHECK1-NEXT: [[MUL64:%.*]] = mul nsw i64 [[DIV63]], 4 77880865c01SMichael Kruse // CHECK1-NEXT: [[SUB65:%.*]] = sub nsw i64 [[SUB51]], [[MUL64]] 77980865c01SMichael Kruse // CHECK1-NEXT: [[MUL66:%.*]] = mul nsw i64 [[SUB65]], 3 78080865c01SMichael Kruse // CHECK1-NEXT: [[ADD67:%.*]] = add nsw i64 7, [[MUL66]] 78180865c01SMichael Kruse // CHECK1-NEXT: [[CONV68:%.*]] = trunc i64 [[ADD67]] to i32 78280865c01SMichael Kruse // CHECK1-NEXT: store i32 [[CONV68]], ptr [[J17]], align 4 78380865c01SMichael Kruse // CHECK1-NEXT: [[TMP32:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_6]], align 8 78480865c01SMichael Kruse // CHECK1-NEXT: [[ADD69:%.*]] = add nsw i64 [[TMP32]], 1 78580865c01SMichael Kruse // CHECK1-NEXT: [[SUB70:%.*]] = sub nsw i64 [[ADD69]], 1 78680865c01SMichael Kruse // CHECK1-NEXT: [[TMP33:%.*]] = load i64, ptr [[DOTFORWARD_IV___BEGIN316]], align 8 78780865c01SMichael Kruse // CHECK1-NEXT: [[SUB71:%.*]] = sub nsw i64 [[SUB70]], [[TMP33]] 78880865c01SMichael Kruse // CHECK1-NEXT: store i64 [[SUB71]], ptr [[DOTREVERSED_IV___BEGIN3]], align 8 78980865c01SMichael Kruse // CHECK1-NEXT: [[TMP34:%.*]] = load ptr, ptr [[DOTCAPTURE_EXPR_]], align 8 79080865c01SMichael Kruse // CHECK1-NEXT: [[TMP35:%.*]] = load i64, ptr [[DOTREVERSED_IV___BEGIN3]], align 8 79180865c01SMichael Kruse // CHECK1-NEXT: [[MUL72:%.*]] = mul nsw i64 [[TMP35]], 1 79280865c01SMichael Kruse // CHECK1-NEXT: [[ADD_PTR73:%.*]] = getelementptr inbounds double, ptr [[TMP34]], i64 [[MUL72]] 79380865c01SMichael Kruse // CHECK1-NEXT: store ptr [[ADD_PTR73]], ptr [[__BEGIN3]], align 8 79480865c01SMichael Kruse // CHECK1-NEXT: [[TMP36:%.*]] = load ptr, ptr [[__BEGIN3]], align 8 79580865c01SMichael Kruse // CHECK1-NEXT: store ptr [[TMP36]], ptr [[V]], align 8 79680865c01SMichael Kruse // CHECK1-NEXT: [[TMP37:%.*]] = load i32, ptr [[K15]], align 4 79780865c01SMichael Kruse // CHECK1-NEXT: [[TMP38:%.*]] = load i32, ptr [[C]], align 4 79880865c01SMichael Kruse // CHECK1-NEXT: [[TMP39:%.*]] = load ptr, ptr [[V]], align 8 79980865c01SMichael Kruse // CHECK1-NEXT: [[TMP40:%.*]] = load double, ptr [[TMP39]], align 8 80080865c01SMichael Kruse // CHECK1-NEXT: [[TMP41:%.*]] = load i32, ptr [[J17]], align 4 80180865c01SMichael Kruse // CHECK1-NEXT: call void (...) @body(i32 noundef [[TMP37]], i32 noundef [[TMP38]], double noundef [[TMP40]], i32 noundef [[TMP41]]) 80280865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 80380865c01SMichael Kruse // CHECK1: omp.body.continue: 80480865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 80580865c01SMichael Kruse // CHECK1: omp.inner.for.inc: 80680865c01SMichael Kruse // CHECK1-NEXT: [[TMP42:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 80780865c01SMichael Kruse // CHECK1-NEXT: [[ADD74:%.*]] = add nsw i64 [[TMP42]], 1 80880865c01SMichael Kruse // CHECK1-NEXT: store i64 [[ADD74]], ptr [[DOTOMP_IV]], align 8 80980865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]] 81080865c01SMichael Kruse // CHECK1: omp.inner.for.end: 81180865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 81280865c01SMichael Kruse // CHECK1: omp.loop.exit: 81380865c01SMichael Kruse // CHECK1-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP0]]) 81480865c01SMichael Kruse // CHECK1-NEXT: br label [[OMP_PRECOND_END]] 81580865c01SMichael Kruse // CHECK1: omp.precond.end: 81680865c01SMichael Kruse // CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[TMP0]]) 81780865c01SMichael Kruse // CHECK1-NEXT: ret void 81880865c01SMichael Kruse // 81980865c01SMichael Kruse // 82080865c01SMichael Kruse // CHECK1-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_reverse_codegen.cpp 82180865c01SMichael Kruse // CHECK1-SAME: () #[[ATTR1]] section ".text.startup" { 82280865c01SMichael Kruse // CHECK1-NEXT: entry: 82380865c01SMichael Kruse // CHECK1-NEXT: call void @__cxx_global_var_init() 82480865c01SMichael Kruse // CHECK1-NEXT: ret void 82580865c01SMichael Kruse // 82680865c01SMichael Kruse // 82780865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@__cxx_global_var_init 82880865c01SMichael Kruse // CHECK2-SAME: () #[[ATTR0:[0-9]+]] section ".text.startup" { 82980865c01SMichael Kruse // CHECK2-NEXT: entry: 83080865c01SMichael Kruse // CHECK2-NEXT: call void @_ZN1SC1Ev(ptr noundef nonnull align 4 dereferenceable(4) @s) 83180865c01SMichael Kruse // CHECK2-NEXT: ret void 83280865c01SMichael Kruse // 83380865c01SMichael Kruse // 83480865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@_ZN1SC1Ev 83580865c01SMichael Kruse // CHECK2-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 { 83680865c01SMichael Kruse // CHECK2-NEXT: entry: 83780865c01SMichael Kruse // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 83880865c01SMichael Kruse // CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 83980865c01SMichael Kruse // CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 84080865c01SMichael Kruse // CHECK2-NEXT: call void @_ZN1SC2Ev(ptr noundef nonnull align 4 dereferenceable(4) [[THIS1]]) 84180865c01SMichael Kruse // CHECK2-NEXT: ret void 84280865c01SMichael Kruse // 84380865c01SMichael Kruse // 84480865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@_ZN1SC2Ev 84580865c01SMichael Kruse // CHECK2-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { 84680865c01SMichael Kruse // CHECK2-NEXT: entry: 84780865c01SMichael Kruse // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 84880865c01SMichael Kruse // CHECK2-NEXT: [[I2:%.*]] = alloca ptr, align 8 84980865c01SMichael Kruse // CHECK2-NEXT: [[DOTFORWARD_IV_I:%.*]] = alloca i32, align 4 85080865c01SMichael Kruse // CHECK2-NEXT: [[DOTREVERSED_IV_I:%.*]] = alloca i32, align 4 85180865c01SMichael Kruse // CHECK2-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8 85280865c01SMichael Kruse // CHECK2-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 853*94473f4dSHari Limaye // CHECK2-NEXT: [[I:%.*]] = getelementptr inbounds nuw [[STRUCT_S:%.*]], ptr [[THIS1]], i32 0, i32 0 85480865c01SMichael Kruse // CHECK2-NEXT: store i32 7, ptr [[I]], align 4 855*94473f4dSHari Limaye // CHECK2-NEXT: [[I3:%.*]] = getelementptr inbounds nuw [[STRUCT_S]], ptr [[THIS1]], i32 0, i32 0 85680865c01SMichael Kruse // CHECK2-NEXT: store ptr [[I3]], ptr [[I2]], align 8 85780865c01SMichael Kruse // CHECK2-NEXT: store i32 0, ptr [[DOTFORWARD_IV_I]], align 4 85880865c01SMichael Kruse // CHECK2-NEXT: br label [[FOR_COND:%.*]] 85980865c01SMichael Kruse // CHECK2: for.cond: 86080865c01SMichael Kruse // CHECK2-NEXT: [[TMP0:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 86180865c01SMichael Kruse // CHECK2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], 4 86280865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 86380865c01SMichael Kruse // CHECK2: for.body: 86480865c01SMichael Kruse // CHECK2-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 86580865c01SMichael Kruse // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 3, [[TMP1]] 86680865c01SMichael Kruse // CHECK2-NEXT: store i32 [[SUB]], ptr [[DOTREVERSED_IV_I]], align 4 86780865c01SMichael Kruse // CHECK2-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTREVERSED_IV_I]], align 4 86880865c01SMichael Kruse // CHECK2-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP2]], 3 86980865c01SMichael Kruse // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 7, [[MUL]] 87080865c01SMichael Kruse // CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[I2]], align 8 87180865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD]], ptr [[TMP3]], align 4 87280865c01SMichael Kruse // CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[I2]], align 8 87380865c01SMichael Kruse // CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4 87480865c01SMichael Kruse // CHECK2-NEXT: call void (...) @body(i32 noundef [[TMP5]]) 87580865c01SMichael Kruse // CHECK2-NEXT: br label [[FOR_INC:%.*]] 87680865c01SMichael Kruse // CHECK2: for.inc: 87780865c01SMichael Kruse // CHECK2-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 87880865c01SMichael Kruse // CHECK2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP6]], 1 87980865c01SMichael Kruse // CHECK2-NEXT: store i32 [[INC]], ptr [[DOTFORWARD_IV_I]], align 4 88080865c01SMichael Kruse // CHECK2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]] 88180865c01SMichael Kruse // CHECK2: for.end: 88280865c01SMichael Kruse // CHECK2-NEXT: ret void 88380865c01SMichael Kruse // 88480865c01SMichael Kruse // 88580865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@body 88680865c01SMichael Kruse // CHECK2-SAME: (...) #[[ATTR1]] { 88780865c01SMichael Kruse // CHECK2-NEXT: entry: 88880865c01SMichael Kruse // CHECK2-NEXT: ret void 88980865c01SMichael Kruse // 89080865c01SMichael Kruse // 89180865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@foo1 89280865c01SMichael Kruse // CHECK2-SAME: (i32 noundef [[START:%.*]], i32 noundef [[END:%.*]], i32 noundef [[STEP:%.*]]) #[[ATTR1]] { 89380865c01SMichael Kruse // CHECK2-NEXT: entry: 89480865c01SMichael Kruse // CHECK2-NEXT: [[START_ADDR:%.*]] = alloca i32, align 4 89580865c01SMichael Kruse // CHECK2-NEXT: [[END_ADDR:%.*]] = alloca i32, align 4 89680865c01SMichael Kruse // CHECK2-NEXT: [[STEP_ADDR:%.*]] = alloca i32, align 4 89780865c01SMichael Kruse // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 89880865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 89980865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4 90080865c01SMichael Kruse // CHECK2-NEXT: [[DOTNEW_STEP:%.*]] = alloca i32, align 4 90180865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4 90280865c01SMichael Kruse // CHECK2-NEXT: [[DOTFORWARD_IV_I:%.*]] = alloca i32, align 4 90380865c01SMichael Kruse // CHECK2-NEXT: [[DOTREVERSED_IV_I:%.*]] = alloca i32, align 4 90480865c01SMichael Kruse // CHECK2-NEXT: store i32 [[START]], ptr [[START_ADDR]], align 4 90580865c01SMichael Kruse // CHECK2-NEXT: store i32 [[END]], ptr [[END_ADDR]], align 4 90680865c01SMichael Kruse // CHECK2-NEXT: store i32 [[STEP]], ptr [[STEP_ADDR]], align 4 90780865c01SMichael Kruse // CHECK2-NEXT: [[TMP0:%.*]] = load i32, ptr [[START_ADDR]], align 4 90880865c01SMichael Kruse // CHECK2-NEXT: store i32 [[TMP0]], ptr [[I]], align 4 90980865c01SMichael Kruse // CHECK2-NEXT: [[TMP1:%.*]] = load i32, ptr [[START_ADDR]], align 4 91080865c01SMichael Kruse // CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTCAPTURE_EXPR_]], align 4 91180865c01SMichael Kruse // CHECK2-NEXT: [[TMP2:%.*]] = load i32, ptr [[END_ADDR]], align 4 91280865c01SMichael Kruse // CHECK2-NEXT: store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR_1]], align 4 91380865c01SMichael Kruse // CHECK2-NEXT: [[TMP3:%.*]] = load i32, ptr [[STEP_ADDR]], align 4 91480865c01SMichael Kruse // CHECK2-NEXT: store i32 [[TMP3]], ptr [[DOTNEW_STEP]], align 4 91580865c01SMichael Kruse // CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4 91680865c01SMichael Kruse // CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4 91780865c01SMichael Kruse // CHECK2-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], [[TMP5]] 91880865c01SMichael Kruse // CHECK2-NEXT: [[SUB3:%.*]] = sub i32 [[SUB]], 1 91980865c01SMichael Kruse // CHECK2-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTNEW_STEP]], align 4 92080865c01SMichael Kruse // CHECK2-NEXT: [[ADD:%.*]] = add i32 [[SUB3]], [[TMP6]] 92180865c01SMichael Kruse // CHECK2-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTNEW_STEP]], align 4 92280865c01SMichael Kruse // CHECK2-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP7]] 92380865c01SMichael Kruse // CHECK2-NEXT: [[SUB4:%.*]] = sub i32 [[DIV]], 1 92480865c01SMichael Kruse // CHECK2-NEXT: store i32 [[SUB4]], ptr [[DOTCAPTURE_EXPR_2]], align 4 92580865c01SMichael Kruse // CHECK2-NEXT: store i32 0, ptr [[DOTFORWARD_IV_I]], align 4 92680865c01SMichael Kruse // CHECK2-NEXT: br label [[FOR_COND:%.*]] 92780865c01SMichael Kruse // CHECK2: for.cond: 92880865c01SMichael Kruse // CHECK2-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 92980865c01SMichael Kruse // CHECK2-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4 93080865c01SMichael Kruse // CHECK2-NEXT: [[ADD5:%.*]] = add i32 [[TMP9]], 1 93180865c01SMichael Kruse // CHECK2-NEXT: [[CMP:%.*]] = icmp ult i32 [[TMP8]], [[ADD5]] 93280865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 93380865c01SMichael Kruse // CHECK2: for.body: 93480865c01SMichael Kruse // CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4 93580865c01SMichael Kruse // CHECK2-NEXT: [[ADD6:%.*]] = add i32 [[TMP10]], 1 93680865c01SMichael Kruse // CHECK2-NEXT: [[SUB7:%.*]] = sub i32 [[ADD6]], 1 93780865c01SMichael Kruse // CHECK2-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 93880865c01SMichael Kruse // CHECK2-NEXT: [[SUB8:%.*]] = sub i32 [[SUB7]], [[TMP11]] 93980865c01SMichael Kruse // CHECK2-NEXT: store i32 [[SUB8]], ptr [[DOTREVERSED_IV_I]], align 4 94080865c01SMichael Kruse // CHECK2-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4 94180865c01SMichael Kruse // CHECK2-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTREVERSED_IV_I]], align 4 94280865c01SMichael Kruse // CHECK2-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTNEW_STEP]], align 4 94380865c01SMichael Kruse // CHECK2-NEXT: [[MUL:%.*]] = mul i32 [[TMP13]], [[TMP14]] 94480865c01SMichael Kruse // CHECK2-NEXT: [[ADD9:%.*]] = add i32 [[TMP12]], [[MUL]] 94580865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD9]], ptr [[I]], align 4 94680865c01SMichael Kruse // CHECK2-NEXT: [[TMP15:%.*]] = load i32, ptr [[I]], align 4 94780865c01SMichael Kruse // CHECK2-NEXT: call void (...) @body(i32 noundef [[TMP15]]) 94880865c01SMichael Kruse // CHECK2-NEXT: br label [[FOR_INC:%.*]] 94980865c01SMichael Kruse // CHECK2: for.inc: 95080865c01SMichael Kruse // CHECK2-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 95180865c01SMichael Kruse // CHECK2-NEXT: [[INC:%.*]] = add i32 [[TMP16]], 1 95280865c01SMichael Kruse // CHECK2-NEXT: store i32 [[INC]], ptr [[DOTFORWARD_IV_I]], align 4 95380865c01SMichael Kruse // CHECK2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP5:![0-9]+]] 95480865c01SMichael Kruse // CHECK2: for.end: 95580865c01SMichael Kruse // CHECK2-NEXT: ret void 95680865c01SMichael Kruse // 95780865c01SMichael Kruse // 95880865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@foo2 95980865c01SMichael Kruse // CHECK2-SAME: () #[[ATTR1]] { 96080865c01SMichael Kruse // CHECK2-NEXT: entry: 96180865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 96280865c01SMichael Kruse // CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4 96380865c01SMichael Kruse // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 96480865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 96580865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 96680865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 96780865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 96880865c01SMichael Kruse // CHECK2-NEXT: [[DOTFORWARD_IV_I:%.*]] = alloca i32, align 4 96980865c01SMichael Kruse // CHECK2-NEXT: [[DOTREVERSED_IV_I:%.*]] = alloca i32, align 4 97080865c01SMichael Kruse // CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2:[0-9]+]]) 97180865c01SMichael Kruse // CHECK2-NEXT: store i32 7, ptr [[I]], align 4 97280865c01SMichael Kruse // CHECK2-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4 97380865c01SMichael Kruse // CHECK2-NEXT: store i32 3, ptr [[DOTOMP_UB]], align 4 97480865c01SMichael Kruse // CHECK2-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4 97580865c01SMichael Kruse // CHECK2-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4 97680865c01SMichael Kruse // CHECK2-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1:[0-9]+]], i32 [[TMP0]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1) 97780865c01SMichael Kruse // CHECK2-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 97880865c01SMichael Kruse // CHECK2-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP1]], 3 97980865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 98080865c01SMichael Kruse // CHECK2: cond.true: 98180865c01SMichael Kruse // CHECK2-NEXT: br label [[COND_END:%.*]] 98280865c01SMichael Kruse // CHECK2: cond.false: 98380865c01SMichael Kruse // CHECK2-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 98480865c01SMichael Kruse // CHECK2-NEXT: br label [[COND_END]] 98580865c01SMichael Kruse // CHECK2: cond.end: 98680865c01SMichael Kruse // CHECK2-NEXT: [[COND:%.*]] = phi i32 [ 3, [[COND_TRUE]] ], [ [[TMP2]], [[COND_FALSE]] ] 98780865c01SMichael Kruse // CHECK2-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4 98880865c01SMichael Kruse // CHECK2-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4 98980865c01SMichael Kruse // CHECK2-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 4 99080865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 99180865c01SMichael Kruse // CHECK2: omp.inner.for.cond: 99280865c01SMichael Kruse // CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 99380865c01SMichael Kruse // CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 99480865c01SMichael Kruse // CHECK2-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]] 99580865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 99680865c01SMichael Kruse // CHECK2: omp.inner.for.body: 99780865c01SMichael Kruse // CHECK2-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 99880865c01SMichael Kruse // CHECK2-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP6]], 1 99980865c01SMichael Kruse // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]] 100080865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD]], ptr [[DOTFORWARD_IV_I]], align 4 100180865c01SMichael Kruse // CHECK2-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 100280865c01SMichael Kruse // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 3, [[TMP7]] 100380865c01SMichael Kruse // CHECK2-NEXT: store i32 [[SUB]], ptr [[DOTREVERSED_IV_I]], align 4 100480865c01SMichael Kruse // CHECK2-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTREVERSED_IV_I]], align 4 100580865c01SMichael Kruse // CHECK2-NEXT: [[MUL2:%.*]] = mul nsw i32 [[TMP8]], 3 100680865c01SMichael Kruse // CHECK2-NEXT: [[ADD3:%.*]] = add nsw i32 7, [[MUL2]] 100780865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD3]], ptr [[I]], align 4 100880865c01SMichael Kruse // CHECK2-NEXT: [[TMP9:%.*]] = load i32, ptr [[I]], align 4 100980865c01SMichael Kruse // CHECK2-NEXT: call void (...) @body(i32 noundef [[TMP9]]) 101080865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 101180865c01SMichael Kruse // CHECK2: omp.body.continue: 101280865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 101380865c01SMichael Kruse // CHECK2: omp.inner.for.inc: 101480865c01SMichael Kruse // CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 101580865c01SMichael Kruse // CHECK2-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP10]], 1 101680865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_IV]], align 4 101780865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] 101880865c01SMichael Kruse // CHECK2: omp.inner.for.end: 101980865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 102080865c01SMichael Kruse // CHECK2: omp.loop.exit: 102180865c01SMichael Kruse // CHECK2-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP0]]) 102280865c01SMichael Kruse // CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3:[0-9]+]], i32 [[TMP0]]) 102380865c01SMichael Kruse // CHECK2-NEXT: ret void 102480865c01SMichael Kruse // 102580865c01SMichael Kruse // 102680865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@foo3 102780865c01SMichael Kruse // CHECK2-SAME: () #[[ATTR1]] { 102880865c01SMichael Kruse // CHECK2-NEXT: entry: 102980865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 103080865c01SMichael Kruse // CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4 103180865c01SMichael Kruse // CHECK2-NEXT: [[_TMP1:%.*]] = alloca i32, align 4 103280865c01SMichael Kruse // CHECK2-NEXT: [[_TMP2:%.*]] = alloca i32, align 4 103380865c01SMichael Kruse // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 103480865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 103580865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 103680865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 103780865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 103880865c01SMichael Kruse // CHECK2-NEXT: [[K:%.*]] = alloca i32, align 4 103980865c01SMichael Kruse // CHECK2-NEXT: [[DOTFORWARD_IV_I:%.*]] = alloca i32, align 4 104080865c01SMichael Kruse // CHECK2-NEXT: [[J:%.*]] = alloca i32, align 4 104180865c01SMichael Kruse // CHECK2-NEXT: [[DOTREVERSED_IV_I:%.*]] = alloca i32, align 4 104280865c01SMichael Kruse // CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]]) 104380865c01SMichael Kruse // CHECK2-NEXT: store i32 7, ptr [[I]], align 4 104480865c01SMichael Kruse // CHECK2-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4 104580865c01SMichael Kruse // CHECK2-NEXT: store i32 63, ptr [[DOTOMP_UB]], align 4 104680865c01SMichael Kruse // CHECK2-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4 104780865c01SMichael Kruse // CHECK2-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4 104880865c01SMichael Kruse // CHECK2-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) 104980865c01SMichael Kruse // CHECK2-NEXT: [[TMP1:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 105080865c01SMichael Kruse // CHECK2-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP1]], 63 105180865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 105280865c01SMichael Kruse // CHECK2: cond.true: 105380865c01SMichael Kruse // CHECK2-NEXT: br label [[COND_END:%.*]] 105480865c01SMichael Kruse // CHECK2: cond.false: 105580865c01SMichael Kruse // CHECK2-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 105680865c01SMichael Kruse // CHECK2-NEXT: br label [[COND_END]] 105780865c01SMichael Kruse // CHECK2: cond.end: 105880865c01SMichael Kruse // CHECK2-NEXT: [[COND:%.*]] = phi i32 [ 63, [[COND_TRUE]] ], [ [[TMP2]], [[COND_FALSE]] ] 105980865c01SMichael Kruse // CHECK2-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4 106080865c01SMichael Kruse // CHECK2-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4 106180865c01SMichael Kruse // CHECK2-NEXT: store i32 [[TMP3]], ptr [[DOTOMP_IV]], align 4 106280865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 106380865c01SMichael Kruse // CHECK2: omp.inner.for.cond: 106480865c01SMichael Kruse // CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 106580865c01SMichael Kruse // CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 106680865c01SMichael Kruse // CHECK2-NEXT: [[CMP3:%.*]] = icmp sle i32 [[TMP4]], [[TMP5]] 106780865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP3]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 106880865c01SMichael Kruse // CHECK2: omp.inner.for.body: 106980865c01SMichael Kruse // CHECK2-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 107080865c01SMichael Kruse // CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP6]], 16 107180865c01SMichael Kruse // CHECK2-NEXT: [[MUL:%.*]] = mul nsw i32 [[DIV]], 3 107280865c01SMichael Kruse // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 7, [[MUL]] 107380865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD]], ptr [[K]], align 4 107480865c01SMichael Kruse // CHECK2-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 107580865c01SMichael Kruse // CHECK2-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 107680865c01SMichael Kruse // CHECK2-NEXT: [[DIV4:%.*]] = sdiv i32 [[TMP8]], 16 107780865c01SMichael Kruse // CHECK2-NEXT: [[MUL5:%.*]] = mul nsw i32 [[DIV4]], 16 107880865c01SMichael Kruse // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP7]], [[MUL5]] 107980865c01SMichael Kruse // CHECK2-NEXT: [[DIV6:%.*]] = sdiv i32 [[SUB]], 4 108080865c01SMichael Kruse // CHECK2-NEXT: [[MUL7:%.*]] = mul nsw i32 [[DIV6]], 1 108180865c01SMichael Kruse // CHECK2-NEXT: [[ADD8:%.*]] = add nsw i32 0, [[MUL7]] 108280865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD8]], ptr [[DOTFORWARD_IV_I]], align 4 108380865c01SMichael Kruse // CHECK2-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 108480865c01SMichael Kruse // CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 108580865c01SMichael Kruse // CHECK2-NEXT: [[DIV9:%.*]] = sdiv i32 [[TMP10]], 16 108680865c01SMichael Kruse // CHECK2-NEXT: [[MUL10:%.*]] = mul nsw i32 [[DIV9]], 16 108780865c01SMichael Kruse // CHECK2-NEXT: [[SUB11:%.*]] = sub nsw i32 [[TMP9]], [[MUL10]] 108880865c01SMichael Kruse // CHECK2-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 108980865c01SMichael Kruse // CHECK2-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 109080865c01SMichael Kruse // CHECK2-NEXT: [[DIV12:%.*]] = sdiv i32 [[TMP12]], 16 109180865c01SMichael Kruse // CHECK2-NEXT: [[MUL13:%.*]] = mul nsw i32 [[DIV12]], 16 109280865c01SMichael Kruse // CHECK2-NEXT: [[SUB14:%.*]] = sub nsw i32 [[TMP11]], [[MUL13]] 109380865c01SMichael Kruse // CHECK2-NEXT: [[DIV15:%.*]] = sdiv i32 [[SUB14]], 4 109480865c01SMichael Kruse // CHECK2-NEXT: [[MUL16:%.*]] = mul nsw i32 [[DIV15]], 4 109580865c01SMichael Kruse // CHECK2-NEXT: [[SUB17:%.*]] = sub nsw i32 [[SUB11]], [[MUL16]] 109680865c01SMichael Kruse // CHECK2-NEXT: [[MUL18:%.*]] = mul nsw i32 [[SUB17]], 3 109780865c01SMichael Kruse // CHECK2-NEXT: [[ADD19:%.*]] = add nsw i32 7, [[MUL18]] 109880865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD19]], ptr [[J]], align 4 109980865c01SMichael Kruse // CHECK2-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 110080865c01SMichael Kruse // CHECK2-NEXT: [[SUB20:%.*]] = sub nsw i32 3, [[TMP13]] 110180865c01SMichael Kruse // CHECK2-NEXT: store i32 [[SUB20]], ptr [[DOTREVERSED_IV_I]], align 4 110280865c01SMichael Kruse // CHECK2-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTREVERSED_IV_I]], align 4 110380865c01SMichael Kruse // CHECK2-NEXT: [[MUL21:%.*]] = mul nsw i32 [[TMP14]], 3 110480865c01SMichael Kruse // CHECK2-NEXT: [[ADD22:%.*]] = add nsw i32 7, [[MUL21]] 110580865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD22]], ptr [[I]], align 4 110680865c01SMichael Kruse // CHECK2-NEXT: [[TMP15:%.*]] = load i32, ptr [[K]], align 4 110780865c01SMichael Kruse // CHECK2-NEXT: [[TMP16:%.*]] = load i32, ptr [[I]], align 4 110880865c01SMichael Kruse // CHECK2-NEXT: [[TMP17:%.*]] = load i32, ptr [[J]], align 4 110980865c01SMichael Kruse // CHECK2-NEXT: call void (...) @body(i32 noundef [[TMP15]], i32 noundef [[TMP16]], i32 noundef [[TMP17]]) 111080865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 111180865c01SMichael Kruse // CHECK2: omp.body.continue: 111280865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 111380865c01SMichael Kruse // CHECK2: omp.inner.for.inc: 111480865c01SMichael Kruse // CHECK2-NEXT: [[TMP18:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 111580865c01SMichael Kruse // CHECK2-NEXT: [[ADD23:%.*]] = add nsw i32 [[TMP18]], 1 111680865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD23]], ptr [[DOTOMP_IV]], align 4 111780865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] 111880865c01SMichael Kruse // CHECK2: omp.inner.for.end: 111980865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 112080865c01SMichael Kruse // CHECK2: omp.loop.exit: 112180865c01SMichael Kruse // CHECK2-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP0]]) 112280865c01SMichael Kruse // CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[TMP0]]) 112380865c01SMichael Kruse // CHECK2-NEXT: ret void 112480865c01SMichael Kruse // 112580865c01SMichael Kruse // 112680865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@foo4 112780865c01SMichael Kruse // CHECK2-SAME: () #[[ATTR1]] { 112880865c01SMichael Kruse // CHECK2-NEXT: entry: 112980865c01SMichael Kruse // CHECK2-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 0, ptr @foo4.omp_outlined) 113080865c01SMichael Kruse // CHECK2-NEXT: ret void 113180865c01SMichael Kruse // 113280865c01SMichael Kruse // 113380865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@foo4.omp_outlined 113480865c01SMichael Kruse // CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR4:[0-9]+]] { 113580865c01SMichael Kruse // CHECK2-NEXT: entry: 113680865c01SMichael Kruse // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 113780865c01SMichael Kruse // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 113880865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 113980865c01SMichael Kruse // CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4 114080865c01SMichael Kruse // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 114180865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 114280865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 114380865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 114480865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 114580865c01SMichael Kruse // CHECK2-NEXT: [[DOTFORWARD_IV_I:%.*]] = alloca i32, align 4 114680865c01SMichael Kruse // CHECK2-NEXT: [[DOTREVERSED_IV_I:%.*]] = alloca i32, align 4 114780865c01SMichael Kruse // CHECK2-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8 114880865c01SMichael Kruse // CHECK2-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8 114980865c01SMichael Kruse // CHECK2-NEXT: store i32 7, ptr [[I]], align 4 115080865c01SMichael Kruse // CHECK2-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4 115180865c01SMichael Kruse // CHECK2-NEXT: store i32 3, ptr [[DOTOMP_UB]], align 4 115280865c01SMichael Kruse // CHECK2-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4 115380865c01SMichael Kruse // CHECK2-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4 115480865c01SMichael Kruse // CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8 115580865c01SMichael Kruse // CHECK2-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4 115680865c01SMichael Kruse // CHECK2-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1) 115780865c01SMichael Kruse // CHECK2-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 115880865c01SMichael Kruse // CHECK2-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 3 115980865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 116080865c01SMichael Kruse // CHECK2: cond.true: 116180865c01SMichael Kruse // CHECK2-NEXT: br label [[COND_END:%.*]] 116280865c01SMichael Kruse // CHECK2: cond.false: 116380865c01SMichael Kruse // CHECK2-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 116480865c01SMichael Kruse // CHECK2-NEXT: br label [[COND_END]] 116580865c01SMichael Kruse // CHECK2: cond.end: 116680865c01SMichael Kruse // CHECK2-NEXT: [[COND:%.*]] = phi i32 [ 3, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ] 116780865c01SMichael Kruse // CHECK2-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4 116880865c01SMichael Kruse // CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4 116980865c01SMichael Kruse // CHECK2-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4 117080865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 117180865c01SMichael Kruse // CHECK2: omp.inner.for.cond: 117280865c01SMichael Kruse // CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 117380865c01SMichael Kruse // CHECK2-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4 117480865c01SMichael Kruse // CHECK2-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]] 117580865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 117680865c01SMichael Kruse // CHECK2: omp.inner.for.body: 117780865c01SMichael Kruse // CHECK2-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 117880865c01SMichael Kruse // CHECK2-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1 117980865c01SMichael Kruse // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]] 118080865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD]], ptr [[DOTFORWARD_IV_I]], align 4 118180865c01SMichael Kruse // CHECK2-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 118280865c01SMichael Kruse // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 3, [[TMP8]] 118380865c01SMichael Kruse // CHECK2-NEXT: store i32 [[SUB]], ptr [[DOTREVERSED_IV_I]], align 4 118480865c01SMichael Kruse // CHECK2-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTREVERSED_IV_I]], align 4 118580865c01SMichael Kruse // CHECK2-NEXT: [[MUL2:%.*]] = mul nsw i32 [[TMP9]], 3 118680865c01SMichael Kruse // CHECK2-NEXT: [[ADD3:%.*]] = add nsw i32 7, [[MUL2]] 118780865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD3]], ptr [[I]], align 4 118880865c01SMichael Kruse // CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[I]], align 4 118980865c01SMichael Kruse // CHECK2-NEXT: call void (...) @body(i32 noundef [[TMP10]]) 119080865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 119180865c01SMichael Kruse // CHECK2: omp.body.continue: 119280865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 119380865c01SMichael Kruse // CHECK2: omp.inner.for.inc: 119480865c01SMichael Kruse // CHECK2-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4 119580865c01SMichael Kruse // CHECK2-NEXT: [[ADD4:%.*]] = add nsw i32 [[TMP11]], 1 119680865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD4]], ptr [[DOTOMP_IV]], align 4 119780865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] 119880865c01SMichael Kruse // CHECK2: omp.inner.for.end: 119980865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 120080865c01SMichael Kruse // CHECK2: omp.loop.exit: 120180865c01SMichael Kruse // CHECK2-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]]) 120280865c01SMichael Kruse // CHECK2-NEXT: ret void 120380865c01SMichael Kruse // 120480865c01SMichael Kruse // 120580865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@foo6 120680865c01SMichael Kruse // CHECK2-SAME: () #[[ATTR1]] { 120780865c01SMichael Kruse // CHECK2-NEXT: entry: 120880865c01SMichael Kruse // CHECK2-NEXT: [[ARR:%.*]] = alloca [128 x double], align 16 120980865c01SMichael Kruse // CHECK2-NEXT: [[C:%.*]] = alloca i32, align 4 121080865c01SMichael Kruse // CHECK2-NEXT: [[__RANGE2:%.*]] = alloca ptr, align 8 121180865c01SMichael Kruse // CHECK2-NEXT: [[__END2:%.*]] = alloca ptr, align 8 121280865c01SMichael Kruse // CHECK2-NEXT: [[__BEGIN2:%.*]] = alloca ptr, align 8 121380865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca ptr, align 8 121480865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_3:%.*]] = alloca ptr, align 8 121580865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_4:%.*]] = alloca i64, align 8 121680865c01SMichael Kruse // CHECK2-NEXT: [[DOTFORWARD_IV___BEGIN2:%.*]] = alloca i64, align 8 121780865c01SMichael Kruse // CHECK2-NEXT: [[DOTREVERSED_IV___BEGIN2:%.*]] = alloca i64, align 8 121880865c01SMichael Kruse // CHECK2-NEXT: [[V:%.*]] = alloca ptr, align 8 121980865c01SMichael Kruse // CHECK2-NEXT: store i32 42, ptr [[C]], align 4 122080865c01SMichael Kruse // CHECK2-NEXT: store ptr [[ARR]], ptr [[__RANGE2]], align 8 122180865c01SMichael Kruse // CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__RANGE2]], align 8 122280865c01SMichael Kruse // CHECK2-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [128 x double], ptr [[TMP0]], i64 0, i64 0 122380865c01SMichael Kruse // CHECK2-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds double, ptr [[ARRAYDECAY]], i64 128 122480865c01SMichael Kruse // CHECK2-NEXT: store ptr [[ADD_PTR]], ptr [[__END2]], align 8 122580865c01SMichael Kruse // CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[__RANGE2]], align 8 122680865c01SMichael Kruse // CHECK2-NEXT: [[ARRAYDECAY1:%.*]] = getelementptr inbounds [128 x double], ptr [[TMP1]], i64 0, i64 0 122780865c01SMichael Kruse // CHECK2-NEXT: store ptr [[ARRAYDECAY1]], ptr [[__BEGIN2]], align 8 122880865c01SMichael Kruse // CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[__RANGE2]], align 8 122980865c01SMichael Kruse // CHECK2-NEXT: [[ARRAYDECAY2:%.*]] = getelementptr inbounds [128 x double], ptr [[TMP2]], i64 0, i64 0 123080865c01SMichael Kruse // CHECK2-NEXT: store ptr [[ARRAYDECAY2]], ptr [[DOTCAPTURE_EXPR_]], align 8 123180865c01SMichael Kruse // CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[__END2]], align 8 123280865c01SMichael Kruse // CHECK2-NEXT: store ptr [[TMP3]], ptr [[DOTCAPTURE_EXPR_3]], align 8 123380865c01SMichael Kruse // CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTCAPTURE_EXPR_3]], align 8 123480865c01SMichael Kruse // CHECK2-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTCAPTURE_EXPR_]], align 8 123580865c01SMichael Kruse // CHECK2-NEXT: [[SUB_PTR_LHS_CAST:%.*]] = ptrtoint ptr [[TMP4]] to i64 123680865c01SMichael Kruse // CHECK2-NEXT: [[SUB_PTR_RHS_CAST:%.*]] = ptrtoint ptr [[TMP5]] to i64 123780865c01SMichael Kruse // CHECK2-NEXT: [[SUB_PTR_SUB:%.*]] = sub i64 [[SUB_PTR_LHS_CAST]], [[SUB_PTR_RHS_CAST]] 123880865c01SMichael Kruse // CHECK2-NEXT: [[SUB_PTR_DIV:%.*]] = sdiv exact i64 [[SUB_PTR_SUB]], 8 123980865c01SMichael Kruse // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i64 [[SUB_PTR_DIV]], 1 124080865c01SMichael Kruse // CHECK2-NEXT: [[ADD:%.*]] = add nsw i64 [[SUB]], 1 124180865c01SMichael Kruse // CHECK2-NEXT: [[DIV:%.*]] = sdiv i64 [[ADD]], 1 124280865c01SMichael Kruse // CHECK2-NEXT: [[SUB5:%.*]] = sub nsw i64 [[DIV]], 1 124380865c01SMichael Kruse // CHECK2-NEXT: store i64 [[SUB5]], ptr [[DOTCAPTURE_EXPR_4]], align 8 124480865c01SMichael Kruse // CHECK2-NEXT: store i64 0, ptr [[DOTFORWARD_IV___BEGIN2]], align 8 124580865c01SMichael Kruse // CHECK2-NEXT: br label [[FOR_COND:%.*]] 124680865c01SMichael Kruse // CHECK2: for.cond: 124780865c01SMichael Kruse // CHECK2-NEXT: [[TMP6:%.*]] = load i64, ptr [[DOTFORWARD_IV___BEGIN2]], align 8 124880865c01SMichael Kruse // CHECK2-NEXT: [[TMP7:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_4]], align 8 124980865c01SMichael Kruse // CHECK2-NEXT: [[ADD6:%.*]] = add nsw i64 [[TMP7]], 1 125080865c01SMichael Kruse // CHECK2-NEXT: [[CMP:%.*]] = icmp slt i64 [[TMP6]], [[ADD6]] 125180865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 125280865c01SMichael Kruse // CHECK2: for.body: 125380865c01SMichael Kruse // CHECK2-NEXT: [[TMP8:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_4]], align 8 125480865c01SMichael Kruse // CHECK2-NEXT: [[ADD7:%.*]] = add nsw i64 [[TMP8]], 1 125580865c01SMichael Kruse // CHECK2-NEXT: [[SUB8:%.*]] = sub nsw i64 [[ADD7]], 1 125680865c01SMichael Kruse // CHECK2-NEXT: [[TMP9:%.*]] = load i64, ptr [[DOTFORWARD_IV___BEGIN2]], align 8 125780865c01SMichael Kruse // CHECK2-NEXT: [[SUB9:%.*]] = sub nsw i64 [[SUB8]], [[TMP9]] 125880865c01SMichael Kruse // CHECK2-NEXT: store i64 [[SUB9]], ptr [[DOTREVERSED_IV___BEGIN2]], align 8 125980865c01SMichael Kruse // CHECK2-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DOTCAPTURE_EXPR_]], align 8 126080865c01SMichael Kruse // CHECK2-NEXT: [[TMP11:%.*]] = load i64, ptr [[DOTREVERSED_IV___BEGIN2]], align 8 126180865c01SMichael Kruse // CHECK2-NEXT: [[MUL:%.*]] = mul nsw i64 [[TMP11]], 1 126280865c01SMichael Kruse // CHECK2-NEXT: [[ADD_PTR10:%.*]] = getelementptr inbounds double, ptr [[TMP10]], i64 [[MUL]] 126380865c01SMichael Kruse // CHECK2-NEXT: store ptr [[ADD_PTR10]], ptr [[__BEGIN2]], align 8 126480865c01SMichael Kruse // CHECK2-NEXT: [[TMP12:%.*]] = load ptr, ptr [[__BEGIN2]], align 8 126580865c01SMichael Kruse // CHECK2-NEXT: store ptr [[TMP12]], ptr [[V]], align 8 126680865c01SMichael Kruse // CHECK2-NEXT: [[TMP13:%.*]] = load ptr, ptr [[V]], align 8 126780865c01SMichael Kruse // CHECK2-NEXT: [[TMP14:%.*]] = load double, ptr [[TMP13]], align 8 126880865c01SMichael Kruse // CHECK2-NEXT: [[TMP15:%.*]] = load i32, ptr [[C]], align 4 126980865c01SMichael Kruse // CHECK2-NEXT: call void (...) @body(double noundef [[TMP14]], i32 noundef [[TMP15]]) 127080865c01SMichael Kruse // CHECK2-NEXT: br label [[FOR_INC:%.*]] 127180865c01SMichael Kruse // CHECK2: for.inc: 127280865c01SMichael Kruse // CHECK2-NEXT: [[TMP16:%.*]] = load i64, ptr [[DOTFORWARD_IV___BEGIN2]], align 8 127380865c01SMichael Kruse // CHECK2-NEXT: [[INC:%.*]] = add nsw i64 [[TMP16]], 1 127480865c01SMichael Kruse // CHECK2-NEXT: store i64 [[INC]], ptr [[DOTFORWARD_IV___BEGIN2]], align 8 127580865c01SMichael Kruse // CHECK2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP8:![0-9]+]] 127680865c01SMichael Kruse // CHECK2: for.end: 127780865c01SMichael Kruse // CHECK2-NEXT: ret void 127880865c01SMichael Kruse // 127980865c01SMichael Kruse // 128080865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@foo7 128180865c01SMichael Kruse // CHECK2-SAME: () #[[ATTR1]] { 128280865c01SMichael Kruse // CHECK2-NEXT: entry: 128380865c01SMichael Kruse // CHECK2-NEXT: [[A:%.*]] = alloca [128 x double], align 16 128480865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i64, align 8 128580865c01SMichael Kruse // CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4 128680865c01SMichael Kruse // CHECK2-NEXT: [[_TMP1:%.*]] = alloca i64, align 8 128780865c01SMichael Kruse // CHECK2-NEXT: [[_TMP2:%.*]] = alloca i32, align 4 128880865c01SMichael Kruse // CHECK2-NEXT: [[C:%.*]] = alloca i32, align 4 128980865c01SMichael Kruse // CHECK2-NEXT: [[__RANGE3:%.*]] = alloca ptr, align 8 129080865c01SMichael Kruse // CHECK2-NEXT: [[__END3:%.*]] = alloca ptr, align 8 129180865c01SMichael Kruse // CHECK2-NEXT: [[__BEGIN3:%.*]] = alloca ptr, align 8 129280865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca ptr, align 8 129380865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_5:%.*]] = alloca ptr, align 8 129480865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_6:%.*]] = alloca i64, align 8 129580865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_8:%.*]] = alloca i64, align 8 129680865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_10:%.*]] = alloca i64, align 8 129780865c01SMichael Kruse // CHECK2-NEXT: [[K:%.*]] = alloca i32, align 4 129880865c01SMichael Kruse // CHECK2-NEXT: [[DOTFORWARD_IV___BEGIN3:%.*]] = alloca i64, align 8 129980865c01SMichael Kruse // CHECK2-NEXT: [[J:%.*]] = alloca i32, align 4 130080865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_LB:%.*]] = alloca i64, align 8 130180865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_UB:%.*]] = alloca i64, align 8 130280865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i64, align 8 130380865c01SMichael Kruse // CHECK2-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 130480865c01SMichael Kruse // CHECK2-NEXT: [[K15:%.*]] = alloca i32, align 4 130580865c01SMichael Kruse // CHECK2-NEXT: [[DOTFORWARD_IV___BEGIN316:%.*]] = alloca i64, align 8 130680865c01SMichael Kruse // CHECK2-NEXT: [[J17:%.*]] = alloca i32, align 4 130780865c01SMichael Kruse // CHECK2-NEXT: [[DOTREVERSED_IV___BEGIN3:%.*]] = alloca i64, align 8 130880865c01SMichael Kruse // CHECK2-NEXT: [[V:%.*]] = alloca ptr, align 8 130980865c01SMichael Kruse // CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB2]]) 131080865c01SMichael Kruse // CHECK2-NEXT: store i32 42, ptr [[C]], align 4 131180865c01SMichael Kruse // CHECK2-NEXT: store ptr [[A]], ptr [[__RANGE3]], align 8 131280865c01SMichael Kruse // CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[__RANGE3]], align 8 131380865c01SMichael Kruse // CHECK2-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [128 x double], ptr [[TMP1]], i64 0, i64 0 131480865c01SMichael Kruse // CHECK2-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds double, ptr [[ARRAYDECAY]], i64 128 131580865c01SMichael Kruse // CHECK2-NEXT: store ptr [[ADD_PTR]], ptr [[__END3]], align 8 131680865c01SMichael Kruse // CHECK2-NEXT: [[TMP2:%.*]] = load ptr, ptr [[__RANGE3]], align 8 131780865c01SMichael Kruse // CHECK2-NEXT: [[ARRAYDECAY3:%.*]] = getelementptr inbounds [128 x double], ptr [[TMP2]], i64 0, i64 0 131880865c01SMichael Kruse // CHECK2-NEXT: store ptr [[ARRAYDECAY3]], ptr [[__BEGIN3]], align 8 131980865c01SMichael Kruse // CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[__RANGE3]], align 8 132080865c01SMichael Kruse // CHECK2-NEXT: [[ARRAYDECAY4:%.*]] = getelementptr inbounds [128 x double], ptr [[TMP3]], i64 0, i64 0 132180865c01SMichael Kruse // CHECK2-NEXT: store ptr [[ARRAYDECAY4]], ptr [[DOTCAPTURE_EXPR_]], align 8 132280865c01SMichael Kruse // CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[__END3]], align 8 132380865c01SMichael Kruse // CHECK2-NEXT: store ptr [[TMP4]], ptr [[DOTCAPTURE_EXPR_5]], align 8 132480865c01SMichael Kruse // CHECK2-NEXT: [[TMP5:%.*]] = load ptr, ptr [[DOTCAPTURE_EXPR_5]], align 8 132580865c01SMichael Kruse // CHECK2-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTCAPTURE_EXPR_]], align 8 132680865c01SMichael Kruse // CHECK2-NEXT: [[SUB_PTR_LHS_CAST:%.*]] = ptrtoint ptr [[TMP5]] to i64 132780865c01SMichael Kruse // CHECK2-NEXT: [[SUB_PTR_RHS_CAST:%.*]] = ptrtoint ptr [[TMP6]] to i64 132880865c01SMichael Kruse // CHECK2-NEXT: [[SUB_PTR_SUB:%.*]] = sub i64 [[SUB_PTR_LHS_CAST]], [[SUB_PTR_RHS_CAST]] 132980865c01SMichael Kruse // CHECK2-NEXT: [[SUB_PTR_DIV:%.*]] = sdiv exact i64 [[SUB_PTR_SUB]], 8 133080865c01SMichael Kruse // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i64 [[SUB_PTR_DIV]], 1 133180865c01SMichael Kruse // CHECK2-NEXT: [[ADD:%.*]] = add nsw i64 [[SUB]], 1 133280865c01SMichael Kruse // CHECK2-NEXT: [[DIV:%.*]] = sdiv i64 [[ADD]], 1 133380865c01SMichael Kruse // CHECK2-NEXT: [[SUB7:%.*]] = sub nsw i64 [[DIV]], 1 133480865c01SMichael Kruse // CHECK2-NEXT: store i64 [[SUB7]], ptr [[DOTCAPTURE_EXPR_6]], align 8 133580865c01SMichael Kruse // CHECK2-NEXT: [[TMP7:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_6]], align 8 133680865c01SMichael Kruse // CHECK2-NEXT: [[ADD9:%.*]] = add nsw i64 [[TMP7]], 1 133780865c01SMichael Kruse // CHECK2-NEXT: store i64 [[ADD9]], ptr [[DOTCAPTURE_EXPR_8]], align 8 133880865c01SMichael Kruse // CHECK2-NEXT: [[TMP8:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 133980865c01SMichael Kruse // CHECK2-NEXT: [[SUB11:%.*]] = sub nsw i64 [[TMP8]], 0 134080865c01SMichael Kruse // CHECK2-NEXT: [[DIV12:%.*]] = sdiv i64 [[SUB11]], 1 134180865c01SMichael Kruse // CHECK2-NEXT: [[MUL:%.*]] = mul nsw i64 4, [[DIV12]] 134280865c01SMichael Kruse // CHECK2-NEXT: [[MUL13:%.*]] = mul nsw i64 [[MUL]], 4 134380865c01SMichael Kruse // CHECK2-NEXT: [[SUB14:%.*]] = sub nsw i64 [[MUL13]], 1 134480865c01SMichael Kruse // CHECK2-NEXT: store i64 [[SUB14]], ptr [[DOTCAPTURE_EXPR_10]], align 8 134580865c01SMichael Kruse // CHECK2-NEXT: store i32 7, ptr [[K]], align 4 134680865c01SMichael Kruse // CHECK2-NEXT: store i64 0, ptr [[DOTFORWARD_IV___BEGIN3]], align 8 134780865c01SMichael Kruse // CHECK2-NEXT: store i32 7, ptr [[J]], align 4 134880865c01SMichael Kruse // CHECK2-NEXT: [[TMP9:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 134980865c01SMichael Kruse // CHECK2-NEXT: [[CMP:%.*]] = icmp slt i64 0, [[TMP9]] 135080865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]] 135180865c01SMichael Kruse // CHECK2: omp.precond.then: 135280865c01SMichael Kruse // CHECK2-NEXT: store i64 0, ptr [[DOTOMP_LB]], align 8 135380865c01SMichael Kruse // CHECK2-NEXT: [[TMP10:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_10]], align 8 135480865c01SMichael Kruse // CHECK2-NEXT: store i64 [[TMP10]], ptr [[DOTOMP_UB]], align 8 135580865c01SMichael Kruse // CHECK2-NEXT: store i64 1, ptr [[DOTOMP_STRIDE]], align 8 135680865c01SMichael Kruse // CHECK2-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4 135780865c01SMichael Kruse // CHECK2-NEXT: call void @__kmpc_for_static_init_8(ptr @[[GLOB1]], i32 [[TMP0]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i64 1, i64 1) 135880865c01SMichael Kruse // CHECK2-NEXT: [[TMP11:%.*]] = load i64, ptr [[DOTOMP_UB]], align 8 135980865c01SMichael Kruse // CHECK2-NEXT: [[TMP12:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_10]], align 8 136080865c01SMichael Kruse // CHECK2-NEXT: [[CMP18:%.*]] = icmp sgt i64 [[TMP11]], [[TMP12]] 136180865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP18]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 136280865c01SMichael Kruse // CHECK2: cond.true: 136380865c01SMichael Kruse // CHECK2-NEXT: [[TMP13:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_10]], align 8 136480865c01SMichael Kruse // CHECK2-NEXT: br label [[COND_END:%.*]] 136580865c01SMichael Kruse // CHECK2: cond.false: 136680865c01SMichael Kruse // CHECK2-NEXT: [[TMP14:%.*]] = load i64, ptr [[DOTOMP_UB]], align 8 136780865c01SMichael Kruse // CHECK2-NEXT: br label [[COND_END]] 136880865c01SMichael Kruse // CHECK2: cond.end: 136980865c01SMichael Kruse // CHECK2-NEXT: [[COND:%.*]] = phi i64 [ [[TMP13]], [[COND_TRUE]] ], [ [[TMP14]], [[COND_FALSE]] ] 137080865c01SMichael Kruse // CHECK2-NEXT: store i64 [[COND]], ptr [[DOTOMP_UB]], align 8 137180865c01SMichael Kruse // CHECK2-NEXT: [[TMP15:%.*]] = load i64, ptr [[DOTOMP_LB]], align 8 137280865c01SMichael Kruse // CHECK2-NEXT: store i64 [[TMP15]], ptr [[DOTOMP_IV]], align 8 137380865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 137480865c01SMichael Kruse // CHECK2: omp.inner.for.cond: 137580865c01SMichael Kruse // CHECK2-NEXT: [[TMP16:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 137680865c01SMichael Kruse // CHECK2-NEXT: [[TMP17:%.*]] = load i64, ptr [[DOTOMP_UB]], align 8 137780865c01SMichael Kruse // CHECK2-NEXT: [[CMP19:%.*]] = icmp sle i64 [[TMP16]], [[TMP17]] 137880865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP19]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 137980865c01SMichael Kruse // CHECK2: omp.inner.for.body: 138080865c01SMichael Kruse // CHECK2-NEXT: [[TMP18:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 138180865c01SMichael Kruse // CHECK2-NEXT: [[TMP19:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 138280865c01SMichael Kruse // CHECK2-NEXT: [[SUB20:%.*]] = sub nsw i64 [[TMP19]], 0 138380865c01SMichael Kruse // CHECK2-NEXT: [[DIV21:%.*]] = sdiv i64 [[SUB20]], 1 138480865c01SMichael Kruse // CHECK2-NEXT: [[MUL22:%.*]] = mul nsw i64 1, [[DIV21]] 138580865c01SMichael Kruse // CHECK2-NEXT: [[MUL23:%.*]] = mul nsw i64 [[MUL22]], 4 138680865c01SMichael Kruse // CHECK2-NEXT: [[DIV24:%.*]] = sdiv i64 [[TMP18]], [[MUL23]] 138780865c01SMichael Kruse // CHECK2-NEXT: [[MUL25:%.*]] = mul nsw i64 [[DIV24]], 3 138880865c01SMichael Kruse // CHECK2-NEXT: [[ADD26:%.*]] = add nsw i64 7, [[MUL25]] 138980865c01SMichael Kruse // CHECK2-NEXT: [[CONV:%.*]] = trunc i64 [[ADD26]] to i32 139080865c01SMichael Kruse // CHECK2-NEXT: store i32 [[CONV]], ptr [[K15]], align 4 139180865c01SMichael Kruse // CHECK2-NEXT: [[TMP20:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 139280865c01SMichael Kruse // CHECK2-NEXT: [[TMP21:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 139380865c01SMichael Kruse // CHECK2-NEXT: [[TMP22:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 139480865c01SMichael Kruse // CHECK2-NEXT: [[SUB27:%.*]] = sub nsw i64 [[TMP22]], 0 139580865c01SMichael Kruse // CHECK2-NEXT: [[DIV28:%.*]] = sdiv i64 [[SUB27]], 1 139680865c01SMichael Kruse // CHECK2-NEXT: [[MUL29:%.*]] = mul nsw i64 1, [[DIV28]] 139780865c01SMichael Kruse // CHECK2-NEXT: [[MUL30:%.*]] = mul nsw i64 [[MUL29]], 4 139880865c01SMichael Kruse // CHECK2-NEXT: [[DIV31:%.*]] = sdiv i64 [[TMP21]], [[MUL30]] 139980865c01SMichael Kruse // CHECK2-NEXT: [[TMP23:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 140080865c01SMichael Kruse // CHECK2-NEXT: [[SUB32:%.*]] = sub nsw i64 [[TMP23]], 0 140180865c01SMichael Kruse // CHECK2-NEXT: [[DIV33:%.*]] = sdiv i64 [[SUB32]], 1 140280865c01SMichael Kruse // CHECK2-NEXT: [[MUL34:%.*]] = mul nsw i64 1, [[DIV33]] 140380865c01SMichael Kruse // CHECK2-NEXT: [[MUL35:%.*]] = mul nsw i64 [[MUL34]], 4 140480865c01SMichael Kruse // CHECK2-NEXT: [[MUL36:%.*]] = mul nsw i64 [[DIV31]], [[MUL35]] 140580865c01SMichael Kruse // CHECK2-NEXT: [[SUB37:%.*]] = sub nsw i64 [[TMP20]], [[MUL36]] 140680865c01SMichael Kruse // CHECK2-NEXT: [[DIV38:%.*]] = sdiv i64 [[SUB37]], 4 140780865c01SMichael Kruse // CHECK2-NEXT: [[MUL39:%.*]] = mul nsw i64 [[DIV38]], 1 140880865c01SMichael Kruse // CHECK2-NEXT: [[ADD40:%.*]] = add nsw i64 0, [[MUL39]] 140980865c01SMichael Kruse // CHECK2-NEXT: store i64 [[ADD40]], ptr [[DOTFORWARD_IV___BEGIN316]], align 8 141080865c01SMichael Kruse // CHECK2-NEXT: [[TMP24:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 141180865c01SMichael Kruse // CHECK2-NEXT: [[TMP25:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 141280865c01SMichael Kruse // CHECK2-NEXT: [[TMP26:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 141380865c01SMichael Kruse // CHECK2-NEXT: [[SUB41:%.*]] = sub nsw i64 [[TMP26]], 0 141480865c01SMichael Kruse // CHECK2-NEXT: [[DIV42:%.*]] = sdiv i64 [[SUB41]], 1 141580865c01SMichael Kruse // CHECK2-NEXT: [[MUL43:%.*]] = mul nsw i64 1, [[DIV42]] 141680865c01SMichael Kruse // CHECK2-NEXT: [[MUL44:%.*]] = mul nsw i64 [[MUL43]], 4 141780865c01SMichael Kruse // CHECK2-NEXT: [[DIV45:%.*]] = sdiv i64 [[TMP25]], [[MUL44]] 141880865c01SMichael Kruse // CHECK2-NEXT: [[TMP27:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 141980865c01SMichael Kruse // CHECK2-NEXT: [[SUB46:%.*]] = sub nsw i64 [[TMP27]], 0 142080865c01SMichael Kruse // CHECK2-NEXT: [[DIV47:%.*]] = sdiv i64 [[SUB46]], 1 142180865c01SMichael Kruse // CHECK2-NEXT: [[MUL48:%.*]] = mul nsw i64 1, [[DIV47]] 142280865c01SMichael Kruse // CHECK2-NEXT: [[MUL49:%.*]] = mul nsw i64 [[MUL48]], 4 142380865c01SMichael Kruse // CHECK2-NEXT: [[MUL50:%.*]] = mul nsw i64 [[DIV45]], [[MUL49]] 142480865c01SMichael Kruse // CHECK2-NEXT: [[SUB51:%.*]] = sub nsw i64 [[TMP24]], [[MUL50]] 142580865c01SMichael Kruse // CHECK2-NEXT: [[TMP28:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 142680865c01SMichael Kruse // CHECK2-NEXT: [[TMP29:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 142780865c01SMichael Kruse // CHECK2-NEXT: [[TMP30:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 142880865c01SMichael Kruse // CHECK2-NEXT: [[SUB52:%.*]] = sub nsw i64 [[TMP30]], 0 142980865c01SMichael Kruse // CHECK2-NEXT: [[DIV53:%.*]] = sdiv i64 [[SUB52]], 1 143080865c01SMichael Kruse // CHECK2-NEXT: [[MUL54:%.*]] = mul nsw i64 1, [[DIV53]] 143180865c01SMichael Kruse // CHECK2-NEXT: [[MUL55:%.*]] = mul nsw i64 [[MUL54]], 4 143280865c01SMichael Kruse // CHECK2-NEXT: [[DIV56:%.*]] = sdiv i64 [[TMP29]], [[MUL55]] 143380865c01SMichael Kruse // CHECK2-NEXT: [[TMP31:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_8]], align 8 143480865c01SMichael Kruse // CHECK2-NEXT: [[SUB57:%.*]] = sub nsw i64 [[TMP31]], 0 143580865c01SMichael Kruse // CHECK2-NEXT: [[DIV58:%.*]] = sdiv i64 [[SUB57]], 1 143680865c01SMichael Kruse // CHECK2-NEXT: [[MUL59:%.*]] = mul nsw i64 1, [[DIV58]] 143780865c01SMichael Kruse // CHECK2-NEXT: [[MUL60:%.*]] = mul nsw i64 [[MUL59]], 4 143880865c01SMichael Kruse // CHECK2-NEXT: [[MUL61:%.*]] = mul nsw i64 [[DIV56]], [[MUL60]] 143980865c01SMichael Kruse // CHECK2-NEXT: [[SUB62:%.*]] = sub nsw i64 [[TMP28]], [[MUL61]] 144080865c01SMichael Kruse // CHECK2-NEXT: [[DIV63:%.*]] = sdiv i64 [[SUB62]], 4 144180865c01SMichael Kruse // CHECK2-NEXT: [[MUL64:%.*]] = mul nsw i64 [[DIV63]], 4 144280865c01SMichael Kruse // CHECK2-NEXT: [[SUB65:%.*]] = sub nsw i64 [[SUB51]], [[MUL64]] 144380865c01SMichael Kruse // CHECK2-NEXT: [[MUL66:%.*]] = mul nsw i64 [[SUB65]], 3 144480865c01SMichael Kruse // CHECK2-NEXT: [[ADD67:%.*]] = add nsw i64 7, [[MUL66]] 144580865c01SMichael Kruse // CHECK2-NEXT: [[CONV68:%.*]] = trunc i64 [[ADD67]] to i32 144680865c01SMichael Kruse // CHECK2-NEXT: store i32 [[CONV68]], ptr [[J17]], align 4 144780865c01SMichael Kruse // CHECK2-NEXT: [[TMP32:%.*]] = load i64, ptr [[DOTCAPTURE_EXPR_6]], align 8 144880865c01SMichael Kruse // CHECK2-NEXT: [[ADD69:%.*]] = add nsw i64 [[TMP32]], 1 144980865c01SMichael Kruse // CHECK2-NEXT: [[SUB70:%.*]] = sub nsw i64 [[ADD69]], 1 145080865c01SMichael Kruse // CHECK2-NEXT: [[TMP33:%.*]] = load i64, ptr [[DOTFORWARD_IV___BEGIN316]], align 8 145180865c01SMichael Kruse // CHECK2-NEXT: [[SUB71:%.*]] = sub nsw i64 [[SUB70]], [[TMP33]] 145280865c01SMichael Kruse // CHECK2-NEXT: store i64 [[SUB71]], ptr [[DOTREVERSED_IV___BEGIN3]], align 8 145380865c01SMichael Kruse // CHECK2-NEXT: [[TMP34:%.*]] = load ptr, ptr [[DOTCAPTURE_EXPR_]], align 8 145480865c01SMichael Kruse // CHECK2-NEXT: [[TMP35:%.*]] = load i64, ptr [[DOTREVERSED_IV___BEGIN3]], align 8 145580865c01SMichael Kruse // CHECK2-NEXT: [[MUL72:%.*]] = mul nsw i64 [[TMP35]], 1 145680865c01SMichael Kruse // CHECK2-NEXT: [[ADD_PTR73:%.*]] = getelementptr inbounds double, ptr [[TMP34]], i64 [[MUL72]] 145780865c01SMichael Kruse // CHECK2-NEXT: store ptr [[ADD_PTR73]], ptr [[__BEGIN3]], align 8 145880865c01SMichael Kruse // CHECK2-NEXT: [[TMP36:%.*]] = load ptr, ptr [[__BEGIN3]], align 8 145980865c01SMichael Kruse // CHECK2-NEXT: store ptr [[TMP36]], ptr [[V]], align 8 146080865c01SMichael Kruse // CHECK2-NEXT: [[TMP37:%.*]] = load i32, ptr [[K15]], align 4 146180865c01SMichael Kruse // CHECK2-NEXT: [[TMP38:%.*]] = load i32, ptr [[C]], align 4 146280865c01SMichael Kruse // CHECK2-NEXT: [[TMP39:%.*]] = load ptr, ptr [[V]], align 8 146380865c01SMichael Kruse // CHECK2-NEXT: [[TMP40:%.*]] = load double, ptr [[TMP39]], align 8 146480865c01SMichael Kruse // CHECK2-NEXT: [[TMP41:%.*]] = load i32, ptr [[J17]], align 4 146580865c01SMichael Kruse // CHECK2-NEXT: call void (...) @body(i32 noundef [[TMP37]], i32 noundef [[TMP38]], double noundef [[TMP40]], i32 noundef [[TMP41]]) 146680865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 146780865c01SMichael Kruse // CHECK2: omp.body.continue: 146880865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 146980865c01SMichael Kruse // CHECK2: omp.inner.for.inc: 147080865c01SMichael Kruse // CHECK2-NEXT: [[TMP42:%.*]] = load i64, ptr [[DOTOMP_IV]], align 8 147180865c01SMichael Kruse // CHECK2-NEXT: [[ADD74:%.*]] = add nsw i64 [[TMP42]], 1 147280865c01SMichael Kruse // CHECK2-NEXT: store i64 [[ADD74]], ptr [[DOTOMP_IV]], align 8 147380865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] 147480865c01SMichael Kruse // CHECK2: omp.inner.for.end: 147580865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 147680865c01SMichael Kruse // CHECK2: omp.loop.exit: 147780865c01SMichael Kruse // CHECK2-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP0]]) 147880865c01SMichael Kruse // CHECK2-NEXT: br label [[OMP_PRECOND_END]] 147980865c01SMichael Kruse // CHECK2: omp.precond.end: 148080865c01SMichael Kruse // CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[TMP0]]) 148180865c01SMichael Kruse // CHECK2-NEXT: ret void 148280865c01SMichael Kruse // 148380865c01SMichael Kruse // 148480865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@tfoo5 148580865c01SMichael Kruse // CHECK2-SAME: () #[[ATTR1]] { 148680865c01SMichael Kruse // CHECK2-NEXT: entry: 148780865c01SMichael Kruse // CHECK2-NEXT: call void @_Z4foo5IiTnT_Li3EEvS0_S0_(i32 noundef 0, i32 noundef 42) 148880865c01SMichael Kruse // CHECK2-NEXT: ret void 148980865c01SMichael Kruse // 149080865c01SMichael Kruse // 149180865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@_Z4foo5IiTnT_Li3EEvS0_S0_ 149280865c01SMichael Kruse // CHECK2-SAME: (i32 noundef [[START:%.*]], i32 noundef [[END:%.*]]) #[[ATTR1]] comdat { 149380865c01SMichael Kruse // CHECK2-NEXT: entry: 149480865c01SMichael Kruse // CHECK2-NEXT: [[START_ADDR:%.*]] = alloca i32, align 4 149580865c01SMichael Kruse // CHECK2-NEXT: [[END_ADDR:%.*]] = alloca i32, align 4 149680865c01SMichael Kruse // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 149780865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 149880865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4 149980865c01SMichael Kruse // CHECK2-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4 150080865c01SMichael Kruse // CHECK2-NEXT: [[DOTFORWARD_IV_I:%.*]] = alloca i32, align 4 150180865c01SMichael Kruse // CHECK2-NEXT: [[DOTREVERSED_IV_I:%.*]] = alloca i32, align 4 150280865c01SMichael Kruse // CHECK2-NEXT: store i32 [[START]], ptr [[START_ADDR]], align 4 150380865c01SMichael Kruse // CHECK2-NEXT: store i32 [[END]], ptr [[END_ADDR]], align 4 150480865c01SMichael Kruse // CHECK2-NEXT: [[TMP0:%.*]] = load i32, ptr [[START_ADDR]], align 4 150580865c01SMichael Kruse // CHECK2-NEXT: store i32 [[TMP0]], ptr [[I]], align 4 150680865c01SMichael Kruse // CHECK2-NEXT: [[TMP1:%.*]] = load i32, ptr [[START_ADDR]], align 4 150780865c01SMichael Kruse // CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTCAPTURE_EXPR_]], align 4 150880865c01SMichael Kruse // CHECK2-NEXT: [[TMP2:%.*]] = load i32, ptr [[END_ADDR]], align 4 150980865c01SMichael Kruse // CHECK2-NEXT: store i32 [[TMP2]], ptr [[DOTCAPTURE_EXPR_1]], align 4 151080865c01SMichael Kruse // CHECK2-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4 151180865c01SMichael Kruse // CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4 151280865c01SMichael Kruse // CHECK2-NEXT: [[SUB:%.*]] = sub i32 [[TMP3]], [[TMP4]] 151380865c01SMichael Kruse // CHECK2-NEXT: [[SUB3:%.*]] = sub i32 [[SUB]], 1 151480865c01SMichael Kruse // CHECK2-NEXT: [[ADD:%.*]] = add i32 [[SUB3]], 3 151580865c01SMichael Kruse // CHECK2-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], 3 151680865c01SMichael Kruse // CHECK2-NEXT: [[SUB4:%.*]] = sub i32 [[DIV]], 1 151780865c01SMichael Kruse // CHECK2-NEXT: store i32 [[SUB4]], ptr [[DOTCAPTURE_EXPR_2]], align 4 151880865c01SMichael Kruse // CHECK2-NEXT: store i32 0, ptr [[DOTFORWARD_IV_I]], align 4 151980865c01SMichael Kruse // CHECK2-NEXT: br label [[FOR_COND:%.*]] 152080865c01SMichael Kruse // CHECK2: for.cond: 152180865c01SMichael Kruse // CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 152280865c01SMichael Kruse // CHECK2-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4 152380865c01SMichael Kruse // CHECK2-NEXT: [[ADD5:%.*]] = add i32 [[TMP6]], 1 152480865c01SMichael Kruse // CHECK2-NEXT: [[CMP:%.*]] = icmp ult i32 [[TMP5]], [[ADD5]] 152580865c01SMichael Kruse // CHECK2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 152680865c01SMichael Kruse // CHECK2: for.body: 152780865c01SMichael Kruse // CHECK2-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_2]], align 4 152880865c01SMichael Kruse // CHECK2-NEXT: [[ADD6:%.*]] = add i32 [[TMP7]], 1 152980865c01SMichael Kruse // CHECK2-NEXT: [[SUB7:%.*]] = sub i32 [[ADD6]], 1 153080865c01SMichael Kruse // CHECK2-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 153180865c01SMichael Kruse // CHECK2-NEXT: [[SUB8:%.*]] = sub i32 [[SUB7]], [[TMP8]] 153280865c01SMichael Kruse // CHECK2-NEXT: store i32 [[SUB8]], ptr [[DOTREVERSED_IV_I]], align 4 153380865c01SMichael Kruse // CHECK2-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4 153480865c01SMichael Kruse // CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTREVERSED_IV_I]], align 4 153580865c01SMichael Kruse // CHECK2-NEXT: [[MUL:%.*]] = mul i32 [[TMP10]], 3 153680865c01SMichael Kruse // CHECK2-NEXT: [[ADD9:%.*]] = add i32 [[TMP9]], [[MUL]] 153780865c01SMichael Kruse // CHECK2-NEXT: store i32 [[ADD9]], ptr [[I]], align 4 153880865c01SMichael Kruse // CHECK2-NEXT: [[TMP11:%.*]] = load i32, ptr [[I]], align 4 153980865c01SMichael Kruse // CHECK2-NEXT: call void (...) @body(i32 noundef [[TMP11]]) 154080865c01SMichael Kruse // CHECK2-NEXT: br label [[FOR_INC:%.*]] 154180865c01SMichael Kruse // CHECK2: for.inc: 154280865c01SMichael Kruse // CHECK2-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTFORWARD_IV_I]], align 4 154380865c01SMichael Kruse // CHECK2-NEXT: [[INC:%.*]] = add i32 [[TMP12]], 1 154480865c01SMichael Kruse // CHECK2-NEXT: store i32 [[INC]], ptr [[DOTFORWARD_IV_I]], align 4 154580865c01SMichael Kruse // CHECK2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP9:![0-9]+]] 154680865c01SMichael Kruse // CHECK2: for.end: 154780865c01SMichael Kruse // CHECK2-NEXT: ret void 154880865c01SMichael Kruse // 154980865c01SMichael Kruse // 155080865c01SMichael Kruse // CHECK2-LABEL: define {{[^@]+}}@_GLOBAL__sub_I_reverse_codegen.cpp 155180865c01SMichael Kruse // CHECK2-SAME: () #[[ATTR0]] section ".text.startup" { 155280865c01SMichael Kruse // CHECK2-NEXT: entry: 155380865c01SMichael Kruse // CHECK2-NEXT: call void @__cxx_global_var_init() 155480865c01SMichael Kruse // CHECK2-NEXT: ret void 1555*94473f4dSHari Limaye // 1556