| // 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 _ |
| // RUN: %clang_cc1 -verify -fopenmp -fopenmp-enable-irbuilder -x c++ -emit-llvm %s -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefixes=CHECK %s |
| // RUN: %clang_cc1 -fopenmp -fopenmp-enable-irbuilder -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -debug-info-kind=limited -std=c++11 -verify %s -emit-llvm -o - | FileCheck --check-prefixes=CHECK-DEBUG %s |
| |
| // expected-no-diagnostics |
| |
| // TODO: Teach the update script to check new functions too. |
| |
| #ifndef HEADER |
| #define HEADER |
| |
| void parallel_for_0(void) { |
| #pragma omp parallel |
| { |
| #pragma omp for |
| for (int i = 0; i < 100; ++i) { |
| } |
| } |
| } |
| |
| void parallel_for_1(float *r, int a, double b) { |
| #pragma omp parallel |
| { |
| #pragma omp parallel |
| { |
| #pragma omp for |
| for (int i = 0; i < 100; ++i) { |
| *r = a + b; |
| } |
| } |
| } |
| } |
| |
| void parallel_for_2(float *r, int a, double b) { |
| #pragma omp parallel |
| { |
| #pragma omp for |
| for (int i = 0; i < 100; ++i) |
| *r = a + b; |
| #pragma omp parallel |
| { |
| #pragma omp for |
| for (int i = 0; i < 100; ++i) |
| *r = a + b; |
| #pragma omp parallel |
| { |
| #pragma omp for |
| for (int i = 0; i < 100; ++i) |
| *r = a + b; |
| } |
| #pragma omp for |
| for (int i = 0; i < 100; ++i) |
| *r = a + b; |
| #pragma omp parallel |
| { |
| #pragma omp for |
| for (int i = 0; i < 100; ++i) |
| *r = a + b; |
| } |
| #pragma omp for |
| for (int i = 0; i < 100; ++i) |
| *r = a + b; |
| } |
| #pragma omp for |
| for (int i = 0; i < 100; ++i) |
| *r = a + b; |
| } |
| #pragma omp for |
| for (int i = 0; i < 100; ++i) |
| *r = a + b; |
| } |
| |
| #endif |
| // CHECK-LABEL: define {{[^@]+}}@_Z14parallel_for_0v |
| // CHECK-SAME: () #[[ATTR0:[0-9]+]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] |
| // CHECK: omp_parallel: |
| // CHECK-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1:[0-9]+]], i32 0, ptr @_Z14parallel_for_0v..omp_par) |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT:%.*]] |
| // CHECK: omp.par.exit: |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@_Z14parallel_for_0v..omp_par |
| // CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]]) #[[ATTR1:[0-9]+]] { |
| // CHECK-NEXT: omp.par.entry: |
| // CHECK-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4 |
| // CHECK-NEXT: store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4 |
| // CHECK-NEXT: [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4 |
| // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8 |
| // CHECK-NEXT: [[AGG_CAPTURED1:%.*]] = alloca [[STRUCT_ANON_0:%.*]], align 4 |
| // CHECK-NEXT: [[DOTCOUNT_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] |
| // CHECK: omp.par.region: |
| // CHECK-NEXT: store i32 0, ptr [[I]], align 4 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON]], ptr [[AGG_CAPTURED]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[I]], ptr [[TMP1]], align 8 |
| // CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_0]], ptr [[AGG_CAPTURED1]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[I]], align 4 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[TMP2]], align 4 |
| // CHECK-NEXT: call void @__captured_stmt(ptr [[DOTCOUNT_ADDR]], ptr [[AGG_CAPTURED]]) |
| // CHECK-NEXT: [[DOTCOUNT:%.*]] = load i32, ptr [[DOTCOUNT_ADDR]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_PREHEADER:%.*]] |
| // CHECK: omp_loop.preheader: |
| // CHECK-NEXT: store i32 0, ptr [[P_LOWERBOUND]], align 4 |
| // CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[DOTCOUNT]], 1 |
| // CHECK-NEXT: store i32 [[TMP4]], ptr [[P_UPPERBOUND]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[P_STRIDE]], align 4 |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i32 1, i32 0) |
| // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[P_LOWERBOUND]], align 4 |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[P_UPPERBOUND]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = sub i32 [[TMP6]], [[TMP5]] |
| // CHECK-NEXT: [[TMP8:%.*]] = add i32 [[TMP7]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER:%.*]] |
| // CHECK: omp_loop.header: |
| // CHECK-NEXT: [[OMP_LOOP_IV:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER]] ], [ [[OMP_LOOP_NEXT:%.*]], [[OMP_LOOP_INC:%.*]] ] |
| // CHECK-NEXT: br label [[OMP_LOOP_COND:%.*]] |
| // CHECK: omp_loop.cond: |
| // CHECK-NEXT: [[OMP_LOOP_CMP:%.*]] = icmp ult i32 [[OMP_LOOP_IV]], [[TMP8]] |
| // CHECK-NEXT: br i1 [[OMP_LOOP_CMP]], label [[OMP_LOOP_BODY:%.*]], label [[OMP_LOOP_EXIT:%.*]] |
| // CHECK: omp_loop.exit: |
| // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]]) |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM2]]) |
| // CHECK-NEXT: br label [[OMP_LOOP_AFTER:%.*]] |
| // CHECK: omp_loop.after: |
| // CHECK-NEXT: br label [[OMP_PAR_REGION_PARALLEL_AFTER:%.*]] |
| // CHECK: omp.par.region.parallel.after: |
| // CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] |
| // CHECK: omp.par.pre_finalize: |
| // CHECK-NEXT: br label [[DOTFINI:%.*]] |
| // CHECK: .fini: |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT_EXITSTUB:%.*]] |
| // CHECK: omp_loop.body: |
| // CHECK-NEXT: [[TMP9:%.*]] = add i32 [[OMP_LOOP_IV]], [[TMP5]] |
| // CHECK-NEXT: call void @__captured_stmt.1(ptr [[I]], i32 [[TMP9]], ptr [[AGG_CAPTURED1]]) |
| // CHECK-NEXT: br label [[OMP_LOOP_INC]] |
| // CHECK: omp_loop.inc: |
| // CHECK-NEXT: [[OMP_LOOP_NEXT]] = add nuw i32 [[OMP_LOOP_IV]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER]] |
| // CHECK: omp.par.exit.exitStub: |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2:[0-9]+]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2:![0-9]+]], !align [[META3:![0-9]+]] |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: store i32 100, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]] |
| // CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] |
| // CHECK: cond.true: |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]] |
| // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1 |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]] |
| // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]] |
| // CHECK-NEXT: br label [[COND_END:%.*]] |
| // CHECK: cond.false: |
| // CHECK-NEXT: br label [[COND_END]] |
| // CHECK: cond.end: |
| // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ] |
| // CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.1 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_0:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4 |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]] |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]] |
| // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@_Z14parallel_for_1Pfid |
| // CHECK-SAME: (ptr noundef [[R:%.*]], i32 noundef [[A:%.*]], double noundef [[B:%.*]]) #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8 |
| // CHECK-NEXT: [[R_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[B_ADDR:%.*]] = alloca double, align 8 |
| // CHECK-NEXT: store ptr [[R]], ptr [[R_ADDR]], align 8 |
| // CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4 |
| // CHECK-NEXT: store double [[B]], ptr [[B_ADDR]], align 8 |
| // CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] |
| // CHECK: omp_parallel: |
| // CHECK-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[A_ADDR]], ptr [[GEP_A_ADDR]], align 8 |
| // CHECK-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1 |
| // CHECK-NEXT: store ptr [[B_ADDR]], ptr [[GEP_B_ADDR]], align 8 |
| // CHECK-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2 |
| // CHECK-NEXT: store ptr [[R_ADDR]], ptr [[GEP_R_ADDR]], align 8 |
| // CHECK-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @_Z14parallel_for_1Pfid..omp_par.4, ptr [[STRUCTARG]]) |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT:%.*]] |
| // CHECK: omp.par.exit: |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@_Z14parallel_for_1Pfid..omp_par.4 |
| // CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1]] { |
| // CHECK-NEXT: omp.par.entry: |
| // CHECK-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8, !align [[META3]] |
| // CHECK-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1 |
| // CHECK-NEXT: [[LOADGEP_B_ADDR:%.*]] = load ptr, ptr [[GEP_B_ADDR]], align 8, !align [[META6:![0-9]+]] |
| // CHECK-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2 |
| // CHECK-NEXT: [[LOADGEP_R_ADDR:%.*]] = load ptr, ptr [[GEP_R_ADDR]], align 8, !align [[META6]] |
| // CHECK-NEXT: [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8 |
| // CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4 |
| // CHECK-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4 |
| // CHECK-NEXT: [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4 |
| // CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] |
| // CHECK: omp.par.region: |
| // CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] |
| // CHECK: omp_parallel: |
| // CHECK-NEXT: [[GEP_A_ADDR1:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[LOADGEP_A_ADDR]], ptr [[GEP_A_ADDR1]], align 8 |
| // CHECK-NEXT: [[GEP_B_ADDR2:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1 |
| // CHECK-NEXT: store ptr [[LOADGEP_B_ADDR]], ptr [[GEP_B_ADDR2]], align 8 |
| // CHECK-NEXT: [[GEP_R_ADDR3:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2 |
| // CHECK-NEXT: store ptr [[LOADGEP_R_ADDR]], ptr [[GEP_R_ADDR3]], align 8 |
| // CHECK-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @_Z14parallel_for_1Pfid..omp_par, ptr [[STRUCTARG]]) |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT6:%.*]] |
| // CHECK: omp.par.exit6: |
| // CHECK-NEXT: br label [[OMP_PAR_REGION_PARALLEL_AFTER:%.*]] |
| // CHECK: omp.par.region.parallel.after: |
| // CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] |
| // CHECK: omp.par.pre_finalize: |
| // CHECK-NEXT: br label [[DOTFINI14:%.*]] |
| // CHECK: .fini14: |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT_EXITSTUB:%.*]] |
| // CHECK: omp.par.exit.exitStub: |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@_Z14parallel_for_1Pfid..omp_par |
| // CHECK-SAME: (ptr noalias [[TID_ADDR1:%.*]], ptr noalias [[ZERO_ADDR2:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1]] { |
| // CHECK-NEXT: omp.par.entry3: |
| // CHECK-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8, !align [[META3]] |
| // CHECK-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1 |
| // CHECK-NEXT: [[LOADGEP_B_ADDR:%.*]] = load ptr, ptr [[GEP_B_ADDR]], align 8, !align [[META6]] |
| // CHECK-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2 |
| // CHECK-NEXT: [[LOADGEP_R_ADDR:%.*]] = load ptr, ptr [[GEP_R_ADDR]], align 8, !align [[META6]] |
| // CHECK-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TID_ADDR_LOCAL7:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR1]], align 4 |
| // CHECK-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL7]], align 4 |
| // CHECK-NEXT: [[TID8:%.*]] = load i32, ptr [[TID_ADDR_LOCAL7]], align 4 |
| // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON_1:%.*]], align 8 |
| // CHECK-NEXT: [[AGG_CAPTURED11:%.*]] = alloca [[STRUCT_ANON_2:%.*]], align 4 |
| // CHECK-NEXT: [[DOTCOUNT_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: br label [[OMP_PAR_REGION4:%.*]] |
| // CHECK: omp.par.region4: |
| // CHECK-NEXT: store i32 0, ptr [[I]], align 4 |
| // CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_1]], ptr [[AGG_CAPTURED]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[I]], ptr [[TMP2]], align 8 |
| // CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_2]], ptr [[AGG_CAPTURED11]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4 |
| // CHECK-NEXT: store i32 [[TMP4]], ptr [[TMP3]], align 4 |
| // CHECK-NEXT: call void @__captured_stmt.2(ptr [[DOTCOUNT_ADDR]], ptr [[AGG_CAPTURED]]) |
| // CHECK-NEXT: [[DOTCOUNT:%.*]] = load i32, ptr [[DOTCOUNT_ADDR]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_PREHEADER:%.*]] |
| // CHECK: omp_loop.preheader: |
| // CHECK-NEXT: store i32 0, ptr [[P_LOWERBOUND]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = sub i32 [[DOTCOUNT]], 1 |
| // CHECK-NEXT: store i32 [[TMP5]], ptr [[P_UPPERBOUND]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[P_STRIDE]], align 4 |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i32 1, i32 0) |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[P_LOWERBOUND]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[P_UPPERBOUND]], align 4 |
| // CHECK-NEXT: [[TMP8:%.*]] = sub i32 [[TMP7]], [[TMP6]] |
| // CHECK-NEXT: [[TMP9:%.*]] = add i32 [[TMP8]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER:%.*]] |
| // CHECK: omp_loop.header: |
| // CHECK-NEXT: [[OMP_LOOP_IV:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER]] ], [ [[OMP_LOOP_NEXT:%.*]], [[OMP_LOOP_INC:%.*]] ] |
| // CHECK-NEXT: br label [[OMP_LOOP_COND:%.*]] |
| // CHECK: omp_loop.cond: |
| // CHECK-NEXT: [[OMP_LOOP_CMP:%.*]] = icmp ult i32 [[OMP_LOOP_IV]], [[TMP9]] |
| // CHECK-NEXT: br i1 [[OMP_LOOP_CMP]], label [[OMP_LOOP_BODY:%.*]], label [[OMP_LOOP_EXIT:%.*]] |
| // CHECK: omp_loop.exit: |
| // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]]) |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM13:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM13]]) |
| // CHECK-NEXT: br label [[OMP_LOOP_AFTER:%.*]] |
| // CHECK: omp_loop.after: |
| // CHECK-NEXT: br label [[OMP_PAR_REGION4_PARALLEL_AFTER:%.*]] |
| // CHECK: omp.par.region4.parallel.after: |
| // CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE5:%.*]] |
| // CHECK: omp.par.pre_finalize5: |
| // CHECK-NEXT: br label [[DOTFINI:%.*]] |
| // CHECK: .fini: |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT6_EXITSTUB:%.*]] |
| // CHECK: omp_loop.body: |
| // CHECK-NEXT: [[TMP10:%.*]] = add i32 [[OMP_LOOP_IV]], [[TMP6]] |
| // CHECK-NEXT: call void @__captured_stmt.3(ptr [[I]], i32 [[TMP10]], ptr [[AGG_CAPTURED11]]) |
| // CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4 |
| // CHECK-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP11]] to double |
| // CHECK-NEXT: [[TMP12:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8 |
| // CHECK-NEXT: [[ADD:%.*]] = fadd double [[CONV]], [[TMP12]] |
| // CHECK-NEXT: [[CONV12:%.*]] = fptrunc double [[ADD]] to float |
| // CHECK-NEXT: [[TMP13:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8 |
| // CHECK-NEXT: store float [[CONV12]], ptr [[TMP13]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_INC]] |
| // CHECK: omp_loop.inc: |
| // CHECK-NEXT: [[OMP_LOOP_NEXT]] = add nuw i32 [[OMP_LOOP_IV]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER]] |
| // CHECK: omp.par.exit6.exitStub: |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.2 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_1:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: store i32 100, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]] |
| // CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] |
| // CHECK: cond.true: |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]] |
| // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1 |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]] |
| // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]] |
| // CHECK-NEXT: br label [[COND_END:%.*]] |
| // CHECK: cond.false: |
| // CHECK-NEXT: br label [[COND_END]] |
| // CHECK: cond.end: |
| // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ] |
| // CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.3 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_2:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4 |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]] |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]] |
| // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@_Z14parallel_for_2Pfid |
| // CHECK-SAME: (ptr noundef [[R:%.*]], i32 noundef [[A:%.*]], double noundef [[B:%.*]]) #[[ATTR0]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8 |
| // CHECK-NEXT: [[R_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[B_ADDR:%.*]] = alloca double, align 8 |
| // CHECK-NEXT: [[I181:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[AGG_CAPTURED182:%.*]] = alloca [[STRUCT_ANON_17:%.*]], align 8 |
| // CHECK-NEXT: [[AGG_CAPTURED183:%.*]] = alloca [[STRUCT_ANON_18:%.*]], align 4 |
| // CHECK-NEXT: [[DOTCOUNT_ADDR184:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LASTITER199:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LOWERBOUND200:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_UPPERBOUND201:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_STRIDE202:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: store ptr [[R]], ptr [[R_ADDR]], align 8 |
| // CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4 |
| // CHECK-NEXT: store double [[B]], ptr [[B_ADDR]], align 8 |
| // CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] |
| // CHECK: omp_parallel: |
| // CHECK-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[A_ADDR]], ptr [[GEP_A_ADDR]], align 8 |
| // CHECK-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1 |
| // CHECK-NEXT: store ptr [[B_ADDR]], ptr [[GEP_B_ADDR]], align 8 |
| // CHECK-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2 |
| // CHECK-NEXT: store ptr [[R_ADDR]], ptr [[GEP_R_ADDR]], align 8 |
| // CHECK-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @_Z14parallel_for_2Pfid..omp_par.23, ptr [[STRUCTARG]]) |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT:%.*]] |
| // CHECK: omp.par.exit: |
| // CHECK-NEXT: store i32 0, ptr [[I181]], align 4 |
| // CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_17]], ptr [[AGG_CAPTURED182]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[I181]], ptr [[TMP0]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_18]], ptr [[AGG_CAPTURED183]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[I181]], align 4 |
| // CHECK-NEXT: store i32 [[TMP2]], ptr [[TMP1]], align 4 |
| // CHECK-NEXT: call void @__captured_stmt.19(ptr [[DOTCOUNT_ADDR184]], ptr [[AGG_CAPTURED182]]) |
| // CHECK-NEXT: [[DOTCOUNT185:%.*]] = load i32, ptr [[DOTCOUNT_ADDR184]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_PREHEADER186:%.*]] |
| // CHECK: omp_loop.preheader186: |
| // CHECK-NEXT: store i32 0, ptr [[P_LOWERBOUND200]], align 4 |
| // CHECK-NEXT: [[TMP3:%.*]] = sub i32 [[DOTCOUNT185]], 1 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[P_UPPERBOUND201]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[P_STRIDE202]], align 4 |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM203:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM203]], i32 34, ptr [[P_LASTITER199]], ptr [[P_LOWERBOUND200]], ptr [[P_UPPERBOUND201]], ptr [[P_STRIDE202]], i32 1, i32 0) |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[P_LOWERBOUND200]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[P_UPPERBOUND201]], align 4 |
| // CHECK-NEXT: [[TMP6:%.*]] = sub i32 [[TMP5]], [[TMP4]] |
| // CHECK-NEXT: [[TMP7:%.*]] = add i32 [[TMP6]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER187:%.*]] |
| // CHECK: omp_loop.header187: |
| // CHECK-NEXT: [[OMP_LOOP_IV193:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER186]] ], [ [[OMP_LOOP_NEXT195:%.*]], [[OMP_LOOP_INC190:%.*]] ] |
| // CHECK-NEXT: br label [[OMP_LOOP_COND188:%.*]] |
| // CHECK: omp_loop.cond188: |
| // CHECK-NEXT: [[OMP_LOOP_CMP194:%.*]] = icmp ult i32 [[OMP_LOOP_IV193]], [[TMP7]] |
| // CHECK-NEXT: br i1 [[OMP_LOOP_CMP194]], label [[OMP_LOOP_BODY189:%.*]], label [[OMP_LOOP_EXIT191:%.*]] |
| // CHECK: omp_loop.body189: |
| // CHECK-NEXT: [[TMP8:%.*]] = add i32 [[OMP_LOOP_IV193]], [[TMP4]] |
| // CHECK-NEXT: call void @__captured_stmt.20(ptr [[I181]], i32 [[TMP8]], ptr [[AGG_CAPTURED183]]) |
| // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[A_ADDR]], align 4 |
| // CHECK-NEXT: [[CONV196:%.*]] = sitofp i32 [[TMP9]] to double |
| // CHECK-NEXT: [[TMP10:%.*]] = load double, ptr [[B_ADDR]], align 8 |
| // CHECK-NEXT: [[ADD197:%.*]] = fadd double [[CONV196]], [[TMP10]] |
| // CHECK-NEXT: [[CONV198:%.*]] = fptrunc double [[ADD197]] to float |
| // CHECK-NEXT: [[TMP11:%.*]] = load ptr, ptr [[R_ADDR]], align 8 |
| // CHECK-NEXT: store float [[CONV198]], ptr [[TMP11]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_INC190]] |
| // CHECK: omp_loop.inc190: |
| // CHECK-NEXT: [[OMP_LOOP_NEXT195]] = add nuw i32 [[OMP_LOOP_IV193]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER187]] |
| // CHECK: omp_loop.exit191: |
| // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM203]]) |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM204:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM204]]) |
| // CHECK-NEXT: br label [[OMP_LOOP_AFTER192:%.*]] |
| // CHECK: omp_loop.after192: |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@_Z14parallel_for_2Pfid..omp_par.23 |
| // CHECK-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1]] { |
| // CHECK-NEXT: omp.par.entry: |
| // CHECK-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8, !align [[META3]] |
| // CHECK-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1 |
| // CHECK-NEXT: [[LOADGEP_B_ADDR:%.*]] = load ptr, ptr [[GEP_B_ADDR]], align 8, !align [[META6]] |
| // CHECK-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2 |
| // CHECK-NEXT: [[LOADGEP_R_ADDR:%.*]] = load ptr, ptr [[GEP_R_ADDR]], align 8, !align [[META6]] |
| // CHECK-NEXT: [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8 |
| // CHECK-NEXT: [[P_LASTITER174:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LOWERBOUND175:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_UPPERBOUND176:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_STRIDE177:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4 |
| // CHECK-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4 |
| // CHECK-NEXT: [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4 |
| // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON_3:%.*]], align 8 |
| // CHECK-NEXT: [[AGG_CAPTURED1:%.*]] = alloca [[STRUCT_ANON_4:%.*]], align 4 |
| // CHECK-NEXT: [[DOTCOUNT_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[I156:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[AGG_CAPTURED157:%.*]] = alloca [[STRUCT_ANON_15:%.*]], align 8 |
| // CHECK-NEXT: [[AGG_CAPTURED158:%.*]] = alloca [[STRUCT_ANON_16:%.*]], align 4 |
| // CHECK-NEXT: [[DOTCOUNT_ADDR159:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: br label [[OMP_PAR_REGION:%.*]] |
| // CHECK: omp.par.region: |
| // CHECK-NEXT: store i32 0, ptr [[I]], align 4 |
| // CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_3]], ptr [[AGG_CAPTURED]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[I]], ptr [[TMP2]], align 8 |
| // CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_4]], ptr [[AGG_CAPTURED1]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4 |
| // CHECK-NEXT: store i32 [[TMP4]], ptr [[TMP3]], align 4 |
| // CHECK-NEXT: call void @__captured_stmt.5(ptr [[DOTCOUNT_ADDR]], ptr [[AGG_CAPTURED]]) |
| // CHECK-NEXT: [[DOTCOUNT:%.*]] = load i32, ptr [[DOTCOUNT_ADDR]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_PREHEADER:%.*]] |
| // CHECK: omp_loop.preheader: |
| // CHECK-NEXT: store i32 0, ptr [[P_LOWERBOUND]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = sub i32 [[DOTCOUNT]], 1 |
| // CHECK-NEXT: store i32 [[TMP5]], ptr [[P_UPPERBOUND]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[P_STRIDE]], align 4 |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i32 1, i32 0) |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[P_LOWERBOUND]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[P_UPPERBOUND]], align 4 |
| // CHECK-NEXT: [[TMP8:%.*]] = sub i32 [[TMP7]], [[TMP6]] |
| // CHECK-NEXT: [[TMP9:%.*]] = add i32 [[TMP8]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER:%.*]] |
| // CHECK: omp_loop.header: |
| // CHECK-NEXT: [[OMP_LOOP_IV:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER]] ], [ [[OMP_LOOP_NEXT:%.*]], [[OMP_LOOP_INC:%.*]] ] |
| // CHECK-NEXT: br label [[OMP_LOOP_COND:%.*]] |
| // CHECK: omp_loop.cond: |
| // CHECK-NEXT: [[OMP_LOOP_CMP:%.*]] = icmp ult i32 [[OMP_LOOP_IV]], [[TMP9]] |
| // CHECK-NEXT: br i1 [[OMP_LOOP_CMP]], label [[OMP_LOOP_BODY:%.*]], label [[OMP_LOOP_EXIT:%.*]] |
| // CHECK: omp_loop.exit: |
| // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM]]) |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM3]]) |
| // CHECK-NEXT: br label [[OMP_LOOP_AFTER:%.*]] |
| // CHECK: omp_loop.after: |
| // CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] |
| // CHECK: omp_parallel: |
| // CHECK-NEXT: [[GEP_A_ADDR1:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[LOADGEP_A_ADDR]], ptr [[GEP_A_ADDR1]], align 8 |
| // CHECK-NEXT: [[GEP_B_ADDR2:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1 |
| // CHECK-NEXT: store ptr [[LOADGEP_B_ADDR]], ptr [[GEP_B_ADDR2]], align 8 |
| // CHECK-NEXT: [[GEP_R_ADDR3:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2 |
| // CHECK-NEXT: store ptr [[LOADGEP_R_ADDR]], ptr [[GEP_R_ADDR3]], align 8 |
| // CHECK-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @_Z14parallel_for_2Pfid..omp_par.22, ptr [[STRUCTARG]]) |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT9:%.*]] |
| // CHECK: omp.par.exit9: |
| // CHECK-NEXT: store i32 0, ptr [[I156]], align 4 |
| // CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_15]], ptr [[AGG_CAPTURED157]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[I156]], ptr [[TMP10]], align 8 |
| // CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_16]], ptr [[AGG_CAPTURED158]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[I156]], align 4 |
| // CHECK-NEXT: store i32 [[TMP12]], ptr [[TMP11]], align 4 |
| // CHECK-NEXT: call void @__captured_stmt.17(ptr [[DOTCOUNT_ADDR159]], ptr [[AGG_CAPTURED157]]) |
| // CHECK-NEXT: [[DOTCOUNT160:%.*]] = load i32, ptr [[DOTCOUNT_ADDR159]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_PREHEADER161:%.*]] |
| // CHECK: omp_loop.preheader161: |
| // CHECK-NEXT: store i32 0, ptr [[P_LOWERBOUND175]], align 4 |
| // CHECK-NEXT: [[TMP13:%.*]] = sub i32 [[DOTCOUNT160]], 1 |
| // CHECK-NEXT: store i32 [[TMP13]], ptr [[P_UPPERBOUND176]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[P_STRIDE177]], align 4 |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM178:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM178]], i32 34, ptr [[P_LASTITER174]], ptr [[P_LOWERBOUND175]], ptr [[P_UPPERBOUND176]], ptr [[P_STRIDE177]], i32 1, i32 0) |
| // CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[P_LOWERBOUND175]], align 4 |
| // CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[P_UPPERBOUND176]], align 4 |
| // CHECK-NEXT: [[TMP16:%.*]] = sub i32 [[TMP15]], [[TMP14]] |
| // CHECK-NEXT: [[TMP17:%.*]] = add i32 [[TMP16]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER162:%.*]] |
| // CHECK: omp_loop.header162: |
| // CHECK-NEXT: [[OMP_LOOP_IV168:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER161]] ], [ [[OMP_LOOP_NEXT170:%.*]], [[OMP_LOOP_INC165:%.*]] ] |
| // CHECK-NEXT: br label [[OMP_LOOP_COND163:%.*]] |
| // CHECK: omp_loop.cond163: |
| // CHECK-NEXT: [[OMP_LOOP_CMP169:%.*]] = icmp ult i32 [[OMP_LOOP_IV168]], [[TMP17]] |
| // CHECK-NEXT: br i1 [[OMP_LOOP_CMP169]], label [[OMP_LOOP_BODY164:%.*]], label [[OMP_LOOP_EXIT166:%.*]] |
| // CHECK: omp_loop.exit166: |
| // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM178]]) |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM179:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM179]]) |
| // CHECK-NEXT: br label [[OMP_LOOP_AFTER167:%.*]] |
| // CHECK: omp_loop.after167: |
| // CHECK-NEXT: br label [[OMP_PAR_REGION_PARALLEL_AFTER:%.*]] |
| // CHECK: omp.par.region.parallel.after: |
| // CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] |
| // CHECK: omp.par.pre_finalize: |
| // CHECK-NEXT: br label [[DOTFINI180:%.*]] |
| // CHECK: .fini180: |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT_EXITSTUB:%.*]] |
| // CHECK: omp_loop.body164: |
| // CHECK-NEXT: [[TMP18:%.*]] = add i32 [[OMP_LOOP_IV168]], [[TMP14]] |
| // CHECK-NEXT: call void @__captured_stmt.18(ptr [[I156]], i32 [[TMP18]], ptr [[AGG_CAPTURED158]]) |
| // CHECK-NEXT: [[TMP19:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4 |
| // CHECK-NEXT: [[CONV171:%.*]] = sitofp i32 [[TMP19]] to double |
| // CHECK-NEXT: [[TMP20:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8 |
| // CHECK-NEXT: [[ADD172:%.*]] = fadd double [[CONV171]], [[TMP20]] |
| // CHECK-NEXT: [[CONV173:%.*]] = fptrunc double [[ADD172]] to float |
| // CHECK-NEXT: [[TMP21:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8 |
| // CHECK-NEXT: store float [[CONV173]], ptr [[TMP21]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_INC165]] |
| // CHECK: omp_loop.inc165: |
| // CHECK-NEXT: [[OMP_LOOP_NEXT170]] = add nuw i32 [[OMP_LOOP_IV168]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER162]] |
| // CHECK: omp_loop.body: |
| // CHECK-NEXT: [[TMP22:%.*]] = add i32 [[OMP_LOOP_IV]], [[TMP6]] |
| // CHECK-NEXT: call void @__captured_stmt.6(ptr [[I]], i32 [[TMP22]], ptr [[AGG_CAPTURED1]]) |
| // CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4 |
| // CHECK-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP23]] to double |
| // CHECK-NEXT: [[TMP24:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8 |
| // CHECK-NEXT: [[ADD:%.*]] = fadd double [[CONV]], [[TMP24]] |
| // CHECK-NEXT: [[CONV2:%.*]] = fptrunc double [[ADD]] to float |
| // CHECK-NEXT: [[TMP25:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8 |
| // CHECK-NEXT: store float [[CONV2]], ptr [[TMP25]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_INC]] |
| // CHECK: omp_loop.inc: |
| // CHECK-NEXT: [[OMP_LOOP_NEXT]] = add nuw i32 [[OMP_LOOP_IV]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER]] |
| // CHECK: omp.par.exit.exitStub: |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@_Z14parallel_for_2Pfid..omp_par.22 |
| // CHECK-SAME: (ptr noalias [[TID_ADDR4:%.*]], ptr noalias [[ZERO_ADDR5:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1]] { |
| // CHECK-NEXT: omp.par.entry6: |
| // CHECK-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8, !align [[META3]] |
| // CHECK-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1 |
| // CHECK-NEXT: [[LOADGEP_B_ADDR:%.*]] = load ptr, ptr [[GEP_B_ADDR]], align 8, !align [[META6]] |
| // CHECK-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2 |
| // CHECK-NEXT: [[LOADGEP_R_ADDR:%.*]] = load ptr, ptr [[GEP_R_ADDR]], align 8, !align [[META6]] |
| // CHECK-NEXT: [[STRUCTARG205:%.*]] = alloca { ptr, ptr, ptr }, align 8 |
| // CHECK-NEXT: [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8 |
| // CHECK-NEXT: [[P_LASTITER149:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LOWERBOUND150:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_UPPERBOUND151:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_STRIDE152:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LASTITER90:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LOWERBOUND91:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_UPPERBOUND92:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_STRIDE93:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LASTITER32:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LOWERBOUND33:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_UPPERBOUND34:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_STRIDE35:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TID_ADDR_LOCAL10:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR4]], align 4 |
| // CHECK-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL10]], align 4 |
| // CHECK-NEXT: [[TID11:%.*]] = load i32, ptr [[TID_ADDR_LOCAL10]], align 4 |
| // CHECK-NEXT: [[I14:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[AGG_CAPTURED15:%.*]] = alloca [[STRUCT_ANON_5:%.*]], align 8 |
| // CHECK-NEXT: [[AGG_CAPTURED16:%.*]] = alloca [[STRUCT_ANON_6:%.*]], align 4 |
| // CHECK-NEXT: [[DOTCOUNT_ADDR17:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[I72:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[AGG_CAPTURED73:%.*]] = alloca [[STRUCT_ANON_9:%.*]], align 8 |
| // CHECK-NEXT: [[AGG_CAPTURED74:%.*]] = alloca [[STRUCT_ANON_10:%.*]], align 4 |
| // CHECK-NEXT: [[DOTCOUNT_ADDR75:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[I131:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[AGG_CAPTURED132:%.*]] = alloca [[STRUCT_ANON_13:%.*]], align 8 |
| // CHECK-NEXT: [[AGG_CAPTURED133:%.*]] = alloca [[STRUCT_ANON_14:%.*]], align 4 |
| // CHECK-NEXT: [[DOTCOUNT_ADDR134:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: br label [[OMP_PAR_REGION7:%.*]] |
| // CHECK: omp.par.region7: |
| // CHECK-NEXT: store i32 0, ptr [[I14]], align 4 |
| // CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_5]], ptr [[AGG_CAPTURED15]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[I14]], ptr [[TMP2]], align 8 |
| // CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_6]], ptr [[AGG_CAPTURED16]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I14]], align 4 |
| // CHECK-NEXT: store i32 [[TMP4]], ptr [[TMP3]], align 4 |
| // CHECK-NEXT: call void @__captured_stmt.7(ptr [[DOTCOUNT_ADDR17]], ptr [[AGG_CAPTURED15]]) |
| // CHECK-NEXT: [[DOTCOUNT18:%.*]] = load i32, ptr [[DOTCOUNT_ADDR17]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_PREHEADER19:%.*]] |
| // CHECK: omp_loop.preheader19: |
| // CHECK-NEXT: store i32 0, ptr [[P_LOWERBOUND33]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = sub i32 [[DOTCOUNT18]], 1 |
| // CHECK-NEXT: store i32 [[TMP5]], ptr [[P_UPPERBOUND34]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[P_STRIDE35]], align 4 |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM36:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM36]], i32 34, ptr [[P_LASTITER32]], ptr [[P_LOWERBOUND33]], ptr [[P_UPPERBOUND34]], ptr [[P_STRIDE35]], i32 1, i32 0) |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[P_LOWERBOUND33]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[P_UPPERBOUND34]], align 4 |
| // CHECK-NEXT: [[TMP8:%.*]] = sub i32 [[TMP7]], [[TMP6]] |
| // CHECK-NEXT: [[TMP9:%.*]] = add i32 [[TMP8]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER20:%.*]] |
| // CHECK: omp_loop.header20: |
| // CHECK-NEXT: [[OMP_LOOP_IV26:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER19]] ], [ [[OMP_LOOP_NEXT28:%.*]], [[OMP_LOOP_INC23:%.*]] ] |
| // CHECK-NEXT: br label [[OMP_LOOP_COND21:%.*]] |
| // CHECK: omp_loop.cond21: |
| // CHECK-NEXT: [[OMP_LOOP_CMP27:%.*]] = icmp ult i32 [[OMP_LOOP_IV26]], [[TMP9]] |
| // CHECK-NEXT: br i1 [[OMP_LOOP_CMP27]], label [[OMP_LOOP_BODY22:%.*]], label [[OMP_LOOP_EXIT24:%.*]] |
| // CHECK: omp_loop.exit24: |
| // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM36]]) |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM37:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM37]]) |
| // CHECK-NEXT: br label [[OMP_LOOP_AFTER25:%.*]] |
| // CHECK: omp_loop.after25: |
| // CHECK-NEXT: br label [[OMP_PARALLEL:%.*]] |
| // CHECK: omp_parallel: |
| // CHECK-NEXT: [[GEP_A_ADDR1:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[LOADGEP_A_ADDR]], ptr [[GEP_A_ADDR1]], align 8 |
| // CHECK-NEXT: [[GEP_B_ADDR2:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1 |
| // CHECK-NEXT: store ptr [[LOADGEP_B_ADDR]], ptr [[GEP_B_ADDR2]], align 8 |
| // CHECK-NEXT: [[GEP_R_ADDR3:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2 |
| // CHECK-NEXT: store ptr [[LOADGEP_R_ADDR]], ptr [[GEP_R_ADDR3]], align 8 |
| // CHECK-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @_Z14parallel_for_2Pfid..omp_par, ptr [[STRUCTARG]]) |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT43:%.*]] |
| // CHECK: omp.par.exit43: |
| // CHECK-NEXT: store i32 0, ptr [[I72]], align 4 |
| // CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_9]], ptr [[AGG_CAPTURED73]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[I72]], ptr [[TMP10]], align 8 |
| // CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_10]], ptr [[AGG_CAPTURED74]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP12:%.*]] = load i32, ptr [[I72]], align 4 |
| // CHECK-NEXT: store i32 [[TMP12]], ptr [[TMP11]], align 4 |
| // CHECK-NEXT: call void @__captured_stmt.11(ptr [[DOTCOUNT_ADDR75]], ptr [[AGG_CAPTURED73]]) |
| // CHECK-NEXT: [[DOTCOUNT76:%.*]] = load i32, ptr [[DOTCOUNT_ADDR75]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_PREHEADER77:%.*]] |
| // CHECK: omp_loop.preheader77: |
| // CHECK-NEXT: store i32 0, ptr [[P_LOWERBOUND91]], align 4 |
| // CHECK-NEXT: [[TMP13:%.*]] = sub i32 [[DOTCOUNT76]], 1 |
| // CHECK-NEXT: store i32 [[TMP13]], ptr [[P_UPPERBOUND92]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[P_STRIDE93]], align 4 |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM94:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM94]], i32 34, ptr [[P_LASTITER90]], ptr [[P_LOWERBOUND91]], ptr [[P_UPPERBOUND92]], ptr [[P_STRIDE93]], i32 1, i32 0) |
| // CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[P_LOWERBOUND91]], align 4 |
| // CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[P_UPPERBOUND92]], align 4 |
| // CHECK-NEXT: [[TMP16:%.*]] = sub i32 [[TMP15]], [[TMP14]] |
| // CHECK-NEXT: [[TMP17:%.*]] = add i32 [[TMP16]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER78:%.*]] |
| // CHECK: omp_loop.header78: |
| // CHECK-NEXT: [[OMP_LOOP_IV84:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER77]] ], [ [[OMP_LOOP_NEXT86:%.*]], [[OMP_LOOP_INC81:%.*]] ] |
| // CHECK-NEXT: br label [[OMP_LOOP_COND79:%.*]] |
| // CHECK: omp_loop.cond79: |
| // CHECK-NEXT: [[OMP_LOOP_CMP85:%.*]] = icmp ult i32 [[OMP_LOOP_IV84]], [[TMP17]] |
| // CHECK-NEXT: br i1 [[OMP_LOOP_CMP85]], label [[OMP_LOOP_BODY80:%.*]], label [[OMP_LOOP_EXIT82:%.*]] |
| // CHECK: omp_loop.exit82: |
| // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM94]]) |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM95:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM95]]) |
| // CHECK-NEXT: br label [[OMP_LOOP_AFTER83:%.*]] |
| // CHECK: omp_loop.after83: |
| // CHECK-NEXT: br label [[OMP_PARALLEL209:%.*]] |
| // CHECK: omp_parallel209: |
| // CHECK-NEXT: [[GEP_A_ADDR206:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG205]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[LOADGEP_A_ADDR]], ptr [[GEP_A_ADDR206]], align 8 |
| // CHECK-NEXT: [[GEP_B_ADDR207:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG205]], i32 0, i32 1 |
| // CHECK-NEXT: store ptr [[LOADGEP_B_ADDR]], ptr [[GEP_B_ADDR207]], align 8 |
| // CHECK-NEXT: [[GEP_R_ADDR208:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG205]], i32 0, i32 2 |
| // CHECK-NEXT: store ptr [[LOADGEP_R_ADDR]], ptr [[GEP_R_ADDR208]], align 8 |
| // CHECK-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1]], i32 1, ptr @_Z14parallel_for_2Pfid..omp_par.21, ptr [[STRUCTARG205]]) |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT101:%.*]] |
| // CHECK: omp.par.exit101: |
| // CHECK-NEXT: store i32 0, ptr [[I131]], align 4 |
| // CHECK-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_13]], ptr [[AGG_CAPTURED132]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[I131]], ptr [[TMP18]], align 8 |
| // CHECK-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_14]], ptr [[AGG_CAPTURED133]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP20:%.*]] = load i32, ptr [[I131]], align 4 |
| // CHECK-NEXT: store i32 [[TMP20]], ptr [[TMP19]], align 4 |
| // CHECK-NEXT: call void @__captured_stmt.15(ptr [[DOTCOUNT_ADDR134]], ptr [[AGG_CAPTURED132]]) |
| // CHECK-NEXT: [[DOTCOUNT135:%.*]] = load i32, ptr [[DOTCOUNT_ADDR134]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_PREHEADER136:%.*]] |
| // CHECK: omp_loop.preheader136: |
| // CHECK-NEXT: store i32 0, ptr [[P_LOWERBOUND150]], align 4 |
| // CHECK-NEXT: [[TMP21:%.*]] = sub i32 [[DOTCOUNT135]], 1 |
| // CHECK-NEXT: store i32 [[TMP21]], ptr [[P_UPPERBOUND151]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[P_STRIDE152]], align 4 |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM153:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM153]], i32 34, ptr [[P_LASTITER149]], ptr [[P_LOWERBOUND150]], ptr [[P_UPPERBOUND151]], ptr [[P_STRIDE152]], i32 1, i32 0) |
| // CHECK-NEXT: [[TMP22:%.*]] = load i32, ptr [[P_LOWERBOUND150]], align 4 |
| // CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[P_UPPERBOUND151]], align 4 |
| // CHECK-NEXT: [[TMP24:%.*]] = sub i32 [[TMP23]], [[TMP22]] |
| // CHECK-NEXT: [[TMP25:%.*]] = add i32 [[TMP24]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER137:%.*]] |
| // CHECK: omp_loop.header137: |
| // CHECK-NEXT: [[OMP_LOOP_IV143:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER136]] ], [ [[OMP_LOOP_NEXT145:%.*]], [[OMP_LOOP_INC140:%.*]] ] |
| // CHECK-NEXT: br label [[OMP_LOOP_COND138:%.*]] |
| // CHECK: omp_loop.cond138: |
| // CHECK-NEXT: [[OMP_LOOP_CMP144:%.*]] = icmp ult i32 [[OMP_LOOP_IV143]], [[TMP25]] |
| // CHECK-NEXT: br i1 [[OMP_LOOP_CMP144]], label [[OMP_LOOP_BODY139:%.*]], label [[OMP_LOOP_EXIT141:%.*]] |
| // CHECK: omp_loop.exit141: |
| // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM153]]) |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM154:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM154]]) |
| // CHECK-NEXT: br label [[OMP_LOOP_AFTER142:%.*]] |
| // CHECK: omp_loop.after142: |
| // CHECK-NEXT: br label [[OMP_PAR_REGION7_PARALLEL_AFTER:%.*]] |
| // CHECK: omp.par.region7.parallel.after: |
| // CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE8:%.*]] |
| // CHECK: omp.par.pre_finalize8: |
| // CHECK-NEXT: br label [[DOTFINI155:%.*]] |
| // CHECK: .fini155: |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT9_EXITSTUB:%.*]] |
| // CHECK: omp_loop.body139: |
| // CHECK-NEXT: [[TMP26:%.*]] = add i32 [[OMP_LOOP_IV143]], [[TMP22]] |
| // CHECK-NEXT: call void @__captured_stmt.16(ptr [[I131]], i32 [[TMP26]], ptr [[AGG_CAPTURED133]]) |
| // CHECK-NEXT: [[TMP27:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4 |
| // CHECK-NEXT: [[CONV146:%.*]] = sitofp i32 [[TMP27]] to double |
| // CHECK-NEXT: [[TMP28:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8 |
| // CHECK-NEXT: [[ADD147:%.*]] = fadd double [[CONV146]], [[TMP28]] |
| // CHECK-NEXT: [[CONV148:%.*]] = fptrunc double [[ADD147]] to float |
| // CHECK-NEXT: [[TMP29:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8 |
| // CHECK-NEXT: store float [[CONV148]], ptr [[TMP29]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_INC140]] |
| // CHECK: omp_loop.inc140: |
| // CHECK-NEXT: [[OMP_LOOP_NEXT145]] = add nuw i32 [[OMP_LOOP_IV143]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER137]] |
| // CHECK: omp_loop.body80: |
| // CHECK-NEXT: [[TMP30:%.*]] = add i32 [[OMP_LOOP_IV84]], [[TMP14]] |
| // CHECK-NEXT: call void @__captured_stmt.12(ptr [[I72]], i32 [[TMP30]], ptr [[AGG_CAPTURED74]]) |
| // CHECK-NEXT: [[TMP31:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4 |
| // CHECK-NEXT: [[CONV87:%.*]] = sitofp i32 [[TMP31]] to double |
| // CHECK-NEXT: [[TMP32:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8 |
| // CHECK-NEXT: [[ADD88:%.*]] = fadd double [[CONV87]], [[TMP32]] |
| // CHECK-NEXT: [[CONV89:%.*]] = fptrunc double [[ADD88]] to float |
| // CHECK-NEXT: [[TMP33:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8 |
| // CHECK-NEXT: store float [[CONV89]], ptr [[TMP33]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_INC81]] |
| // CHECK: omp_loop.inc81: |
| // CHECK-NEXT: [[OMP_LOOP_NEXT86]] = add nuw i32 [[OMP_LOOP_IV84]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER78]] |
| // CHECK: omp_loop.body22: |
| // CHECK-NEXT: [[TMP34:%.*]] = add i32 [[OMP_LOOP_IV26]], [[TMP6]] |
| // CHECK-NEXT: call void @__captured_stmt.8(ptr [[I14]], i32 [[TMP34]], ptr [[AGG_CAPTURED16]]) |
| // CHECK-NEXT: [[TMP35:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4 |
| // CHECK-NEXT: [[CONV29:%.*]] = sitofp i32 [[TMP35]] to double |
| // CHECK-NEXT: [[TMP36:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8 |
| // CHECK-NEXT: [[ADD30:%.*]] = fadd double [[CONV29]], [[TMP36]] |
| // CHECK-NEXT: [[CONV31:%.*]] = fptrunc double [[ADD30]] to float |
| // CHECK-NEXT: [[TMP37:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8 |
| // CHECK-NEXT: store float [[CONV31]], ptr [[TMP37]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_INC23]] |
| // CHECK: omp_loop.inc23: |
| // CHECK-NEXT: [[OMP_LOOP_NEXT28]] = add nuw i32 [[OMP_LOOP_IV26]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER20]] |
| // CHECK: omp.par.exit9.exitStub: |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@_Z14parallel_for_2Pfid..omp_par.21 |
| // CHECK-SAME: (ptr noalias [[TID_ADDR96:%.*]], ptr noalias [[ZERO_ADDR97:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1]] { |
| // CHECK-NEXT: omp.par.entry98: |
| // CHECK-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8, !align [[META3]] |
| // CHECK-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1 |
| // CHECK-NEXT: [[LOADGEP_B_ADDR:%.*]] = load ptr, ptr [[GEP_B_ADDR]], align 8, !align [[META6]] |
| // CHECK-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2 |
| // CHECK-NEXT: [[LOADGEP_R_ADDR:%.*]] = load ptr, ptr [[GEP_R_ADDR]], align 8, !align [[META6]] |
| // CHECK-NEXT: [[P_LASTITER124:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LOWERBOUND125:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_UPPERBOUND126:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_STRIDE127:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TID_ADDR_LOCAL102:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR96]], align 4 |
| // CHECK-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL102]], align 4 |
| // CHECK-NEXT: [[TID103:%.*]] = load i32, ptr [[TID_ADDR_LOCAL102]], align 4 |
| // CHECK-NEXT: [[I106:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[AGG_CAPTURED107:%.*]] = alloca [[STRUCT_ANON_11:%.*]], align 8 |
| // CHECK-NEXT: [[AGG_CAPTURED108:%.*]] = alloca [[STRUCT_ANON_12:%.*]], align 4 |
| // CHECK-NEXT: [[DOTCOUNT_ADDR109:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: br label [[OMP_PAR_REGION99:%.*]] |
| // CHECK: omp.par.region99: |
| // CHECK-NEXT: store i32 0, ptr [[I106]], align 4 |
| // CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_11]], ptr [[AGG_CAPTURED107]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[I106]], ptr [[TMP2]], align 8 |
| // CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_12]], ptr [[AGG_CAPTURED108]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I106]], align 4 |
| // CHECK-NEXT: store i32 [[TMP4]], ptr [[TMP3]], align 4 |
| // CHECK-NEXT: call void @__captured_stmt.13(ptr [[DOTCOUNT_ADDR109]], ptr [[AGG_CAPTURED107]]) |
| // CHECK-NEXT: [[DOTCOUNT110:%.*]] = load i32, ptr [[DOTCOUNT_ADDR109]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_PREHEADER111:%.*]] |
| // CHECK: omp_loop.preheader111: |
| // CHECK-NEXT: store i32 0, ptr [[P_LOWERBOUND125]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = sub i32 [[DOTCOUNT110]], 1 |
| // CHECK-NEXT: store i32 [[TMP5]], ptr [[P_UPPERBOUND126]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[P_STRIDE127]], align 4 |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM128:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM128]], i32 34, ptr [[P_LASTITER124]], ptr [[P_LOWERBOUND125]], ptr [[P_UPPERBOUND126]], ptr [[P_STRIDE127]], i32 1, i32 0) |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[P_LOWERBOUND125]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[P_UPPERBOUND126]], align 4 |
| // CHECK-NEXT: [[TMP8:%.*]] = sub i32 [[TMP7]], [[TMP6]] |
| // CHECK-NEXT: [[TMP9:%.*]] = add i32 [[TMP8]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER112:%.*]] |
| // CHECK: omp_loop.header112: |
| // CHECK-NEXT: [[OMP_LOOP_IV118:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER111]] ], [ [[OMP_LOOP_NEXT120:%.*]], [[OMP_LOOP_INC115:%.*]] ] |
| // CHECK-NEXT: br label [[OMP_LOOP_COND113:%.*]] |
| // CHECK: omp_loop.cond113: |
| // CHECK-NEXT: [[OMP_LOOP_CMP119:%.*]] = icmp ult i32 [[OMP_LOOP_IV118]], [[TMP9]] |
| // CHECK-NEXT: br i1 [[OMP_LOOP_CMP119]], label [[OMP_LOOP_BODY114:%.*]], label [[OMP_LOOP_EXIT116:%.*]] |
| // CHECK: omp_loop.exit116: |
| // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM128]]) |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM129:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM129]]) |
| // CHECK-NEXT: br label [[OMP_LOOP_AFTER117:%.*]] |
| // CHECK: omp_loop.after117: |
| // CHECK-NEXT: br label [[OMP_PAR_REGION99_PARALLEL_AFTER:%.*]] |
| // CHECK: omp.par.region99.parallel.after: |
| // CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE100:%.*]] |
| // CHECK: omp.par.pre_finalize100: |
| // CHECK-NEXT: br label [[DOTFINI130:%.*]] |
| // CHECK: .fini130: |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT101_EXITSTUB:%.*]] |
| // CHECK: omp_loop.body114: |
| // CHECK-NEXT: [[TMP10:%.*]] = add i32 [[OMP_LOOP_IV118]], [[TMP6]] |
| // CHECK-NEXT: call void @__captured_stmt.14(ptr [[I106]], i32 [[TMP10]], ptr [[AGG_CAPTURED108]]) |
| // CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4 |
| // CHECK-NEXT: [[CONV121:%.*]] = sitofp i32 [[TMP11]] to double |
| // CHECK-NEXT: [[TMP12:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8 |
| // CHECK-NEXT: [[ADD122:%.*]] = fadd double [[CONV121]], [[TMP12]] |
| // CHECK-NEXT: [[CONV123:%.*]] = fptrunc double [[ADD122]] to float |
| // CHECK-NEXT: [[TMP13:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8 |
| // CHECK-NEXT: store float [[CONV123]], ptr [[TMP13]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_INC115]] |
| // CHECK: omp_loop.inc115: |
| // CHECK-NEXT: [[OMP_LOOP_NEXT120]] = add nuw i32 [[OMP_LOOP_IV118]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER112]] |
| // CHECK: omp.par.exit101.exitStub: |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@_Z14parallel_for_2Pfid..omp_par |
| // CHECK-SAME: (ptr noalias [[TID_ADDR38:%.*]], ptr noalias [[ZERO_ADDR39:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1]] { |
| // CHECK-NEXT: omp.par.entry40: |
| // CHECK-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8, !align [[META3]] |
| // CHECK-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1 |
| // CHECK-NEXT: [[LOADGEP_B_ADDR:%.*]] = load ptr, ptr [[GEP_B_ADDR]], align 8, !align [[META6]] |
| // CHECK-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2 |
| // CHECK-NEXT: [[LOADGEP_R_ADDR:%.*]] = load ptr, ptr [[GEP_R_ADDR]], align 8, !align [[META6]] |
| // CHECK-NEXT: [[P_LASTITER66:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_LOWERBOUND67:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_UPPERBOUND68:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[P_STRIDE69:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TID_ADDR_LOCAL44:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR38]], align 4 |
| // CHECK-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL44]], align 4 |
| // CHECK-NEXT: [[TID45:%.*]] = load i32, ptr [[TID_ADDR_LOCAL44]], align 4 |
| // CHECK-NEXT: [[I48:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[AGG_CAPTURED49:%.*]] = alloca [[STRUCT_ANON_7:%.*]], align 8 |
| // CHECK-NEXT: [[AGG_CAPTURED50:%.*]] = alloca [[STRUCT_ANON_8:%.*]], align 4 |
| // CHECK-NEXT: [[DOTCOUNT_ADDR51:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: br label [[OMP_PAR_REGION41:%.*]] |
| // CHECK: omp.par.region41: |
| // CHECK-NEXT: store i32 0, ptr [[I48]], align 4 |
| // CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_7]], ptr [[AGG_CAPTURED49]], i32 0, i32 0 |
| // CHECK-NEXT: store ptr [[I48]], ptr [[TMP2]], align 8 |
| // CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_8]], ptr [[AGG_CAPTURED50]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I48]], align 4 |
| // CHECK-NEXT: store i32 [[TMP4]], ptr [[TMP3]], align 4 |
| // CHECK-NEXT: call void @__captured_stmt.9(ptr [[DOTCOUNT_ADDR51]], ptr [[AGG_CAPTURED49]]) |
| // CHECK-NEXT: [[DOTCOUNT52:%.*]] = load i32, ptr [[DOTCOUNT_ADDR51]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_PREHEADER53:%.*]] |
| // CHECK: omp_loop.preheader53: |
| // CHECK-NEXT: store i32 0, ptr [[P_LOWERBOUND67]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = sub i32 [[DOTCOUNT52]], 1 |
| // CHECK-NEXT: store i32 [[TMP5]], ptr [[P_UPPERBOUND68]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[P_STRIDE69]], align 4 |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM70:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM70]], i32 34, ptr [[P_LASTITER66]], ptr [[P_LOWERBOUND67]], ptr [[P_UPPERBOUND68]], ptr [[P_STRIDE69]], i32 1, i32 0) |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[P_LOWERBOUND67]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[P_UPPERBOUND68]], align 4 |
| // CHECK-NEXT: [[TMP8:%.*]] = sub i32 [[TMP7]], [[TMP6]] |
| // CHECK-NEXT: [[TMP9:%.*]] = add i32 [[TMP8]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER54:%.*]] |
| // CHECK: omp_loop.header54: |
| // CHECK-NEXT: [[OMP_LOOP_IV60:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER53]] ], [ [[OMP_LOOP_NEXT62:%.*]], [[OMP_LOOP_INC57:%.*]] ] |
| // CHECK-NEXT: br label [[OMP_LOOP_COND55:%.*]] |
| // CHECK: omp_loop.cond55: |
| // CHECK-NEXT: [[OMP_LOOP_CMP61:%.*]] = icmp ult i32 [[OMP_LOOP_IV60]], [[TMP9]] |
| // CHECK-NEXT: br i1 [[OMP_LOOP_CMP61]], label [[OMP_LOOP_BODY56:%.*]], label [[OMP_LOOP_EXIT58:%.*]] |
| // CHECK: omp_loop.exit58: |
| // CHECK-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM70]]) |
| // CHECK-NEXT: [[OMP_GLOBAL_THREAD_NUM71:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]]) |
| // CHECK-NEXT: call void @__kmpc_barrier(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM71]]) |
| // CHECK-NEXT: br label [[OMP_LOOP_AFTER59:%.*]] |
| // CHECK: omp_loop.after59: |
| // CHECK-NEXT: br label [[OMP_PAR_REGION41_PARALLEL_AFTER:%.*]] |
| // CHECK: omp.par.region41.parallel.after: |
| // CHECK-NEXT: br label [[OMP_PAR_PRE_FINALIZE42:%.*]] |
| // CHECK: omp.par.pre_finalize42: |
| // CHECK-NEXT: br label [[DOTFINI:%.*]] |
| // CHECK: .fini: |
| // CHECK-NEXT: br label [[OMP_PAR_EXIT43_EXITSTUB:%.*]] |
| // CHECK: omp_loop.body56: |
| // CHECK-NEXT: [[TMP10:%.*]] = add i32 [[OMP_LOOP_IV60]], [[TMP6]] |
| // CHECK-NEXT: call void @__captured_stmt.10(ptr [[I48]], i32 [[TMP10]], ptr [[AGG_CAPTURED50]]) |
| // CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4 |
| // CHECK-NEXT: [[CONV63:%.*]] = sitofp i32 [[TMP11]] to double |
| // CHECK-NEXT: [[TMP12:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8 |
| // CHECK-NEXT: [[ADD64:%.*]] = fadd double [[CONV63]], [[TMP12]] |
| // CHECK-NEXT: [[CONV65:%.*]] = fptrunc double [[ADD64]] to float |
| // CHECK-NEXT: [[TMP13:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8 |
| // CHECK-NEXT: store float [[CONV65]], ptr [[TMP13]], align 4 |
| // CHECK-NEXT: br label [[OMP_LOOP_INC57]] |
| // CHECK: omp_loop.inc57: |
| // CHECK-NEXT: [[OMP_LOOP_NEXT62]] = add nuw i32 [[OMP_LOOP_IV60]], 1 |
| // CHECK-NEXT: br label [[OMP_LOOP_HEADER54]] |
| // CHECK: omp.par.exit43.exitStub: |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.5 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_3:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: store i32 100, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]] |
| // CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] |
| // CHECK: cond.true: |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]] |
| // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1 |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]] |
| // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]] |
| // CHECK-NEXT: br label [[COND_END:%.*]] |
| // CHECK: cond.false: |
| // CHECK-NEXT: br label [[COND_END]] |
| // CHECK: cond.end: |
| // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ] |
| // CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.6 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_4:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4 |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]] |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]] |
| // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.7 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_5:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: store i32 100, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]] |
| // CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] |
| // CHECK: cond.true: |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]] |
| // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1 |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]] |
| // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]] |
| // CHECK-NEXT: br label [[COND_END:%.*]] |
| // CHECK: cond.false: |
| // CHECK-NEXT: br label [[COND_END]] |
| // CHECK: cond.end: |
| // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ] |
| // CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.8 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_6:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4 |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]] |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]] |
| // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.9 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_7:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: store i32 100, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]] |
| // CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] |
| // CHECK: cond.true: |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]] |
| // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1 |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]] |
| // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]] |
| // CHECK-NEXT: br label [[COND_END:%.*]] |
| // CHECK: cond.false: |
| // CHECK-NEXT: br label [[COND_END]] |
| // CHECK: cond.end: |
| // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ] |
| // CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.10 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_8:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4 |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]] |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]] |
| // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.11 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_9:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: store i32 100, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]] |
| // CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] |
| // CHECK: cond.true: |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]] |
| // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1 |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]] |
| // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]] |
| // CHECK-NEXT: br label [[COND_END:%.*]] |
| // CHECK: cond.false: |
| // CHECK-NEXT: br label [[COND_END]] |
| // CHECK: cond.end: |
| // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ] |
| // CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.12 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_10:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4 |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]] |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]] |
| // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.13 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_11:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: store i32 100, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]] |
| // CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] |
| // CHECK: cond.true: |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]] |
| // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1 |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]] |
| // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]] |
| // CHECK-NEXT: br label [[COND_END:%.*]] |
| // CHECK: cond.false: |
| // CHECK-NEXT: br label [[COND_END]] |
| // CHECK: cond.end: |
| // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ] |
| // CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.14 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_12:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4 |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]] |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]] |
| // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.15 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_13:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: store i32 100, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]] |
| // CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] |
| // CHECK: cond.true: |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]] |
| // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1 |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]] |
| // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]] |
| // CHECK-NEXT: br label [[COND_END:%.*]] |
| // CHECK: cond.false: |
| // CHECK-NEXT: br label [[COND_END]] |
| // CHECK: cond.end: |
| // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ] |
| // CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.16 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_14:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4 |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]] |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]] |
| // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.17 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_15:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: store i32 100, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]] |
| // CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] |
| // CHECK: cond.true: |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]] |
| // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1 |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]] |
| // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]] |
| // CHECK-NEXT: br label [[COND_END:%.*]] |
| // CHECK: cond.false: |
| // CHECK-NEXT: br label [[COND_END]] |
| // CHECK: cond.end: |
| // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ] |
| // CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.18 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_16:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4 |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]] |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]] |
| // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.19 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_17:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4 |
| // CHECK-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: store i32 100, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: store i32 1, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]] |
| // CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] |
| // CHECK: cond.true: |
| // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4 |
| // CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4 |
| // CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]] |
| // CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1 |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]] |
| // CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4 |
| // CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]] |
| // CHECK-NEXT: br label [[COND_END:%.*]] |
| // CHECK: cond.false: |
| // CHECK-NEXT: br label [[COND_END]] |
| // CHECK: cond.end: |
| // CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ] |
| // CHECK-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-LABEL: define {{[^@]+}}@__captured_stmt.20 |
| // CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] { |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_18:%.*]], ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4 |
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]] |
| // CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]] |
| // CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !nonnull [[META2]], !align [[META3]] |
| // CHECK-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4 |
| // CHECK-NEXT: ret void |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@_Z14parallel_for_0v |
| // CHECK-DEBUG-SAME: () #[[ATTR0:[0-9]+]] !dbg [[DBG7:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PARALLEL:%.*]] |
| // CHECK-DEBUG: omp_parallel: |
| // CHECK-DEBUG-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB1:[0-9]+]], i32 0, ptr @_Z14parallel_for_0v..omp_par), !dbg [[DBG12:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT:%.*]] |
| // CHECK-DEBUG: omp.par.exit: |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG16:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@_Z14parallel_for_0v..omp_par |
| // CHECK-DEBUG-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]]) #[[ATTR1:[0-9]+]] !dbg [[DBG17:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: omp.par.entry: |
| // CHECK-DEBUG-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load i32, ptr [[TID_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: store i32 [[TMP0]], ptr [[TID_ADDR_LOCAL]], align 4 |
| // CHECK-DEBUG-NEXT: [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4 |
| // CHECK-DEBUG-NEXT: [[I:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED1:%.*]] = alloca [[STRUCT_ANON_0:%.*]], align 4 |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION:%.*]] |
| // CHECK-DEBUG: omp.par.region: |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[I]], [[META19:![0-9]+]], !DIExpression(), [[META24:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[META24]] |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON]], ptr [[AGG_CAPTURED]], i32 0, i32 0, !dbg [[DBG25:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store ptr [[I]], ptr [[TMP1]], align 8, !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_0]], ptr [[AGG_CAPTURED1]], i32 0, i32 0, !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG26:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP3]], ptr [[TMP2]], align 4, !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt(ptr [[DOTCOUNT_ADDR]], ptr [[AGG_CAPTURED]]), !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT:%.*]] = load i32, ptr [[DOTCOUNT_ADDR]], align 4, !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_PREHEADER:%.*]], !dbg [[DBG25]] |
| // CHECK-DEBUG: omp_loop.preheader: |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[P_LOWERBOUND]], align 4, !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = sub i32 [[DOTCOUNT]], 1, !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP4]], ptr [[P_UPPERBOUND]], align 4, !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[P_STRIDE]], align 4, !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB4:[0-9]+]]), !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i32 1, i32 0), !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, ptr [[P_LOWERBOUND]], align 4, !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[P_UPPERBOUND]], align 4, !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = sub i32 [[TMP6]], [[TMP5]], !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = add i32 [[TMP7]], 1, !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER:%.*]], !dbg [[DBG25]] |
| // CHECK-DEBUG: omp_loop.header: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_IV:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER]] ], [ [[OMP_LOOP_NEXT:%.*]], [[OMP_LOOP_INC:%.*]] ], !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_COND:%.*]], !dbg [[DBG25]] |
| // CHECK-DEBUG: omp_loop.cond: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_CMP:%.*]] = icmp ult i32 [[OMP_LOOP_IV]], [[TMP8]], !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: br i1 [[OMP_LOOP_CMP]], label [[OMP_LOOP_BODY:%.*]], label [[OMP_LOOP_EXIT:%.*]], !dbg [[DBG25]] |
| // CHECK-DEBUG: omp_loop.exit: |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB3]], i32 [[OMP_GLOBAL_THREAD_NUM]]), !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB4]]), !dbg [[DBG27:![0-9]+]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_barrier(ptr @[[GLOB5:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM2]]), !dbg [[DBG27]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_AFTER:%.*]], !dbg [[DBG25]] |
| // CHECK-DEBUG: omp_loop.after: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION_PARALLEL_AFTER:%.*]], !dbg [[DBG28:![0-9]+]] |
| // CHECK-DEBUG: omp.par.region.parallel.after: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] |
| // CHECK-DEBUG: omp.par.pre_finalize: |
| // CHECK-DEBUG-NEXT: br label [[DOTFINI:%.*]] |
| // CHECK-DEBUG: .fini: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT_EXITSTUB:%.*]], !dbg [[DBG28]] |
| // CHECK-DEBUG: omp_loop.body: |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = add i32 [[OMP_LOOP_IV]], [[TMP5]], !dbg [[DBG27]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.1(ptr [[I]], i32 [[TMP9]], ptr [[AGG_CAPTURED1]]), !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_INC]], !dbg [[DBG25]] |
| // CHECK-DEBUG: omp_loop.inc: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_NEXT]] = add nuw i32 [[OMP_LOOP_IV]], 1, !dbg [[DBG25]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER]], !dbg [[DBG25]] |
| // CHECK-DEBUG: omp.par.exit.exitStub: |
| // CHECK-DEBUG-NEXT: ret void |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2:[0-9]+]] !dbg [[DBG29:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DISTANCE_ADDR]], [[META37:![0-9]+]], !DIExpression(), [[META38:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META39:![0-9]+]], !DIExpression(), [[META38]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTART]], [[META40:![0-9]+]], !DIExpression(), [[META42:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG43:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG43]], !nonnull [[META11:![0-9]+]], !align [[META45:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG43]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4, !dbg [[META42]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTOP]], [[META46:![0-9]+]], !DIExpression(), [[META47:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 100, ptr [[DOTSTOP]], align 4, !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTEP]], [[META48:![0-9]+]], !DIExpression(), [[META47]]) |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[DOTSTEP]], align 4, !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]], !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]], !dbg [[META47]] |
| // CHECK-DEBUG: cond.true: |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]], !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1, !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]], !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]], !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: br label [[COND_END:%.*]], !dbg [[META47]] |
| // CHECK-DEBUG: cond.false: |
| // CHECK-DEBUG-NEXT: br label [[COND_END]], !dbg [[META47]] |
| // CHECK-DEBUG: cond.end: |
| // CHECK-DEBUG-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ], !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !dbg [[META47]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4, !dbg [[META47]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG49:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.1 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG51:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOOPVAR_ADDR]], [[META59:![0-9]+]], !DIExpression(), [[META60:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOGICAL_ADDR]], [[META61:![0-9]+]], !DIExpression(), [[META60]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META62:![0-9]+]], !DIExpression(), [[META60]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_0:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG63:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG63]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4, !dbg [[DBG65:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]], !dbg [[DBG65]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]], !dbg [[DBG65]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !dbg [[DBG65]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4, !dbg [[META60]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG63]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@_Z14parallel_for_1Pfid |
| // CHECK-DEBUG-SAME: (ptr noundef [[R:%.*]], i32 noundef [[A:%.*]], double noundef [[B:%.*]]) #[[ATTR0]] !dbg [[DBG68:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8 |
| // CHECK-DEBUG-NEXT: [[R_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[B_ADDR:%.*]] = alloca double, align 8 |
| // CHECK-DEBUG-NEXT: store ptr [[R]], ptr [[R_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[R_ADDR]], [[META74:![0-9]+]], !DIExpression(), [[META75:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[A_ADDR]], [[META76:![0-9]+]], !DIExpression(), [[META77:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store double [[B]], ptr [[B_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[B_ADDR]], [[META78:![0-9]+]], !DIExpression(), [[META79:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: br label [[OMP_PARALLEL:%.*]] |
| // CHECK-DEBUG: omp_parallel: |
| // CHECK-DEBUG-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0 |
| // CHECK-DEBUG-NEXT: store ptr [[A_ADDR]], ptr [[GEP_A_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1 |
| // CHECK-DEBUG-NEXT: store ptr [[B_ADDR]], ptr [[GEP_B_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2 |
| // CHECK-DEBUG-NEXT: store ptr [[R_ADDR]], ptr [[GEP_R_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB7:[0-9]+]], i32 1, ptr @_Z14parallel_for_1Pfid..omp_par.4, ptr [[STRUCTARG]]), !dbg [[DBG80:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT:%.*]] |
| // CHECK-DEBUG: omp.par.exit: |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG85:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@_Z14parallel_for_1Pfid..omp_par.4 |
| // CHECK-DEBUG-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1]] !dbg [[DBG86:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: omp.par.entry: |
| // CHECK-DEBUG-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8, !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_B_ADDR:%.*]] = load ptr, ptr [[GEP_B_ADDR]], align 8, !align [[META87:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_R_ADDR:%.*]] = load ptr, ptr [[GEP_R_ADDR]], align 8, !align [[META87]] |
| // CHECK-DEBUG-NEXT: [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8 |
| // CHECK-DEBUG-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4 |
| // CHECK-DEBUG-NEXT: [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_A_ADDR]], [[META88:![0-9]+]], !DIExpression(), [[META89:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_B_ADDR]], [[META90:![0-9]+]], !DIExpression(), [[META91:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_R_ADDR]], [[META92:![0-9]+]], !DIExpression(), [[META93:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION:%.*]] |
| // CHECK-DEBUG: omp.par.region: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PARALLEL:%.*]] |
| // CHECK-DEBUG: omp_parallel: |
| // CHECK-DEBUG-NEXT: [[GEP_A_ADDR1:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0 |
| // CHECK-DEBUG-NEXT: store ptr [[LOADGEP_A_ADDR]], ptr [[GEP_A_ADDR1]], align 8 |
| // CHECK-DEBUG-NEXT: [[GEP_B_ADDR2:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1 |
| // CHECK-DEBUG-NEXT: store ptr [[LOADGEP_B_ADDR]], ptr [[GEP_B_ADDR2]], align 8 |
| // CHECK-DEBUG-NEXT: [[GEP_R_ADDR3:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2 |
| // CHECK-DEBUG-NEXT: store ptr [[LOADGEP_R_ADDR]], ptr [[GEP_R_ADDR3]], align 8 |
| // CHECK-DEBUG-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB9:[0-9]+]], i32 1, ptr @_Z14parallel_for_1Pfid..omp_par, ptr [[STRUCTARG]]), !dbg [[DBG94:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT6:%.*]] |
| // CHECK-DEBUG: omp.par.exit6: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION_PARALLEL_AFTER:%.*]], !dbg [[DBG99:![0-9]+]] |
| // CHECK-DEBUG: omp.par.region.parallel.after: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] |
| // CHECK-DEBUG: omp.par.pre_finalize: |
| // CHECK-DEBUG-NEXT: br label [[DOTFINI14:%.*]] |
| // CHECK-DEBUG: .fini14: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT_EXITSTUB:%.*]], !dbg [[DBG99]] |
| // CHECK-DEBUG: omp.par.exit.exitStub: |
| // CHECK-DEBUG-NEXT: ret void |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@_Z14parallel_for_1Pfid..omp_par |
| // CHECK-DEBUG-SAME: (ptr noalias [[TID_ADDR1:%.*]], ptr noalias [[ZERO_ADDR2:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1]] !dbg [[DBG100:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: omp.par.entry3: |
| // CHECK-DEBUG-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8, !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_B_ADDR:%.*]] = load ptr, ptr [[GEP_B_ADDR]], align 8, !align [[META87]] |
| // CHECK-DEBUG-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_R_ADDR:%.*]] = load ptr, ptr [[GEP_R_ADDR]], align 8, !align [[META87]] |
| // CHECK-DEBUG-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TID_ADDR_LOCAL7:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR1]], align 4 |
| // CHECK-DEBUG-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL7]], align 4 |
| // CHECK-DEBUG-NEXT: [[TID8:%.*]] = load i32, ptr [[TID_ADDR_LOCAL7]], align 4 |
| // CHECK-DEBUG-NEXT: [[I:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON_1:%.*]], align 8 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED11:%.*]] = alloca [[STRUCT_ANON_2:%.*]], align 4 |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_A_ADDR]], [[META101:![0-9]+]], !DIExpression(), [[META102:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_B_ADDR]], [[META103:![0-9]+]], !DIExpression(), [[META104:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_R_ADDR]], [[META105:![0-9]+]], !DIExpression(), [[META106:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION4:%.*]] |
| // CHECK-DEBUG: omp.par.region4: |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[I]], [[META107:![0-9]+]], !DIExpression(), [[META112:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[META112]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_1]], ptr [[AGG_CAPTURED]], i32 0, i32 0, !dbg [[DBG113:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store ptr [[I]], ptr [[TMP2]], align 8, !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_2]], ptr [[AGG_CAPTURED11]], i32 0, i32 0, !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG114:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP4]], ptr [[TMP3]], align 4, !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.2(ptr [[DOTCOUNT_ADDR]], ptr [[AGG_CAPTURED]]), !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT:%.*]] = load i32, ptr [[DOTCOUNT_ADDR]], align 4, !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_PREHEADER:%.*]], !dbg [[DBG113]] |
| // CHECK-DEBUG: omp_loop.preheader: |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[P_LOWERBOUND]], align 4, !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = sub i32 [[DOTCOUNT]], 1, !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP5]], ptr [[P_UPPERBOUND]], align 4, !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[P_STRIDE]], align 4, !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB12:[0-9]+]]), !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB11:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i32 1, i32 0), !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[P_LOWERBOUND]], align 4, !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[P_UPPERBOUND]], align 4, !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = sub i32 [[TMP7]], [[TMP6]], !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = add i32 [[TMP8]], 1, !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER:%.*]], !dbg [[DBG113]] |
| // CHECK-DEBUG: omp_loop.header: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_IV:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER]] ], [ [[OMP_LOOP_NEXT:%.*]], [[OMP_LOOP_INC:%.*]] ], !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_COND:%.*]], !dbg [[DBG113]] |
| // CHECK-DEBUG: omp_loop.cond: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_CMP:%.*]] = icmp ult i32 [[OMP_LOOP_IV]], [[TMP9]], !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: br i1 [[OMP_LOOP_CMP]], label [[OMP_LOOP_BODY:%.*]], label [[OMP_LOOP_EXIT:%.*]], !dbg [[DBG113]] |
| // CHECK-DEBUG: omp_loop.exit: |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB11]], i32 [[OMP_GLOBAL_THREAD_NUM]]), !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM13:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB12]]), !dbg [[DBG115:![0-9]+]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_barrier(ptr @[[GLOB13:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM13]]), !dbg [[DBG115]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_AFTER:%.*]], !dbg [[DBG113]] |
| // CHECK-DEBUG: omp_loop.after: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION4_PARALLEL_AFTER:%.*]], !dbg [[DBG116:![0-9]+]] |
| // CHECK-DEBUG: omp.par.region4.parallel.after: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_PRE_FINALIZE5:%.*]] |
| // CHECK-DEBUG: omp.par.pre_finalize5: |
| // CHECK-DEBUG-NEXT: br label [[DOTFINI:%.*]] |
| // CHECK-DEBUG: .fini: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT6_EXITSTUB:%.*]], !dbg [[DBG116]] |
| // CHECK-DEBUG: omp_loop.body: |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = add i32 [[OMP_LOOP_IV]], [[TMP6]], !dbg [[DBG115]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.3(ptr [[I]], i32 [[TMP10]], ptr [[AGG_CAPTURED11]]), !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: [[TMP11:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4, !dbg [[DBG117:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP11]] to double, !dbg [[DBG117]] |
| // CHECK-DEBUG-NEXT: [[TMP12:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8, !dbg [[DBG119:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = fadd double [[CONV]], [[TMP12]], !dbg [[DBG120:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV12:%.*]] = fptrunc double [[ADD]] to float, !dbg [[DBG117]] |
| // CHECK-DEBUG-NEXT: [[TMP13:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8, !dbg [[DBG121:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store float [[CONV12]], ptr [[TMP13]], align 4, !dbg [[DBG122:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_INC]], !dbg [[DBG113]] |
| // CHECK-DEBUG: omp_loop.inc: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_NEXT]] = add nuw i32 [[OMP_LOOP_IV]], 1, !dbg [[DBG113]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER]], !dbg [[DBG113]] |
| // CHECK-DEBUG: omp.par.exit6.exitStub: |
| // CHECK-DEBUG-NEXT: ret void |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.2 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG123:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DISTANCE_ADDR]], [[META124:![0-9]+]], !DIExpression(), [[META125:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META126:![0-9]+]], !DIExpression(), [[META125]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTART]], [[META127:![0-9]+]], !DIExpression(), [[META129:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_1:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG130:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG130]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG130]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4, !dbg [[META129]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTOP]], [[META132:![0-9]+]], !DIExpression(), [[META133:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 100, ptr [[DOTSTOP]], align 4, !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTEP]], [[META134:![0-9]+]], !DIExpression(), [[META133]]) |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[DOTSTEP]], align 4, !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]], !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]], !dbg [[META133]] |
| // CHECK-DEBUG: cond.true: |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]], !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1, !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]], !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]], !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: br label [[COND_END:%.*]], !dbg [[META133]] |
| // CHECK-DEBUG: cond.false: |
| // CHECK-DEBUG-NEXT: br label [[COND_END]], !dbg [[META133]] |
| // CHECK-DEBUG: cond.end: |
| // CHECK-DEBUG-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ], !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !dbg [[META133]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4, !dbg [[META133]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG135:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.3 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG137:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOOPVAR_ADDR]], [[META138:![0-9]+]], !DIExpression(), [[META139:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOGICAL_ADDR]], [[META140:![0-9]+]], !DIExpression(), [[META139]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META141:![0-9]+]], !DIExpression(), [[META139]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_2:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG142:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG142]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4, !dbg [[DBG144:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]], !dbg [[DBG144]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]], !dbg [[DBG144]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !dbg [[DBG144]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4, !dbg [[META139]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG142]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@_Z14parallel_for_2Pfid |
| // CHECK-DEBUG-SAME: (ptr noundef [[R:%.*]], i32 noundef [[A:%.*]], double noundef [[B:%.*]]) #[[ATTR0]] !dbg [[DBG145:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8 |
| // CHECK-DEBUG-NEXT: [[R_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[B_ADDR:%.*]] = alloca double, align 8 |
| // CHECK-DEBUG-NEXT: [[I181:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED182:%.*]] = alloca [[STRUCT_ANON_17:%.*]], align 8 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED183:%.*]] = alloca [[STRUCT_ANON_18:%.*]], align 4 |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT_ADDR184:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LASTITER199:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LOWERBOUND200:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_UPPERBOUND201:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_STRIDE202:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: store ptr [[R]], ptr [[R_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[R_ADDR]], [[META146:![0-9]+]], !DIExpression(), [[META147:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[A_ADDR]], [[META148:![0-9]+]], !DIExpression(), [[META149:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store double [[B]], ptr [[B_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[B_ADDR]], [[META150:![0-9]+]], !DIExpression(), [[META151:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: br label [[OMP_PARALLEL:%.*]] |
| // CHECK-DEBUG: omp_parallel: |
| // CHECK-DEBUG-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0 |
| // CHECK-DEBUG-NEXT: store ptr [[A_ADDR]], ptr [[GEP_A_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1 |
| // CHECK-DEBUG-NEXT: store ptr [[B_ADDR]], ptr [[GEP_B_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2 |
| // CHECK-DEBUG-NEXT: store ptr [[R_ADDR]], ptr [[GEP_R_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB15:[0-9]+]], i32 1, ptr @_Z14parallel_for_2Pfid..omp_par.23, ptr [[STRUCTARG]]), !dbg [[DBG152:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT:%.*]] |
| // CHECK-DEBUG: omp.par.exit: |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[I181]], [[META156:![0-9]+]], !DIExpression(), [[META159:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[I181]], align 4, !dbg [[META159]] |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_17]], ptr [[AGG_CAPTURED182]], i32 0, i32 0, !dbg [[DBG160:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store ptr [[I181]], ptr [[TMP0]], align 8, !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_18]], ptr [[AGG_CAPTURED183]], i32 0, i32 0, !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, ptr [[I181]], align 4, !dbg [[DBG161:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP2]], ptr [[TMP1]], align 4, !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.19(ptr [[DOTCOUNT_ADDR184]], ptr [[AGG_CAPTURED182]]), !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT185:%.*]] = load i32, ptr [[DOTCOUNT_ADDR184]], align 4, !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_PREHEADER186:%.*]], !dbg [[DBG160]] |
| // CHECK-DEBUG: omp_loop.preheader186: |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[P_LOWERBOUND200]], align 4, !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = sub i32 [[DOTCOUNT185]], 1, !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP3]], ptr [[P_UPPERBOUND201]], align 4, !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[P_STRIDE202]], align 4, !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM203:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB52:[0-9]+]]), !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB51:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM203]], i32 34, ptr [[P_LASTITER199]], ptr [[P_LOWERBOUND200]], ptr [[P_UPPERBOUND201]], ptr [[P_STRIDE202]], i32 1, i32 0), !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[P_LOWERBOUND200]], align 4, !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, ptr [[P_UPPERBOUND201]], align 4, !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = sub i32 [[TMP5]], [[TMP4]], !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = add i32 [[TMP6]], 1, !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER187:%.*]], !dbg [[DBG160]] |
| // CHECK-DEBUG: omp_loop.header187: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_IV193:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER186]] ], [ [[OMP_LOOP_NEXT195:%.*]], [[OMP_LOOP_INC190:%.*]] ], !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_COND188:%.*]], !dbg [[DBG160]] |
| // CHECK-DEBUG: omp_loop.cond188: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_CMP194:%.*]] = icmp ult i32 [[OMP_LOOP_IV193]], [[TMP7]], !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: br i1 [[OMP_LOOP_CMP194]], label [[OMP_LOOP_BODY189:%.*]], label [[OMP_LOOP_EXIT191:%.*]], !dbg [[DBG160]] |
| // CHECK-DEBUG: omp_loop.body189: |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = add i32 [[OMP_LOOP_IV193]], [[TMP4]], !dbg [[DBG162:![0-9]+]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.20(ptr [[I181]], i32 [[TMP8]], ptr [[AGG_CAPTURED183]]), !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, ptr [[A_ADDR]], align 4, !dbg [[DBG163:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV196:%.*]] = sitofp i32 [[TMP9]] to double, !dbg [[DBG163]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load double, ptr [[B_ADDR]], align 8, !dbg [[DBG162]] |
| // CHECK-DEBUG-NEXT: [[ADD197:%.*]] = fadd double [[CONV196]], [[TMP10]], !dbg [[DBG164:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV198:%.*]] = fptrunc double [[ADD197]] to float, !dbg [[DBG163]] |
| // CHECK-DEBUG-NEXT: [[TMP11:%.*]] = load ptr, ptr [[R_ADDR]], align 8, !dbg [[DBG165:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store float [[CONV198]], ptr [[TMP11]], align 4, !dbg [[DBG166:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_INC190]], !dbg [[DBG160]] |
| // CHECK-DEBUG: omp_loop.inc190: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_NEXT195]] = add nuw i32 [[OMP_LOOP_IV193]], 1, !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER187]], !dbg [[DBG160]] |
| // CHECK-DEBUG: omp_loop.exit191: |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB51]], i32 [[OMP_GLOBAL_THREAD_NUM203]]), !dbg [[DBG160]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM204:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB52]]), !dbg [[DBG162]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_barrier(ptr @[[GLOB53:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM204]]), !dbg [[DBG162]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_AFTER192:%.*]], !dbg [[DBG160]] |
| // CHECK-DEBUG: omp_loop.after192: |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG167:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@_Z14parallel_for_2Pfid..omp_par.23 |
| // CHECK-DEBUG-SAME: (ptr noalias [[TID_ADDR:%.*]], ptr noalias [[ZERO_ADDR:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1]] !dbg [[DBG168:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: omp.par.entry: |
| // CHECK-DEBUG-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8, !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_B_ADDR:%.*]] = load ptr, ptr [[GEP_B_ADDR]], align 8, !align [[META87]] |
| // CHECK-DEBUG-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_R_ADDR:%.*]] = load ptr, ptr [[GEP_R_ADDR]], align 8, !align [[META87]] |
| // CHECK-DEBUG-NEXT: [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8 |
| // CHECK-DEBUG-NEXT: [[P_LASTITER174:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LOWERBOUND175:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_UPPERBOUND176:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_STRIDE177:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LASTITER:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LOWERBOUND:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_UPPERBOUND:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_STRIDE:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TID_ADDR_LOCAL:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4 |
| // CHECK-DEBUG-NEXT: [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4 |
| // CHECK-DEBUG-NEXT: [[I:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON_3:%.*]], align 8 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED1:%.*]] = alloca [[STRUCT_ANON_4:%.*]], align 4 |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[I156:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED157:%.*]] = alloca [[STRUCT_ANON_15:%.*]], align 8 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED158:%.*]] = alloca [[STRUCT_ANON_16:%.*]], align 4 |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT_ADDR159:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_A_ADDR]], [[META169:![0-9]+]], !DIExpression(), [[META170:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_B_ADDR]], [[META171:![0-9]+]], !DIExpression(), [[META172:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_R_ADDR]], [[META173:![0-9]+]], !DIExpression(), [[META174:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION:%.*]] |
| // CHECK-DEBUG: omp.par.region: |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[I]], [[META175:![0-9]+]], !DIExpression(), [[META179:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[META179]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_3]], ptr [[AGG_CAPTURED]], i32 0, i32 0, !dbg [[DBG180:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store ptr [[I]], ptr [[TMP2]], align 8, !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_4]], ptr [[AGG_CAPTURED1]], i32 0, i32 0, !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG181:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP4]], ptr [[TMP3]], align 4, !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.5(ptr [[DOTCOUNT_ADDR]], ptr [[AGG_CAPTURED]]), !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT:%.*]] = load i32, ptr [[DOTCOUNT_ADDR]], align 4, !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_PREHEADER:%.*]], !dbg [[DBG180]] |
| // CHECK-DEBUG: omp_loop.preheader: |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[P_LOWERBOUND]], align 4, !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = sub i32 [[DOTCOUNT]], 1, !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP5]], ptr [[P_UPPERBOUND]], align 4, !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[P_STRIDE]], align 4, !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB18:[0-9]+]]), !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB17:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 34, ptr [[P_LASTITER]], ptr [[P_LOWERBOUND]], ptr [[P_UPPERBOUND]], ptr [[P_STRIDE]], i32 1, i32 0), !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[P_LOWERBOUND]], align 4, !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[P_UPPERBOUND]], align 4, !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = sub i32 [[TMP7]], [[TMP6]], !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = add i32 [[TMP8]], 1, !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER:%.*]], !dbg [[DBG180]] |
| // CHECK-DEBUG: omp_loop.header: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_IV:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER]] ], [ [[OMP_LOOP_NEXT:%.*]], [[OMP_LOOP_INC:%.*]] ], !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_COND:%.*]], !dbg [[DBG180]] |
| // CHECK-DEBUG: omp_loop.cond: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_CMP:%.*]] = icmp ult i32 [[OMP_LOOP_IV]], [[TMP9]], !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: br i1 [[OMP_LOOP_CMP]], label [[OMP_LOOP_BODY:%.*]], label [[OMP_LOOP_EXIT:%.*]], !dbg [[DBG180]] |
| // CHECK-DEBUG: omp_loop.exit: |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB17]], i32 [[OMP_GLOBAL_THREAD_NUM]]), !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM3:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB18]]), !dbg [[DBG182:![0-9]+]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_barrier(ptr @[[GLOB19:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM3]]), !dbg [[DBG182]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_AFTER:%.*]], !dbg [[DBG180]] |
| // CHECK-DEBUG: omp_loop.after: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PARALLEL:%.*]] |
| // CHECK-DEBUG: omp_parallel: |
| // CHECK-DEBUG-NEXT: [[GEP_A_ADDR1:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0 |
| // CHECK-DEBUG-NEXT: store ptr [[LOADGEP_A_ADDR]], ptr [[GEP_A_ADDR1]], align 8 |
| // CHECK-DEBUG-NEXT: [[GEP_B_ADDR2:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1 |
| // CHECK-DEBUG-NEXT: store ptr [[LOADGEP_B_ADDR]], ptr [[GEP_B_ADDR2]], align 8 |
| // CHECK-DEBUG-NEXT: [[GEP_R_ADDR3:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2 |
| // CHECK-DEBUG-NEXT: store ptr [[LOADGEP_R_ADDR]], ptr [[GEP_R_ADDR3]], align 8 |
| // CHECK-DEBUG-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB21:[0-9]+]], i32 1, ptr @_Z14parallel_for_2Pfid..omp_par.22, ptr [[STRUCTARG]]), !dbg [[DBG183:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT9:%.*]] |
| // CHECK-DEBUG: omp.par.exit9: |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[I156]], [[META187:![0-9]+]], !DIExpression(), [[META190:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[I156]], align 4, !dbg [[META190]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_15]], ptr [[AGG_CAPTURED157]], i32 0, i32 0, !dbg [[DBG191:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store ptr [[I156]], ptr [[TMP10]], align 8, !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_16]], ptr [[AGG_CAPTURED158]], i32 0, i32 0, !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: [[TMP12:%.*]] = load i32, ptr [[I156]], align 4, !dbg [[DBG192:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP12]], ptr [[TMP11]], align 4, !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.17(ptr [[DOTCOUNT_ADDR159]], ptr [[AGG_CAPTURED157]]), !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT160:%.*]] = load i32, ptr [[DOTCOUNT_ADDR159]], align 4, !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_PREHEADER161:%.*]], !dbg [[DBG191]] |
| // CHECK-DEBUG: omp_loop.preheader161: |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[P_LOWERBOUND175]], align 4, !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: [[TMP13:%.*]] = sub i32 [[DOTCOUNT160]], 1, !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP13]], ptr [[P_UPPERBOUND176]], align 4, !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[P_STRIDE177]], align 4, !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM178:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB48:[0-9]+]]), !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB47:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM178]], i32 34, ptr [[P_LASTITER174]], ptr [[P_LOWERBOUND175]], ptr [[P_UPPERBOUND176]], ptr [[P_STRIDE177]], i32 1, i32 0), !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: [[TMP14:%.*]] = load i32, ptr [[P_LOWERBOUND175]], align 4, !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: [[TMP15:%.*]] = load i32, ptr [[P_UPPERBOUND176]], align 4, !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: [[TMP16:%.*]] = sub i32 [[TMP15]], [[TMP14]], !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: [[TMP17:%.*]] = add i32 [[TMP16]], 1, !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER162:%.*]], !dbg [[DBG191]] |
| // CHECK-DEBUG: omp_loop.header162: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_IV168:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER161]] ], [ [[OMP_LOOP_NEXT170:%.*]], [[OMP_LOOP_INC165:%.*]] ], !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_COND163:%.*]], !dbg [[DBG191]] |
| // CHECK-DEBUG: omp_loop.cond163: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_CMP169:%.*]] = icmp ult i32 [[OMP_LOOP_IV168]], [[TMP17]], !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: br i1 [[OMP_LOOP_CMP169]], label [[OMP_LOOP_BODY164:%.*]], label [[OMP_LOOP_EXIT166:%.*]], !dbg [[DBG191]] |
| // CHECK-DEBUG: omp_loop.exit166: |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB47]], i32 [[OMP_GLOBAL_THREAD_NUM178]]), !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM179:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB48]]), !dbg [[DBG193:![0-9]+]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_barrier(ptr @[[GLOB49:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM179]]), !dbg [[DBG193]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_AFTER167:%.*]], !dbg [[DBG191]] |
| // CHECK-DEBUG: omp_loop.after167: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION_PARALLEL_AFTER:%.*]], !dbg [[DBG194:![0-9]+]] |
| // CHECK-DEBUG: omp.par.region.parallel.after: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]] |
| // CHECK-DEBUG: omp.par.pre_finalize: |
| // CHECK-DEBUG-NEXT: br label [[DOTFINI180:%.*]] |
| // CHECK-DEBUG: .fini180: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT_EXITSTUB:%.*]], !dbg [[DBG194]] |
| // CHECK-DEBUG: omp_loop.body164: |
| // CHECK-DEBUG-NEXT: [[TMP18:%.*]] = add i32 [[OMP_LOOP_IV168]], [[TMP14]], !dbg [[DBG193]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.18(ptr [[I156]], i32 [[TMP18]], ptr [[AGG_CAPTURED158]]), !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: [[TMP19:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4, !dbg [[DBG195:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV171:%.*]] = sitofp i32 [[TMP19]] to double, !dbg [[DBG195]] |
| // CHECK-DEBUG-NEXT: [[TMP20:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8, !dbg [[DBG193]] |
| // CHECK-DEBUG-NEXT: [[ADD172:%.*]] = fadd double [[CONV171]], [[TMP20]], !dbg [[DBG196:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV173:%.*]] = fptrunc double [[ADD172]] to float, !dbg [[DBG195]] |
| // CHECK-DEBUG-NEXT: [[TMP21:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8, !dbg [[DBG197:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store float [[CONV173]], ptr [[TMP21]], align 4, !dbg [[DBG198:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_INC165]], !dbg [[DBG191]] |
| // CHECK-DEBUG: omp_loop.inc165: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_NEXT170]] = add nuw i32 [[OMP_LOOP_IV168]], 1, !dbg [[DBG191]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER162]], !dbg [[DBG191]] |
| // CHECK-DEBUG: omp_loop.body: |
| // CHECK-DEBUG-NEXT: [[TMP22:%.*]] = add i32 [[OMP_LOOP_IV]], [[TMP6]], !dbg [[DBG182]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.6(ptr [[I]], i32 [[TMP22]], ptr [[AGG_CAPTURED1]]), !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: [[TMP23:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4, !dbg [[DBG199:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV:%.*]] = sitofp i32 [[TMP23]] to double, !dbg [[DBG199]] |
| // CHECK-DEBUG-NEXT: [[TMP24:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8, !dbg [[DBG182]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = fadd double [[CONV]], [[TMP24]], !dbg [[DBG200:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV2:%.*]] = fptrunc double [[ADD]] to float, !dbg [[DBG199]] |
| // CHECK-DEBUG-NEXT: [[TMP25:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8, !dbg [[DBG201:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store float [[CONV2]], ptr [[TMP25]], align 4, !dbg [[DBG202:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_INC]], !dbg [[DBG180]] |
| // CHECK-DEBUG: omp_loop.inc: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_NEXT]] = add nuw i32 [[OMP_LOOP_IV]], 1, !dbg [[DBG180]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER]], !dbg [[DBG180]] |
| // CHECK-DEBUG: omp.par.exit.exitStub: |
| // CHECK-DEBUG-NEXT: ret void |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@_Z14parallel_for_2Pfid..omp_par.22 |
| // CHECK-DEBUG-SAME: (ptr noalias [[TID_ADDR4:%.*]], ptr noalias [[ZERO_ADDR5:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1]] !dbg [[DBG203:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: omp.par.entry6: |
| // CHECK-DEBUG-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8, !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_B_ADDR:%.*]] = load ptr, ptr [[GEP_B_ADDR]], align 8, !align [[META87]] |
| // CHECK-DEBUG-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_R_ADDR:%.*]] = load ptr, ptr [[GEP_R_ADDR]], align 8, !align [[META87]] |
| // CHECK-DEBUG-NEXT: [[STRUCTARG205:%.*]] = alloca { ptr, ptr, ptr }, align 8 |
| // CHECK-DEBUG-NEXT: [[STRUCTARG:%.*]] = alloca { ptr, ptr, ptr }, align 8 |
| // CHECK-DEBUG-NEXT: [[P_LASTITER149:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LOWERBOUND150:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_UPPERBOUND151:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_STRIDE152:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LASTITER90:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LOWERBOUND91:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_UPPERBOUND92:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_STRIDE93:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LASTITER32:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LOWERBOUND33:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_UPPERBOUND34:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_STRIDE35:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TID_ADDR_LOCAL10:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR4]], align 4 |
| // CHECK-DEBUG-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL10]], align 4 |
| // CHECK-DEBUG-NEXT: [[TID11:%.*]] = load i32, ptr [[TID_ADDR_LOCAL10]], align 4 |
| // CHECK-DEBUG-NEXT: [[I14:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED15:%.*]] = alloca [[STRUCT_ANON_5:%.*]], align 8 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED16:%.*]] = alloca [[STRUCT_ANON_6:%.*]], align 4 |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT_ADDR17:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[I72:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED73:%.*]] = alloca [[STRUCT_ANON_9:%.*]], align 8 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED74:%.*]] = alloca [[STRUCT_ANON_10:%.*]], align 4 |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT_ADDR75:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[I131:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED132:%.*]] = alloca [[STRUCT_ANON_13:%.*]], align 8 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED133:%.*]] = alloca [[STRUCT_ANON_14:%.*]], align 4 |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT_ADDR134:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_A_ADDR]], [[META204:![0-9]+]], !DIExpression(), [[META205:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_B_ADDR]], [[META206:![0-9]+]], !DIExpression(), [[META207:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_R_ADDR]], [[META208:![0-9]+]], !DIExpression(), [[META209:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION7:%.*]] |
| // CHECK-DEBUG: omp.par.region7: |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[I14]], [[META210:![0-9]+]], !DIExpression(), [[META215:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[I14]], align 4, !dbg [[META215]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_5]], ptr [[AGG_CAPTURED15]], i32 0, i32 0, !dbg [[DBG216:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store ptr [[I14]], ptr [[TMP2]], align 8, !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_6]], ptr [[AGG_CAPTURED16]], i32 0, i32 0, !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[I14]], align 4, !dbg [[DBG217:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP4]], ptr [[TMP3]], align 4, !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.7(ptr [[DOTCOUNT_ADDR17]], ptr [[AGG_CAPTURED15]]), !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT18:%.*]] = load i32, ptr [[DOTCOUNT_ADDR17]], align 4, !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_PREHEADER19:%.*]], !dbg [[DBG216]] |
| // CHECK-DEBUG: omp_loop.preheader19: |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[P_LOWERBOUND33]], align 4, !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = sub i32 [[DOTCOUNT18]], 1, !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP5]], ptr [[P_UPPERBOUND34]], align 4, !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[P_STRIDE35]], align 4, !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM36:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB24:[0-9]+]]), !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB23:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM36]], i32 34, ptr [[P_LASTITER32]], ptr [[P_LOWERBOUND33]], ptr [[P_UPPERBOUND34]], ptr [[P_STRIDE35]], i32 1, i32 0), !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[P_LOWERBOUND33]], align 4, !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[P_UPPERBOUND34]], align 4, !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = sub i32 [[TMP7]], [[TMP6]], !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = add i32 [[TMP8]], 1, !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER20:%.*]], !dbg [[DBG216]] |
| // CHECK-DEBUG: omp_loop.header20: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_IV26:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER19]] ], [ [[OMP_LOOP_NEXT28:%.*]], [[OMP_LOOP_INC23:%.*]] ], !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_COND21:%.*]], !dbg [[DBG216]] |
| // CHECK-DEBUG: omp_loop.cond21: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_CMP27:%.*]] = icmp ult i32 [[OMP_LOOP_IV26]], [[TMP9]], !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: br i1 [[OMP_LOOP_CMP27]], label [[OMP_LOOP_BODY22:%.*]], label [[OMP_LOOP_EXIT24:%.*]], !dbg [[DBG216]] |
| // CHECK-DEBUG: omp_loop.exit24: |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB23]], i32 [[OMP_GLOBAL_THREAD_NUM36]]), !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM37:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB24]]), !dbg [[DBG218:![0-9]+]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_barrier(ptr @[[GLOB25:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM37]]), !dbg [[DBG218]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_AFTER25:%.*]], !dbg [[DBG216]] |
| // CHECK-DEBUG: omp_loop.after25: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PARALLEL:%.*]] |
| // CHECK-DEBUG: omp_parallel: |
| // CHECK-DEBUG-NEXT: [[GEP_A_ADDR1:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 0 |
| // CHECK-DEBUG-NEXT: store ptr [[LOADGEP_A_ADDR]], ptr [[GEP_A_ADDR1]], align 8 |
| // CHECK-DEBUG-NEXT: [[GEP_B_ADDR2:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 1 |
| // CHECK-DEBUG-NEXT: store ptr [[LOADGEP_B_ADDR]], ptr [[GEP_B_ADDR2]], align 8 |
| // CHECK-DEBUG-NEXT: [[GEP_R_ADDR3:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG]], i32 0, i32 2 |
| // CHECK-DEBUG-NEXT: store ptr [[LOADGEP_R_ADDR]], ptr [[GEP_R_ADDR3]], align 8 |
| // CHECK-DEBUG-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB27:[0-9]+]], i32 1, ptr @_Z14parallel_for_2Pfid..omp_par, ptr [[STRUCTARG]]), !dbg [[DBG219:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT43:%.*]] |
| // CHECK-DEBUG: omp.par.exit43: |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[I72]], [[META223:![0-9]+]], !DIExpression(), [[META226:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[I72]], align 4, !dbg [[META226]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_9]], ptr [[AGG_CAPTURED73]], i32 0, i32 0, !dbg [[DBG227:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store ptr [[I72]], ptr [[TMP10]], align 8, !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_10]], ptr [[AGG_CAPTURED74]], i32 0, i32 0, !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: [[TMP12:%.*]] = load i32, ptr [[I72]], align 4, !dbg [[DBG228:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP12]], ptr [[TMP11]], align 4, !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.11(ptr [[DOTCOUNT_ADDR75]], ptr [[AGG_CAPTURED73]]), !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT76:%.*]] = load i32, ptr [[DOTCOUNT_ADDR75]], align 4, !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_PREHEADER77:%.*]], !dbg [[DBG227]] |
| // CHECK-DEBUG: omp_loop.preheader77: |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[P_LOWERBOUND91]], align 4, !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: [[TMP13:%.*]] = sub i32 [[DOTCOUNT76]], 1, !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP13]], ptr [[P_UPPERBOUND92]], align 4, !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[P_STRIDE93]], align 4, !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM94:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB34:[0-9]+]]), !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB33:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM94]], i32 34, ptr [[P_LASTITER90]], ptr [[P_LOWERBOUND91]], ptr [[P_UPPERBOUND92]], ptr [[P_STRIDE93]], i32 1, i32 0), !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: [[TMP14:%.*]] = load i32, ptr [[P_LOWERBOUND91]], align 4, !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: [[TMP15:%.*]] = load i32, ptr [[P_UPPERBOUND92]], align 4, !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: [[TMP16:%.*]] = sub i32 [[TMP15]], [[TMP14]], !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: [[TMP17:%.*]] = add i32 [[TMP16]], 1, !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER78:%.*]], !dbg [[DBG227]] |
| // CHECK-DEBUG: omp_loop.header78: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_IV84:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER77]] ], [ [[OMP_LOOP_NEXT86:%.*]], [[OMP_LOOP_INC81:%.*]] ], !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_COND79:%.*]], !dbg [[DBG227]] |
| // CHECK-DEBUG: omp_loop.cond79: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_CMP85:%.*]] = icmp ult i32 [[OMP_LOOP_IV84]], [[TMP17]], !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: br i1 [[OMP_LOOP_CMP85]], label [[OMP_LOOP_BODY80:%.*]], label [[OMP_LOOP_EXIT82:%.*]], !dbg [[DBG227]] |
| // CHECK-DEBUG: omp_loop.exit82: |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB33]], i32 [[OMP_GLOBAL_THREAD_NUM94]]), !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM95:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB34]]), !dbg [[DBG229:![0-9]+]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_barrier(ptr @[[GLOB35:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM95]]), !dbg [[DBG229]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_AFTER83:%.*]], !dbg [[DBG227]] |
| // CHECK-DEBUG: omp_loop.after83: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PARALLEL209:%.*]] |
| // CHECK-DEBUG: omp_parallel209: |
| // CHECK-DEBUG-NEXT: [[GEP_A_ADDR206:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG205]], i32 0, i32 0 |
| // CHECK-DEBUG-NEXT: store ptr [[LOADGEP_A_ADDR]], ptr [[GEP_A_ADDR206]], align 8 |
| // CHECK-DEBUG-NEXT: [[GEP_B_ADDR207:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG205]], i32 0, i32 1 |
| // CHECK-DEBUG-NEXT: store ptr [[LOADGEP_B_ADDR]], ptr [[GEP_B_ADDR207]], align 8 |
| // CHECK-DEBUG-NEXT: [[GEP_R_ADDR208:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[STRUCTARG205]], i32 0, i32 2 |
| // CHECK-DEBUG-NEXT: store ptr [[LOADGEP_R_ADDR]], ptr [[GEP_R_ADDR208]], align 8 |
| // CHECK-DEBUG-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB37:[0-9]+]], i32 1, ptr @_Z14parallel_for_2Pfid..omp_par.21, ptr [[STRUCTARG205]]), !dbg [[DBG230:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT101:%.*]] |
| // CHECK-DEBUG: omp.par.exit101: |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[I131]], [[META234:![0-9]+]], !DIExpression(), [[META237:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[I131]], align 4, !dbg [[META237]] |
| // CHECK-DEBUG-NEXT: [[TMP18:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_13]], ptr [[AGG_CAPTURED132]], i32 0, i32 0, !dbg [[DBG238:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store ptr [[I131]], ptr [[TMP18]], align 8, !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: [[TMP19:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_14]], ptr [[AGG_CAPTURED133]], i32 0, i32 0, !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: [[TMP20:%.*]] = load i32, ptr [[I131]], align 4, !dbg [[DBG239:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP20]], ptr [[TMP19]], align 4, !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.15(ptr [[DOTCOUNT_ADDR134]], ptr [[AGG_CAPTURED132]]), !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT135:%.*]] = load i32, ptr [[DOTCOUNT_ADDR134]], align 4, !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_PREHEADER136:%.*]], !dbg [[DBG238]] |
| // CHECK-DEBUG: omp_loop.preheader136: |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[P_LOWERBOUND150]], align 4, !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: [[TMP21:%.*]] = sub i32 [[DOTCOUNT135]], 1, !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP21]], ptr [[P_UPPERBOUND151]], align 4, !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[P_STRIDE152]], align 4, !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM153:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB44:[0-9]+]]), !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB43:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM153]], i32 34, ptr [[P_LASTITER149]], ptr [[P_LOWERBOUND150]], ptr [[P_UPPERBOUND151]], ptr [[P_STRIDE152]], i32 1, i32 0), !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: [[TMP22:%.*]] = load i32, ptr [[P_LOWERBOUND150]], align 4, !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: [[TMP23:%.*]] = load i32, ptr [[P_UPPERBOUND151]], align 4, !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: [[TMP24:%.*]] = sub i32 [[TMP23]], [[TMP22]], !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: [[TMP25:%.*]] = add i32 [[TMP24]], 1, !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER137:%.*]], !dbg [[DBG238]] |
| // CHECK-DEBUG: omp_loop.header137: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_IV143:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER136]] ], [ [[OMP_LOOP_NEXT145:%.*]], [[OMP_LOOP_INC140:%.*]] ], !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_COND138:%.*]], !dbg [[DBG238]] |
| // CHECK-DEBUG: omp_loop.cond138: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_CMP144:%.*]] = icmp ult i32 [[OMP_LOOP_IV143]], [[TMP25]], !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: br i1 [[OMP_LOOP_CMP144]], label [[OMP_LOOP_BODY139:%.*]], label [[OMP_LOOP_EXIT141:%.*]], !dbg [[DBG238]] |
| // CHECK-DEBUG: omp_loop.exit141: |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB43]], i32 [[OMP_GLOBAL_THREAD_NUM153]]), !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM154:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB44]]), !dbg [[DBG240:![0-9]+]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_barrier(ptr @[[GLOB45:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM154]]), !dbg [[DBG240]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_AFTER142:%.*]], !dbg [[DBG238]] |
| // CHECK-DEBUG: omp_loop.after142: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION7_PARALLEL_AFTER:%.*]], !dbg [[DBG241:![0-9]+]] |
| // CHECK-DEBUG: omp.par.region7.parallel.after: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_PRE_FINALIZE8:%.*]] |
| // CHECK-DEBUG: omp.par.pre_finalize8: |
| // CHECK-DEBUG-NEXT: br label [[DOTFINI155:%.*]] |
| // CHECK-DEBUG: .fini155: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT9_EXITSTUB:%.*]], !dbg [[DBG241]] |
| // CHECK-DEBUG: omp_loop.body139: |
| // CHECK-DEBUG-NEXT: [[TMP26:%.*]] = add i32 [[OMP_LOOP_IV143]], [[TMP22]], !dbg [[DBG240]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.16(ptr [[I131]], i32 [[TMP26]], ptr [[AGG_CAPTURED133]]), !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: [[TMP27:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4, !dbg [[DBG242:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV146:%.*]] = sitofp i32 [[TMP27]] to double, !dbg [[DBG242]] |
| // CHECK-DEBUG-NEXT: [[TMP28:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8, !dbg [[DBG240]] |
| // CHECK-DEBUG-NEXT: [[ADD147:%.*]] = fadd double [[CONV146]], [[TMP28]], !dbg [[DBG243:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV148:%.*]] = fptrunc double [[ADD147]] to float, !dbg [[DBG242]] |
| // CHECK-DEBUG-NEXT: [[TMP29:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8, !dbg [[DBG244:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store float [[CONV148]], ptr [[TMP29]], align 4, !dbg [[DBG245:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_INC140]], !dbg [[DBG238]] |
| // CHECK-DEBUG: omp_loop.inc140: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_NEXT145]] = add nuw i32 [[OMP_LOOP_IV143]], 1, !dbg [[DBG238]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER137]], !dbg [[DBG238]] |
| // CHECK-DEBUG: omp_loop.body80: |
| // CHECK-DEBUG-NEXT: [[TMP30:%.*]] = add i32 [[OMP_LOOP_IV84]], [[TMP14]], !dbg [[DBG229]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.12(ptr [[I72]], i32 [[TMP30]], ptr [[AGG_CAPTURED74]]), !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: [[TMP31:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4, !dbg [[DBG246:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV87:%.*]] = sitofp i32 [[TMP31]] to double, !dbg [[DBG246]] |
| // CHECK-DEBUG-NEXT: [[TMP32:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8, !dbg [[DBG229]] |
| // CHECK-DEBUG-NEXT: [[ADD88:%.*]] = fadd double [[CONV87]], [[TMP32]], !dbg [[DBG247:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV89:%.*]] = fptrunc double [[ADD88]] to float, !dbg [[DBG246]] |
| // CHECK-DEBUG-NEXT: [[TMP33:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8, !dbg [[DBG248:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store float [[CONV89]], ptr [[TMP33]], align 4, !dbg [[DBG249:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_INC81]], !dbg [[DBG227]] |
| // CHECK-DEBUG: omp_loop.inc81: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_NEXT86]] = add nuw i32 [[OMP_LOOP_IV84]], 1, !dbg [[DBG227]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER78]], !dbg [[DBG227]] |
| // CHECK-DEBUG: omp_loop.body22: |
| // CHECK-DEBUG-NEXT: [[TMP34:%.*]] = add i32 [[OMP_LOOP_IV26]], [[TMP6]], !dbg [[DBG218]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.8(ptr [[I14]], i32 [[TMP34]], ptr [[AGG_CAPTURED16]]), !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: [[TMP35:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4, !dbg [[DBG250:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV29:%.*]] = sitofp i32 [[TMP35]] to double, !dbg [[DBG250]] |
| // CHECK-DEBUG-NEXT: [[TMP36:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8, !dbg [[DBG218]] |
| // CHECK-DEBUG-NEXT: [[ADD30:%.*]] = fadd double [[CONV29]], [[TMP36]], !dbg [[DBG251:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV31:%.*]] = fptrunc double [[ADD30]] to float, !dbg [[DBG250]] |
| // CHECK-DEBUG-NEXT: [[TMP37:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8, !dbg [[DBG252:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store float [[CONV31]], ptr [[TMP37]], align 4, !dbg [[DBG253:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_INC23]], !dbg [[DBG216]] |
| // CHECK-DEBUG: omp_loop.inc23: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_NEXT28]] = add nuw i32 [[OMP_LOOP_IV26]], 1, !dbg [[DBG216]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER20]], !dbg [[DBG216]] |
| // CHECK-DEBUG: omp.par.exit9.exitStub: |
| // CHECK-DEBUG-NEXT: ret void |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@_Z14parallel_for_2Pfid..omp_par.21 |
| // CHECK-DEBUG-SAME: (ptr noalias [[TID_ADDR96:%.*]], ptr noalias [[ZERO_ADDR97:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1]] !dbg [[DBG254:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: omp.par.entry98: |
| // CHECK-DEBUG-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8, !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_B_ADDR:%.*]] = load ptr, ptr [[GEP_B_ADDR]], align 8, !align [[META87]] |
| // CHECK-DEBUG-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_R_ADDR:%.*]] = load ptr, ptr [[GEP_R_ADDR]], align 8, !align [[META87]] |
| // CHECK-DEBUG-NEXT: [[P_LASTITER124:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LOWERBOUND125:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_UPPERBOUND126:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_STRIDE127:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TID_ADDR_LOCAL102:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR96]], align 4 |
| // CHECK-DEBUG-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL102]], align 4 |
| // CHECK-DEBUG-NEXT: [[TID103:%.*]] = load i32, ptr [[TID_ADDR_LOCAL102]], align 4 |
| // CHECK-DEBUG-NEXT: [[I106:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED107:%.*]] = alloca [[STRUCT_ANON_11:%.*]], align 8 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED108:%.*]] = alloca [[STRUCT_ANON_12:%.*]], align 4 |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT_ADDR109:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_A_ADDR]], [[META255:![0-9]+]], !DIExpression(), [[META256:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_B_ADDR]], [[META257:![0-9]+]], !DIExpression(), [[META258:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_R_ADDR]], [[META259:![0-9]+]], !DIExpression(), [[META260:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION99:%.*]] |
| // CHECK-DEBUG: omp.par.region99: |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[I106]], [[META261:![0-9]+]], !DIExpression(), [[META267:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[I106]], align 4, !dbg [[META267]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_11]], ptr [[AGG_CAPTURED107]], i32 0, i32 0, !dbg [[DBG268:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store ptr [[I106]], ptr [[TMP2]], align 8, !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_12]], ptr [[AGG_CAPTURED108]], i32 0, i32 0, !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[I106]], align 4, !dbg [[DBG269:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP4]], ptr [[TMP3]], align 4, !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.13(ptr [[DOTCOUNT_ADDR109]], ptr [[AGG_CAPTURED107]]), !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT110:%.*]] = load i32, ptr [[DOTCOUNT_ADDR109]], align 4, !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_PREHEADER111:%.*]], !dbg [[DBG268]] |
| // CHECK-DEBUG: omp_loop.preheader111: |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[P_LOWERBOUND125]], align 4, !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = sub i32 [[DOTCOUNT110]], 1, !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP5]], ptr [[P_UPPERBOUND126]], align 4, !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[P_STRIDE127]], align 4, !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM128:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB40:[0-9]+]]), !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB39:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM128]], i32 34, ptr [[P_LASTITER124]], ptr [[P_LOWERBOUND125]], ptr [[P_UPPERBOUND126]], ptr [[P_STRIDE127]], i32 1, i32 0), !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[P_LOWERBOUND125]], align 4, !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[P_UPPERBOUND126]], align 4, !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = sub i32 [[TMP7]], [[TMP6]], !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = add i32 [[TMP8]], 1, !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER112:%.*]], !dbg [[DBG268]] |
| // CHECK-DEBUG: omp_loop.header112: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_IV118:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER111]] ], [ [[OMP_LOOP_NEXT120:%.*]], [[OMP_LOOP_INC115:%.*]] ], !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_COND113:%.*]], !dbg [[DBG268]] |
| // CHECK-DEBUG: omp_loop.cond113: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_CMP119:%.*]] = icmp ult i32 [[OMP_LOOP_IV118]], [[TMP9]], !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: br i1 [[OMP_LOOP_CMP119]], label [[OMP_LOOP_BODY114:%.*]], label [[OMP_LOOP_EXIT116:%.*]], !dbg [[DBG268]] |
| // CHECK-DEBUG: omp_loop.exit116: |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB39]], i32 [[OMP_GLOBAL_THREAD_NUM128]]), !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM129:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB40]]), !dbg [[DBG270:![0-9]+]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_barrier(ptr @[[GLOB41:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM129]]), !dbg [[DBG270]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_AFTER117:%.*]], !dbg [[DBG268]] |
| // CHECK-DEBUG: omp_loop.after117: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION99_PARALLEL_AFTER:%.*]], !dbg [[DBG271:![0-9]+]] |
| // CHECK-DEBUG: omp.par.region99.parallel.after: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_PRE_FINALIZE100:%.*]] |
| // CHECK-DEBUG: omp.par.pre_finalize100: |
| // CHECK-DEBUG-NEXT: br label [[DOTFINI130:%.*]] |
| // CHECK-DEBUG: .fini130: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT101_EXITSTUB:%.*]], !dbg [[DBG271]] |
| // CHECK-DEBUG: omp_loop.body114: |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = add i32 [[OMP_LOOP_IV118]], [[TMP6]], !dbg [[DBG270]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.14(ptr [[I106]], i32 [[TMP10]], ptr [[AGG_CAPTURED108]]), !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: [[TMP11:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4, !dbg [[DBG272:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV121:%.*]] = sitofp i32 [[TMP11]] to double, !dbg [[DBG272]] |
| // CHECK-DEBUG-NEXT: [[TMP12:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8, !dbg [[DBG270]] |
| // CHECK-DEBUG-NEXT: [[ADD122:%.*]] = fadd double [[CONV121]], [[TMP12]], !dbg [[DBG273:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV123:%.*]] = fptrunc double [[ADD122]] to float, !dbg [[DBG272]] |
| // CHECK-DEBUG-NEXT: [[TMP13:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8, !dbg [[DBG274:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store float [[CONV123]], ptr [[TMP13]], align 4, !dbg [[DBG275:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_INC115]], !dbg [[DBG268]] |
| // CHECK-DEBUG: omp_loop.inc115: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_NEXT120]] = add nuw i32 [[OMP_LOOP_IV118]], 1, !dbg [[DBG268]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER112]], !dbg [[DBG268]] |
| // CHECK-DEBUG: omp.par.exit101.exitStub: |
| // CHECK-DEBUG-NEXT: ret void |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@_Z14parallel_for_2Pfid..omp_par |
| // CHECK-DEBUG-SAME: (ptr noalias [[TID_ADDR38:%.*]], ptr noalias [[ZERO_ADDR39:%.*]], ptr [[TMP0:%.*]]) #[[ATTR1]] !dbg [[DBG276:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: omp.par.entry40: |
| // CHECK-DEBUG-NEXT: [[GEP_A_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 0 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_A_ADDR:%.*]] = load ptr, ptr [[GEP_A_ADDR]], align 8, !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[GEP_B_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 1 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_B_ADDR:%.*]] = load ptr, ptr [[GEP_B_ADDR]], align 8, !align [[META87]] |
| // CHECK-DEBUG-NEXT: [[GEP_R_ADDR:%.*]] = getelementptr { ptr, ptr, ptr }, ptr [[TMP0]], i32 0, i32 2 |
| // CHECK-DEBUG-NEXT: [[LOADGEP_R_ADDR:%.*]] = load ptr, ptr [[GEP_R_ADDR]], align 8, !align [[META87]] |
| // CHECK-DEBUG-NEXT: [[P_LASTITER66:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_LOWERBOUND67:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_UPPERBOUND68:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[P_STRIDE69:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TID_ADDR_LOCAL44:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR38]], align 4 |
| // CHECK-DEBUG-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL44]], align 4 |
| // CHECK-DEBUG-NEXT: [[TID45:%.*]] = load i32, ptr [[TID_ADDR_LOCAL44]], align 4 |
| // CHECK-DEBUG-NEXT: [[I48:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED49:%.*]] = alloca [[STRUCT_ANON_7:%.*]], align 8 |
| // CHECK-DEBUG-NEXT: [[AGG_CAPTURED50:%.*]] = alloca [[STRUCT_ANON_8:%.*]], align 4 |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT_ADDR51:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_A_ADDR]], [[META277:![0-9]+]], !DIExpression(), [[META278:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_B_ADDR]], [[META279:![0-9]+]], !DIExpression(), [[META280:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOADGEP_R_ADDR]], [[META281:![0-9]+]], !DIExpression(), [[META282:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION41:%.*]] |
| // CHECK-DEBUG: omp.par.region41: |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[I48]], [[META283:![0-9]+]], !DIExpression(), [[META289:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[I48]], align 4, !dbg [[META289]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_7]], ptr [[AGG_CAPTURED49]], i32 0, i32 0, !dbg [[DBG290:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store ptr [[I48]], ptr [[TMP2]], align 8, !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_8]], ptr [[AGG_CAPTURED50]], i32 0, i32 0, !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[I48]], align 4, !dbg [[DBG291:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP4]], ptr [[TMP3]], align 4, !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.9(ptr [[DOTCOUNT_ADDR51]], ptr [[AGG_CAPTURED49]]), !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: [[DOTCOUNT52:%.*]] = load i32, ptr [[DOTCOUNT_ADDR51]], align 4, !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_PREHEADER53:%.*]], !dbg [[DBG290]] |
| // CHECK-DEBUG: omp_loop.preheader53: |
| // CHECK-DEBUG-NEXT: store i32 0, ptr [[P_LOWERBOUND67]], align 4, !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = sub i32 [[DOTCOUNT52]], 1, !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP5]], ptr [[P_UPPERBOUND68]], align 4, !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[P_STRIDE69]], align 4, !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM70:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB30:[0-9]+]]), !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_init_4u(ptr @[[GLOB29:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM70]], i32 34, ptr [[P_LASTITER66]], ptr [[P_LOWERBOUND67]], ptr [[P_UPPERBOUND68]], ptr [[P_STRIDE69]], i32 1, i32 0), !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[P_LOWERBOUND67]], align 4, !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[P_UPPERBOUND68]], align 4, !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = sub i32 [[TMP7]], [[TMP6]], !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = add i32 [[TMP8]], 1, !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER54:%.*]], !dbg [[DBG290]] |
| // CHECK-DEBUG: omp_loop.header54: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_IV60:%.*]] = phi i32 [ 0, [[OMP_LOOP_PREHEADER53]] ], [ [[OMP_LOOP_NEXT62:%.*]], [[OMP_LOOP_INC57:%.*]] ], !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_COND55:%.*]], !dbg [[DBG290]] |
| // CHECK-DEBUG: omp_loop.cond55: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_CMP61:%.*]] = icmp ult i32 [[OMP_LOOP_IV60]], [[TMP9]], !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: br i1 [[OMP_LOOP_CMP61]], label [[OMP_LOOP_BODY56:%.*]], label [[OMP_LOOP_EXIT58:%.*]], !dbg [[DBG290]] |
| // CHECK-DEBUG: omp_loop.exit58: |
| // CHECK-DEBUG-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB29]], i32 [[OMP_GLOBAL_THREAD_NUM70]]), !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: [[OMP_GLOBAL_THREAD_NUM71:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB30]]), !dbg [[DBG292:![0-9]+]] |
| // CHECK-DEBUG-NEXT: call void @__kmpc_barrier(ptr @[[GLOB31:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM71]]), !dbg [[DBG292]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_AFTER59:%.*]], !dbg [[DBG290]] |
| // CHECK-DEBUG: omp_loop.after59: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_REGION41_PARALLEL_AFTER:%.*]], !dbg [[DBG293:![0-9]+]] |
| // CHECK-DEBUG: omp.par.region41.parallel.after: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_PRE_FINALIZE42:%.*]] |
| // CHECK-DEBUG: omp.par.pre_finalize42: |
| // CHECK-DEBUG-NEXT: br label [[DOTFINI:%.*]] |
| // CHECK-DEBUG: .fini: |
| // CHECK-DEBUG-NEXT: br label [[OMP_PAR_EXIT43_EXITSTUB:%.*]], !dbg [[DBG293]] |
| // CHECK-DEBUG: omp_loop.body56: |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = add i32 [[OMP_LOOP_IV60]], [[TMP6]], !dbg [[DBG292]] |
| // CHECK-DEBUG-NEXT: call void @__captured_stmt.10(ptr [[I48]], i32 [[TMP10]], ptr [[AGG_CAPTURED50]]), !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: [[TMP11:%.*]] = load i32, ptr [[LOADGEP_A_ADDR]], align 4, !dbg [[DBG294:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV63:%.*]] = sitofp i32 [[TMP11]] to double, !dbg [[DBG294]] |
| // CHECK-DEBUG-NEXT: [[TMP12:%.*]] = load double, ptr [[LOADGEP_B_ADDR]], align 8, !dbg [[DBG292]] |
| // CHECK-DEBUG-NEXT: [[ADD64:%.*]] = fadd double [[CONV63]], [[TMP12]], !dbg [[DBG295:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[CONV65:%.*]] = fptrunc double [[ADD64]] to float, !dbg [[DBG294]] |
| // CHECK-DEBUG-NEXT: [[TMP13:%.*]] = load ptr, ptr [[LOADGEP_R_ADDR]], align 8, !dbg [[DBG296:![0-9]+]] |
| // CHECK-DEBUG-NEXT: store float [[CONV65]], ptr [[TMP13]], align 4, !dbg [[DBG297:![0-9]+]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_INC57]], !dbg [[DBG290]] |
| // CHECK-DEBUG: omp_loop.inc57: |
| // CHECK-DEBUG-NEXT: [[OMP_LOOP_NEXT62]] = add nuw i32 [[OMP_LOOP_IV60]], 1, !dbg [[DBG290]] |
| // CHECK-DEBUG-NEXT: br label [[OMP_LOOP_HEADER54]], !dbg [[DBG290]] |
| // CHECK-DEBUG: omp.par.exit43.exitStub: |
| // CHECK-DEBUG-NEXT: ret void |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.5 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG298:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DISTANCE_ADDR]], [[META299:![0-9]+]], !DIExpression(), [[META300:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META301:![0-9]+]], !DIExpression(), [[META300]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTART]], [[META302:![0-9]+]], !DIExpression(), [[META304:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_3:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG305:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG305]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG305]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4, !dbg [[META304]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTOP]], [[META307:![0-9]+]], !DIExpression(), [[META308:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 100, ptr [[DOTSTOP]], align 4, !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTEP]], [[META309:![0-9]+]], !DIExpression(), [[META308]]) |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[DOTSTEP]], align 4, !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]], !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]], !dbg [[META308]] |
| // CHECK-DEBUG: cond.true: |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]], !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1, !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]], !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]], !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: br label [[COND_END:%.*]], !dbg [[META308]] |
| // CHECK-DEBUG: cond.false: |
| // CHECK-DEBUG-NEXT: br label [[COND_END]], !dbg [[META308]] |
| // CHECK-DEBUG: cond.end: |
| // CHECK-DEBUG-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ], !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !dbg [[META308]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4, !dbg [[META308]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG310:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.6 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG312:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOOPVAR_ADDR]], [[META313:![0-9]+]], !DIExpression(), [[META314:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOGICAL_ADDR]], [[META315:![0-9]+]], !DIExpression(), [[META314]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META316:![0-9]+]], !DIExpression(), [[META314]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_4:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG317:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG317]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4, !dbg [[DBG319:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]], !dbg [[DBG319]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]], !dbg [[DBG319]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !dbg [[DBG319]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4, !dbg [[META314]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG317]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.7 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG320:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DISTANCE_ADDR]], [[META321:![0-9]+]], !DIExpression(), [[META322:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META323:![0-9]+]], !DIExpression(), [[META322]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTART]], [[META324:![0-9]+]], !DIExpression(), [[META326:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_5:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG327:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG327]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG327]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4, !dbg [[META326]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTOP]], [[META329:![0-9]+]], !DIExpression(), [[META330:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 100, ptr [[DOTSTOP]], align 4, !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTEP]], [[META331:![0-9]+]], !DIExpression(), [[META330]]) |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[DOTSTEP]], align 4, !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]], !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]], !dbg [[META330]] |
| // CHECK-DEBUG: cond.true: |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]], !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1, !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]], !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]], !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: br label [[COND_END:%.*]], !dbg [[META330]] |
| // CHECK-DEBUG: cond.false: |
| // CHECK-DEBUG-NEXT: br label [[COND_END]], !dbg [[META330]] |
| // CHECK-DEBUG: cond.end: |
| // CHECK-DEBUG-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ], !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !dbg [[META330]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4, !dbg [[META330]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG332:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.8 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG334:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOOPVAR_ADDR]], [[META335:![0-9]+]], !DIExpression(), [[META336:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOGICAL_ADDR]], [[META337:![0-9]+]], !DIExpression(), [[META336]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META338:![0-9]+]], !DIExpression(), [[META336]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_6:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG339:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG339]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4, !dbg [[DBG341:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]], !dbg [[DBG341]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]], !dbg [[DBG341]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !dbg [[DBG341]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4, !dbg [[META336]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG339]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.9 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG342:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DISTANCE_ADDR]], [[META343:![0-9]+]], !DIExpression(), [[META344:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META345:![0-9]+]], !DIExpression(), [[META344]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTART]], [[META346:![0-9]+]], !DIExpression(), [[META348:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_7:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG349:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG349]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG349]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4, !dbg [[META348]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTOP]], [[META351:![0-9]+]], !DIExpression(), [[META352:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 100, ptr [[DOTSTOP]], align 4, !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTEP]], [[META353:![0-9]+]], !DIExpression(), [[META352]]) |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[DOTSTEP]], align 4, !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]], !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]], !dbg [[META352]] |
| // CHECK-DEBUG: cond.true: |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]], !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1, !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]], !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]], !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: br label [[COND_END:%.*]], !dbg [[META352]] |
| // CHECK-DEBUG: cond.false: |
| // CHECK-DEBUG-NEXT: br label [[COND_END]], !dbg [[META352]] |
| // CHECK-DEBUG: cond.end: |
| // CHECK-DEBUG-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ], !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !dbg [[META352]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4, !dbg [[META352]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG354:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.10 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG356:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOOPVAR_ADDR]], [[META357:![0-9]+]], !DIExpression(), [[META358:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOGICAL_ADDR]], [[META359:![0-9]+]], !DIExpression(), [[META358]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META360:![0-9]+]], !DIExpression(), [[META358]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_8:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG361:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG361]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4, !dbg [[DBG363:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]], !dbg [[DBG363]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]], !dbg [[DBG363]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !dbg [[DBG363]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4, !dbg [[META358]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG361]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.11 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG364:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DISTANCE_ADDR]], [[META365:![0-9]+]], !DIExpression(), [[META366:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META367:![0-9]+]], !DIExpression(), [[META366]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTART]], [[META368:![0-9]+]], !DIExpression(), [[META370:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_9:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG371:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG371]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG371]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4, !dbg [[META370]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTOP]], [[META373:![0-9]+]], !DIExpression(), [[META374:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 100, ptr [[DOTSTOP]], align 4, !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTEP]], [[META375:![0-9]+]], !DIExpression(), [[META374]]) |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[DOTSTEP]], align 4, !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]], !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]], !dbg [[META374]] |
| // CHECK-DEBUG: cond.true: |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]], !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1, !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]], !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]], !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: br label [[COND_END:%.*]], !dbg [[META374]] |
| // CHECK-DEBUG: cond.false: |
| // CHECK-DEBUG-NEXT: br label [[COND_END]], !dbg [[META374]] |
| // CHECK-DEBUG: cond.end: |
| // CHECK-DEBUG-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ], !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !dbg [[META374]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4, !dbg [[META374]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG376:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.12 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG378:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOOPVAR_ADDR]], [[META379:![0-9]+]], !DIExpression(), [[META380:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOGICAL_ADDR]], [[META381:![0-9]+]], !DIExpression(), [[META380]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META382:![0-9]+]], !DIExpression(), [[META380]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_10:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG383:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG383]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4, !dbg [[DBG385:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]], !dbg [[DBG385]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]], !dbg [[DBG385]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !dbg [[DBG385]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4, !dbg [[META380]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG383]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.13 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG386:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DISTANCE_ADDR]], [[META387:![0-9]+]], !DIExpression(), [[META388:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META389:![0-9]+]], !DIExpression(), [[META388]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTART]], [[META390:![0-9]+]], !DIExpression(), [[META392:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_11:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG393:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG393]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG393]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4, !dbg [[META392]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTOP]], [[META395:![0-9]+]], !DIExpression(), [[META396:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 100, ptr [[DOTSTOP]], align 4, !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTEP]], [[META397:![0-9]+]], !DIExpression(), [[META396]]) |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[DOTSTEP]], align 4, !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]], !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]], !dbg [[META396]] |
| // CHECK-DEBUG: cond.true: |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]], !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1, !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]], !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]], !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: br label [[COND_END:%.*]], !dbg [[META396]] |
| // CHECK-DEBUG: cond.false: |
| // CHECK-DEBUG-NEXT: br label [[COND_END]], !dbg [[META396]] |
| // CHECK-DEBUG: cond.end: |
| // CHECK-DEBUG-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ], !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !dbg [[META396]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4, !dbg [[META396]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG398:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.14 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG400:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOOPVAR_ADDR]], [[META401:![0-9]+]], !DIExpression(), [[META402:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOGICAL_ADDR]], [[META403:![0-9]+]], !DIExpression(), [[META402]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META404:![0-9]+]], !DIExpression(), [[META402]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_12:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG405:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG405]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4, !dbg [[DBG407:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]], !dbg [[DBG407]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]], !dbg [[DBG407]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !dbg [[DBG407]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4, !dbg [[META402]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG405]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.15 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG408:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DISTANCE_ADDR]], [[META409:![0-9]+]], !DIExpression(), [[META410:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META411:![0-9]+]], !DIExpression(), [[META410]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTART]], [[META412:![0-9]+]], !DIExpression(), [[META414:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_13:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG415:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG415]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG415]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4, !dbg [[META414]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTOP]], [[META417:![0-9]+]], !DIExpression(), [[META418:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 100, ptr [[DOTSTOP]], align 4, !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTEP]], [[META419:![0-9]+]], !DIExpression(), [[META418]]) |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[DOTSTEP]], align 4, !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]], !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]], !dbg [[META418]] |
| // CHECK-DEBUG: cond.true: |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]], !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1, !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]], !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]], !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: br label [[COND_END:%.*]], !dbg [[META418]] |
| // CHECK-DEBUG: cond.false: |
| // CHECK-DEBUG-NEXT: br label [[COND_END]], !dbg [[META418]] |
| // CHECK-DEBUG: cond.end: |
| // CHECK-DEBUG-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ], !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !dbg [[META418]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4, !dbg [[META418]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG420:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.16 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG422:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOOPVAR_ADDR]], [[META423:![0-9]+]], !DIExpression(), [[META424:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOGICAL_ADDR]], [[META425:![0-9]+]], !DIExpression(), [[META424]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META426:![0-9]+]], !DIExpression(), [[META424]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_14:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG427:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG427]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4, !dbg [[DBG429:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]], !dbg [[DBG429]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]], !dbg [[DBG429]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !dbg [[DBG429]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4, !dbg [[META424]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG427]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.17 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG430:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DISTANCE_ADDR]], [[META431:![0-9]+]], !DIExpression(), [[META432:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META433:![0-9]+]], !DIExpression(), [[META432]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTART]], [[META434:![0-9]+]], !DIExpression(), [[META436:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_15:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG437:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG437]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG437]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4, !dbg [[META436]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTOP]], [[META439:![0-9]+]], !DIExpression(), [[META440:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 100, ptr [[DOTSTOP]], align 4, !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTEP]], [[META441:![0-9]+]], !DIExpression(), [[META440]]) |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[DOTSTEP]], align 4, !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]], !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]], !dbg [[META440]] |
| // CHECK-DEBUG: cond.true: |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]], !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1, !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]], !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]], !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: br label [[COND_END:%.*]], !dbg [[META440]] |
| // CHECK-DEBUG: cond.false: |
| // CHECK-DEBUG-NEXT: br label [[COND_END]], !dbg [[META440]] |
| // CHECK-DEBUG: cond.end: |
| // CHECK-DEBUG-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ], !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !dbg [[META440]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4, !dbg [[META440]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG442:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.18 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG444:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOOPVAR_ADDR]], [[META445:![0-9]+]], !DIExpression(), [[META446:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOGICAL_ADDR]], [[META447:![0-9]+]], !DIExpression(), [[META446]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META448:![0-9]+]], !DIExpression(), [[META446]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_16:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG449:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG449]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4, !dbg [[DBG451:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]], !dbg [[DBG451]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]], !dbg [[DBG451]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !dbg [[DBG451]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4, !dbg [[META446]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG449]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.19 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[DISTANCE:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG452:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[DISTANCE_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[DOTSTART:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTOP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[DOTSTEP:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: store ptr [[DISTANCE]], ptr [[DISTANCE_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DISTANCE_ADDR]], [[META453:![0-9]+]], !DIExpression(), [[META454:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META455:![0-9]+]], !DIExpression(), [[META454]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTART]], [[META456:![0-9]+]], !DIExpression(), [[META458:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_17:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG459:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load ptr, ptr [[TMP1]], align 8, !dbg [[DBG459]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4, !dbg [[DBG459]] |
| // CHECK-DEBUG-NEXT: store i32 [[TMP3]], ptr [[DOTSTART]], align 4, !dbg [[META458]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTOP]], [[META461:![0-9]+]], !DIExpression(), [[META462:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 100, ptr [[DOTSTOP]], align 4, !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[DOTSTEP]], [[META463:![0-9]+]], !DIExpression(), [[META462]]) |
| // CHECK-DEBUG-NEXT: store i32 1, ptr [[DOTSTEP]], align 4, !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP4]], [[TMP5]], !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]], !dbg [[META462]] |
| // CHECK-DEBUG: cond.true: |
| // CHECK-DEBUG-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTSTOP]], align 4, !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTSTART]], align 4, !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP6]], [[TMP7]], !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: [[TMP8:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: [[SUB1:%.*]] = sub i32 [[TMP8]], 1, !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[SUB]], [[SUB1]], !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTSTEP]], align 4, !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: [[DIV:%.*]] = udiv i32 [[ADD]], [[TMP9]], !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: br label [[COND_END:%.*]], !dbg [[META462]] |
| // CHECK-DEBUG: cond.false: |
| // CHECK-DEBUG-NEXT: br label [[COND_END]], !dbg [[META462]] |
| // CHECK-DEBUG: cond.end: |
| // CHECK-DEBUG-NEXT: [[COND:%.*]] = phi i32 [ [[DIV]], [[COND_TRUE]] ], [ 0, [[COND_FALSE]] ], !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: [[TMP10:%.*]] = load ptr, ptr [[DISTANCE_ADDR]], align 8, !dbg [[META462]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[COND]], ptr [[TMP10]], align 4, !dbg [[META462]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG464:![0-9]+]] |
| // |
| // |
| // CHECK-DEBUG-LABEL: define {{[^@]+}}@__captured_stmt.20 |
| // CHECK-DEBUG-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[LOOPVAR:%.*]], i32 noundef [[LOGICAL:%.*]], ptr noalias noundef [[__CONTEXT:%.*]]) #[[ATTR2]] !dbg [[DBG466:![0-9]+]] { |
| // CHECK-DEBUG-NEXT: entry: |
| // CHECK-DEBUG-NEXT: [[LOOPVAR_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: [[LOGICAL_ADDR:%.*]] = alloca i32, align 4 |
| // CHECK-DEBUG-NEXT: [[__CONTEXT_ADDR:%.*]] = alloca ptr, align 8 |
| // CHECK-DEBUG-NEXT: store ptr [[LOOPVAR]], ptr [[LOOPVAR_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOOPVAR_ADDR]], [[META467:![0-9]+]], !DIExpression(), [[META468:![0-9]+]]) |
| // CHECK-DEBUG-NEXT: store i32 [[LOGICAL]], ptr [[LOGICAL_ADDR]], align 4 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[LOGICAL_ADDR]], [[META469:![0-9]+]], !DIExpression(), [[META468]]) |
| // CHECK-DEBUG-NEXT: store ptr [[__CONTEXT]], ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: #dbg_declare(ptr [[__CONTEXT_ADDR]], [[META470:![0-9]+]], !DIExpression(), [[META468]]) |
| // CHECK-DEBUG-NEXT: [[TMP0:%.*]] = load ptr, ptr [[__CONTEXT_ADDR]], align 8 |
| // CHECK-DEBUG-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON_18:%.*]], ptr [[TMP0]], i32 0, i32 0, !dbg [[DBG471:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG471]] |
| // CHECK-DEBUG-NEXT: [[TMP3:%.*]] = load i32, ptr [[LOGICAL_ADDR]], align 4, !dbg [[DBG473:![0-9]+]] |
| // CHECK-DEBUG-NEXT: [[MUL:%.*]] = mul i32 1, [[TMP3]], !dbg [[DBG473]] |
| // CHECK-DEBUG-NEXT: [[ADD:%.*]] = add i32 [[TMP2]], [[MUL]], !dbg [[DBG473]] |
| // CHECK-DEBUG-NEXT: [[TMP4:%.*]] = load ptr, ptr [[LOOPVAR_ADDR]], align 8, !dbg [[DBG473]], !nonnull [[META11]], !align [[META45]] |
| // CHECK-DEBUG-NEXT: store i32 [[ADD]], ptr [[TMP4]], align 4, !dbg [[META468]] |
| // CHECK-DEBUG-NEXT: ret void, !dbg [[DBG471]] |
| // |