1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _ 2 // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK1 3 // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s 4 // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK2 5 6 // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp-simd -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}" 7 // RUN: %clang_cc1 -no-opaque-pointers -fopenmp-simd -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s 8 // RUN: %clang_cc1 -no-opaque-pointers -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}" 9 // expected-no-diagnostics 10 #ifndef HEADER 11 #define HEADER 12 13 int main (int argc, char **argv) { 14 #pragma omp parallel 15 { 16 #pragma omp cancellation point parallel 17 #pragma omp cancel parallel 18 argv[0][0] = argc; 19 } 20 #pragma omp sections 21 { 22 { 23 #pragma omp cancellation point sections 24 #pragma omp cancel sections 25 } 26 } 27 #pragma omp sections 28 { 29 #pragma omp cancellation point sections 30 #pragma omp section 31 { 32 #pragma omp cancellation point sections 33 #pragma omp cancel sections 34 } 35 } 36 #pragma omp for 37 for (int i = 0; i < argc; ++i) { 38 #pragma omp cancellation point for 39 #pragma omp cancel for 40 } 41 #pragma omp task 42 { 43 #pragma omp cancellation point taskgroup 44 #pragma omp cancel taskgroup 45 } 46 #pragma omp task 47 { 48 #pragma omp cancellation point taskgroup 49 } 50 #pragma omp parallel sections 51 { 52 { 53 #pragma omp cancellation point sections 54 #pragma omp cancel sections 55 } 56 } 57 #pragma omp parallel sections 58 { 59 { 60 #pragma omp cancellation point sections 61 #pragma omp cancel sections 62 } 63 #pragma omp section 64 { 65 #pragma omp cancellation point sections 66 } 67 } 68 #pragma omp parallel for 69 for (int i = 0; i < argc; ++i) { 70 #pragma omp cancellation point for 71 #pragma omp cancel for 72 } 73 return argc; 74 } 75 76 77 78 79 80 81 82 #endif 83 // CHECK1-LABEL: define {{[^@]+}}@main 84 // CHECK1-SAME: (i32 noundef [[ARGC:%.*]], i8** noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] { 85 // CHECK1-NEXT: entry: 86 // CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 87 // CHECK1-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4 88 // CHECK1-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8 89 // CHECK1-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4 90 // CHECK1-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4 91 // CHECK1-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4 92 // CHECK1-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4 93 // CHECK1-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4 94 // CHECK1-NEXT: [[DOTOMP_SECTIONS_LB_3:%.*]] = alloca i32, align 4 95 // CHECK1-NEXT: [[DOTOMP_SECTIONS_UB_4:%.*]] = alloca i32, align 4 96 // CHECK1-NEXT: [[DOTOMP_SECTIONS_ST_5:%.*]] = alloca i32, align 4 97 // CHECK1-NEXT: [[DOTOMP_SECTIONS_IL_6:%.*]] = alloca i32, align 4 98 // CHECK1-NEXT: [[DOTOMP_SECTIONS_IV_7:%.*]] = alloca i32, align 4 99 // CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 100 // CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4 101 // CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 102 // CHECK1-NEXT: [[DOTCAPTURE_EXPR_25:%.*]] = alloca i32, align 4 103 // CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4 104 // CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 105 // CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 106 // CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 107 // CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 108 // CHECK1-NEXT: [[I28:%.*]] = alloca i32, align 4 109 // CHECK1-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1 110 // CHECK1-NEXT: [[AGG_CAPTURED42:%.*]] = alloca [[STRUCT_ANON_0:%.*]], align 1 111 // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]]) 112 // CHECK1-NEXT: store i32 0, i32* [[RETVAL]], align 4 113 // CHECK1-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4 114 // CHECK1-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8 115 // CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i8***, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i8*** [[ARGV_ADDR]], i32* [[ARGC_ADDR]]) 116 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4 117 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4 118 // CHECK1-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4 119 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4 120 // CHECK1-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1) 121 // CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4 122 // CHECK1-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0 123 // CHECK1-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i32 [[TMP1]], i32 0 124 // CHECK1-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_UB_]], align 4 125 // CHECK1-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4 126 // CHECK1-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_IV_]], align 4 127 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 128 // CHECK1: omp.inner.for.cond: 129 // CHECK1-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 130 // CHECK1-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4 131 // CHECK1-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]] 132 // CHECK1-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 133 // CHECK1: omp.inner.for.body: 134 // CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 135 // CHECK1-NEXT: switch i32 [[TMP7]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [ 136 // CHECK1-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]] 137 // CHECK1-NEXT: ] 138 // CHECK1: .omp.sections.case: 139 // CHECK1-NEXT: [[TMP8:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3) 140 // CHECK1-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 0 141 // CHECK1-NEXT: br i1 [[TMP9]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]] 142 // CHECK1: .cancel.exit: 143 // CHECK1-NEXT: br label [[CANCEL_EXIT:%.*]] 144 // CHECK1: .cancel.continue: 145 // CHECK1-NEXT: [[TMP10:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3) 146 // CHECK1-NEXT: [[TMP11:%.*]] = icmp ne i32 [[TMP10]], 0 147 // CHECK1-NEXT: br i1 [[TMP11]], label [[DOTCANCEL_EXIT1:%.*]], label [[DOTCANCEL_CONTINUE2:%.*]] 148 // CHECK1: .cancel.exit1: 149 // CHECK1-NEXT: br label [[CANCEL_EXIT]] 150 // CHECK1: .cancel.continue2: 151 // CHECK1-NEXT: br label [[DOTOMP_SECTIONS_EXIT]] 152 // CHECK1: .omp.sections.exit: 153 // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 154 // CHECK1: omp.inner.for.inc: 155 // CHECK1-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 156 // CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP12]], 1 157 // CHECK1-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4 158 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]] 159 // CHECK1: omp.inner.for.end: 160 // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]]) 161 // CHECK1-NEXT: br label [[CANCEL_CONT:%.*]] 162 // CHECK1: cancel.cont: 163 // CHECK1-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB4:[0-9]+]], i32 [[TMP0]]) 164 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_3]], align 4 165 // CHECK1-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_4]], align 4 166 // CHECK1-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_5]], align 4 167 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_6]], align 4 168 // CHECK1-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_SECTIONS_IL_6]], i32* [[DOTOMP_SECTIONS_LB_3]], i32* [[DOTOMP_SECTIONS_UB_4]], i32* [[DOTOMP_SECTIONS_ST_5]], i32 1, i32 1) 169 // CHECK1-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_4]], align 4 170 // CHECK1-NEXT: [[TMP14:%.*]] = icmp slt i32 [[TMP13]], 1 171 // CHECK1-NEXT: [[TMP15:%.*]] = select i1 [[TMP14]], i32 [[TMP13]], i32 1 172 // CHECK1-NEXT: store i32 [[TMP15]], i32* [[DOTOMP_SECTIONS_UB_4]], align 4 173 // CHECK1-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_3]], align 4 174 // CHECK1-NEXT: store i32 [[TMP16]], i32* [[DOTOMP_SECTIONS_IV_7]], align 4 175 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND8:%.*]] 176 // CHECK1: omp.inner.for.cond8: 177 // CHECK1-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_7]], align 4 178 // CHECK1-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_4]], align 4 179 // CHECK1-NEXT: [[CMP9:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]] 180 // CHECK1-NEXT: br i1 [[CMP9]], label [[OMP_INNER_FOR_BODY10:%.*]], label [[OMP_INNER_FOR_END22:%.*]] 181 // CHECK1: omp.inner.for.body10: 182 // CHECK1-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_7]], align 4 183 // CHECK1-NEXT: switch i32 [[TMP19]], label [[DOTOMP_SECTIONS_EXIT19:%.*]] [ 184 // CHECK1-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE11:%.*]] 185 // CHECK1-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE14:%.*]] 186 // CHECK1-NEXT: ] 187 // CHECK1: .omp.sections.case11: 188 // CHECK1-NEXT: [[TMP20:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3) 189 // CHECK1-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0 190 // CHECK1-NEXT: br i1 [[TMP21]], label [[DOTCANCEL_EXIT12:%.*]], label [[DOTCANCEL_CONTINUE13:%.*]] 191 // CHECK1: .cancel.exit12: 192 // CHECK1-NEXT: br label [[CANCEL_EXIT23:%.*]] 193 // CHECK1: cancel.exit: 194 // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]]) 195 // CHECK1-NEXT: br label [[CANCEL_CONT]] 196 // CHECK1: .cancel.continue13: 197 // CHECK1-NEXT: br label [[DOTOMP_SECTIONS_EXIT19]] 198 // CHECK1: .omp.sections.case14: 199 // CHECK1-NEXT: [[TMP22:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3) 200 // CHECK1-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0 201 // CHECK1-NEXT: br i1 [[TMP23]], label [[DOTCANCEL_EXIT15:%.*]], label [[DOTCANCEL_CONTINUE16:%.*]] 202 // CHECK1: .cancel.exit15: 203 // CHECK1-NEXT: br label [[CANCEL_EXIT23]] 204 // CHECK1: .cancel.continue16: 205 // CHECK1-NEXT: [[TMP24:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3) 206 // CHECK1-NEXT: [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0 207 // CHECK1-NEXT: br i1 [[TMP25]], label [[DOTCANCEL_EXIT17:%.*]], label [[DOTCANCEL_CONTINUE18:%.*]] 208 // CHECK1: .cancel.exit17: 209 // CHECK1-NEXT: br label [[CANCEL_EXIT23]] 210 // CHECK1: .cancel.continue18: 211 // CHECK1-NEXT: br label [[DOTOMP_SECTIONS_EXIT19]] 212 // CHECK1: .omp.sections.exit19: 213 // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC20:%.*]] 214 // CHECK1: omp.inner.for.inc20: 215 // CHECK1-NEXT: [[TMP26:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_7]], align 4 216 // CHECK1-NEXT: [[INC21:%.*]] = add nsw i32 [[TMP26]], 1 217 // CHECK1-NEXT: store i32 [[INC21]], i32* [[DOTOMP_SECTIONS_IV_7]], align 4 218 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND8]] 219 // CHECK1: omp.inner.for.end22: 220 // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]]) 221 // CHECK1-NEXT: br label [[CANCEL_CONT24:%.*]] 222 // CHECK1: cancel.cont24: 223 // CHECK1-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]]) 224 // CHECK1-NEXT: [[TMP27:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4 225 // CHECK1-NEXT: store i32 [[TMP27]], i32* [[DOTCAPTURE_EXPR_]], align 4 226 // CHECK1-NEXT: [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 227 // CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP28]], 0 228 // CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1 229 // CHECK1-NEXT: [[SUB26:%.*]] = sub nsw i32 [[DIV]], 1 230 // CHECK1-NEXT: store i32 [[SUB26]], i32* [[DOTCAPTURE_EXPR_25]], align 4 231 // CHECK1-NEXT: store i32 0, i32* [[I]], align 4 232 // CHECK1-NEXT: [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 233 // CHECK1-NEXT: [[CMP27:%.*]] = icmp slt i32 0, [[TMP29]] 234 // CHECK1-NEXT: br i1 [[CMP27]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]] 235 // CHECK1: omp.precond.then: 236 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4 237 // CHECK1-NEXT: [[TMP30:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_25]], align 4 238 // CHECK1-NEXT: store i32 [[TMP30]], i32* [[DOTOMP_UB]], align 4 239 // CHECK1-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4 240 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 241 // CHECK1-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB5:[0-9]+]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1) 242 // CHECK1-NEXT: [[TMP31:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 243 // CHECK1-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_25]], align 4 244 // CHECK1-NEXT: [[CMP29:%.*]] = icmp sgt i32 [[TMP31]], [[TMP32]] 245 // CHECK1-NEXT: br i1 [[CMP29]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 246 // CHECK1: cond.true: 247 // CHECK1-NEXT: [[TMP33:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_25]], align 4 248 // CHECK1-NEXT: br label [[COND_END:%.*]] 249 // CHECK1: cond.false: 250 // CHECK1-NEXT: [[TMP34:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 251 // CHECK1-NEXT: br label [[COND_END]] 252 // CHECK1: cond.end: 253 // CHECK1-NEXT: [[COND:%.*]] = phi i32 [ [[TMP33]], [[COND_TRUE]] ], [ [[TMP34]], [[COND_FALSE]] ] 254 // CHECK1-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4 255 // CHECK1-NEXT: [[TMP35:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4 256 // CHECK1-NEXT: store i32 [[TMP35]], i32* [[DOTOMP_IV]], align 4 257 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND30:%.*]] 258 // CHECK1: omp.inner.for.cond30: 259 // CHECK1-NEXT: [[TMP36:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 260 // CHECK1-NEXT: [[TMP37:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 261 // CHECK1-NEXT: [[CMP31:%.*]] = icmp sle i32 [[TMP36]], [[TMP37]] 262 // CHECK1-NEXT: br i1 [[CMP31]], label [[OMP_INNER_FOR_BODY32:%.*]], label [[OMP_INNER_FOR_END39:%.*]] 263 // CHECK1: omp.inner.for.body32: 264 // CHECK1-NEXT: [[TMP38:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 265 // CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP38]], 1 266 // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]] 267 // CHECK1-NEXT: store i32 [[ADD]], i32* [[I28]], align 4 268 // CHECK1-NEXT: [[TMP39:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 2) 269 // CHECK1-NEXT: [[TMP40:%.*]] = icmp ne i32 [[TMP39]], 0 270 // CHECK1-NEXT: br i1 [[TMP40]], label [[DOTCANCEL_EXIT33:%.*]], label [[DOTCANCEL_CONTINUE34:%.*]] 271 // CHECK1: .cancel.exit33: 272 // CHECK1-NEXT: br label [[CANCEL_EXIT40:%.*]] 273 // CHECK1: cancel.exit23: 274 // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]]) 275 // CHECK1-NEXT: br label [[CANCEL_CONT24]] 276 // CHECK1: .cancel.continue34: 277 // CHECK1-NEXT: [[TMP41:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 2) 278 // CHECK1-NEXT: [[TMP42:%.*]] = icmp ne i32 [[TMP41]], 0 279 // CHECK1-NEXT: br i1 [[TMP42]], label [[DOTCANCEL_EXIT35:%.*]], label [[DOTCANCEL_CONTINUE36:%.*]] 280 // CHECK1: .cancel.exit35: 281 // CHECK1-NEXT: br label [[CANCEL_EXIT40]] 282 // CHECK1: .cancel.continue36: 283 // CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 284 // CHECK1: omp.body.continue: 285 // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC37:%.*]] 286 // CHECK1: omp.inner.for.inc37: 287 // CHECK1-NEXT: [[TMP43:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 288 // CHECK1-NEXT: [[ADD38:%.*]] = add nsw i32 [[TMP43]], 1 289 // CHECK1-NEXT: store i32 [[ADD38]], i32* [[DOTOMP_IV]], align 4 290 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND30]] 291 // CHECK1: omp.inner.for.end39: 292 // CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 293 // CHECK1: omp.loop.exit: 294 // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB5]], i32 [[TMP0]]) 295 // CHECK1-NEXT: br label [[OMP_PRECOND_END]] 296 // CHECK1: cancel.exit40: 297 // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB5]], i32 [[TMP0]]) 298 // CHECK1-NEXT: br label [[CANCEL_CONT41:%.*]] 299 // CHECK1: omp.precond.end: 300 // CHECK1-NEXT: br label [[CANCEL_CONT41]] 301 // CHECK1: cancel.cont41: 302 // CHECK1-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP0]]) 303 // CHECK1-NEXT: [[TMP44:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*)) 304 // CHECK1-NEXT: [[TMP45:%.*]] = bitcast i8* [[TMP44]] to %struct.kmp_task_t_with_privates* 305 // CHECK1-NEXT: [[TMP46:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP45]], i32 0, i32 0 306 // CHECK1-NEXT: [[TMP47:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i8* [[TMP44]]) 307 // CHECK1-NEXT: [[TMP48:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates.1*)* @.omp_task_entry..3 to i32 (i32, i8*)*)) 308 // CHECK1-NEXT: [[TMP49:%.*]] = bitcast i8* [[TMP48]] to %struct.kmp_task_t_with_privates.1* 309 // CHECK1-NEXT: [[TMP50:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES_1:%.*]], %struct.kmp_task_t_with_privates.1* [[TMP49]], i32 0, i32 0 310 // CHECK1-NEXT: [[TMP51:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i8* [[TMP48]]) 311 // CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*)) 312 // CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*)) 313 // CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]]) 314 // CHECK1-NEXT: [[TMP52:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4 315 // CHECK1-NEXT: ret i32 [[TMP52]] 316 // 317 // 318 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined. 319 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i8*** noundef nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[ARGC:%.*]]) #[[ATTR1:[0-9]+]] { 320 // CHECK1-NEXT: entry: 321 // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 322 // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 323 // CHECK1-NEXT: [[ARGV_ADDR:%.*]] = alloca i8***, align 8 324 // CHECK1-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8 325 // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 326 // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 327 // CHECK1-NEXT: store i8*** [[ARGV]], i8**** [[ARGV_ADDR]], align 8 328 // CHECK1-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8 329 // CHECK1-NEXT: [[TMP0:%.*]] = load i8***, i8**** [[ARGV_ADDR]], align 8 330 // CHECK1-NEXT: [[TMP1:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8 331 // CHECK1-NEXT: [[TMP2:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 332 // CHECK1-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 333 // CHECK1-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], i32 1) 334 // CHECK1-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 335 // CHECK1-NEXT: br i1 [[TMP5]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]] 336 // CHECK1: .cancel.exit: 337 // CHECK1-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB2]], i32 [[TMP3]]) 338 // CHECK1-NEXT: br label [[RETURN:%.*]] 339 // CHECK1: .cancel.continue: 340 // CHECK1-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], i32 1) 341 // CHECK1-NEXT: [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0 342 // CHECK1-NEXT: br i1 [[TMP8]], label [[DOTCANCEL_EXIT1:%.*]], label [[DOTCANCEL_CONTINUE2:%.*]] 343 // CHECK1: .cancel.exit1: 344 // CHECK1-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB2]], i32 [[TMP3]]) 345 // CHECK1-NEXT: br label [[RETURN]] 346 // CHECK1: .cancel.continue2: 347 // CHECK1-NEXT: [[TMP10:%.*]] = load i32, i32* [[TMP1]], align 4 348 // CHECK1-NEXT: [[CONV:%.*]] = trunc i32 [[TMP10]] to i8 349 // CHECK1-NEXT: [[TMP11:%.*]] = load i8**, i8*** [[TMP0]], align 8 350 // CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8*, i8** [[TMP11]], i64 0 351 // CHECK1-NEXT: [[TMP12:%.*]] = load i8*, i8** [[ARRAYIDX]], align 8 352 // CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i8, i8* [[TMP12]], i64 0 353 // CHECK1-NEXT: store i8 [[CONV]], i8* [[ARRAYIDX3]], align 1 354 // CHECK1-NEXT: br label [[RETURN]] 355 // CHECK1: return: 356 // CHECK1-NEXT: ret void 357 // 358 // 359 // CHECK1-LABEL: define {{[^@]+}}@.omp_task_entry. 360 // CHECK1-SAME: (i32 noundef [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias noundef [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] { 361 // CHECK1-NEXT: entry: 362 // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4 363 // CHECK1-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8 364 // CHECK1-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8 365 // CHECK1-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8 366 // CHECK1-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8 367 // CHECK1-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8 368 // CHECK1-NEXT: [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4 369 // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4 370 // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8 371 // CHECK1-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4 372 // CHECK1-NEXT: store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8 373 // CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4 374 // CHECK1-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8 375 // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0 376 // CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2 377 // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0 378 // CHECK1-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8 379 // CHECK1-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon* 380 // CHECK1-NEXT: [[TMP9:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8* 381 // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]]) 382 // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]]) 383 // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]]) 384 // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META12:![0-9]+]]) 385 // CHECK1-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14 386 // CHECK1-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !14 387 // CHECK1-NEXT: store i8* null, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !14 388 // CHECK1-NEXT: store void (i8*, ...)* null, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !14 389 // CHECK1-NEXT: store i8* [[TMP9]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !14 390 // CHECK1-NEXT: store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14 391 // CHECK1-NEXT: [[TMP10:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14 392 // CHECK1-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14 393 // CHECK1-NEXT: [[TMP12:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 4) #[[ATTR2:[0-9]+]] 394 // CHECK1-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0 395 // CHECK1-NEXT: br i1 [[TMP13]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]] 396 // CHECK1: .cancel.exit.i: 397 // CHECK1-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14 398 // CHECK1-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT:%.*]] 399 // CHECK1: .cancel.continue.i: 400 // CHECK1-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 4) #[[ATTR2]] 401 // CHECK1-NEXT: [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0 402 // CHECK1-NEXT: br i1 [[TMP15]], label [[DOTCANCEL_EXIT1_I:%.*]], label [[DOTCANCEL_CONTINUE2_I:%.*]] 403 // CHECK1: .cancel.exit1.i: 404 // CHECK1-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14 405 // CHECK1-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT]] 406 // CHECK1: .cancel.continue2.i: 407 // CHECK1-NEXT: store i32 0, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14 408 // CHECK1-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT]] 409 // CHECK1: .omp_outlined..1.exit: 410 // CHECK1-NEXT: [[CLEANUP_DEST_I:%.*]] = load i32, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14 411 // CHECK1-NEXT: ret i32 0 412 // 413 // 414 // CHECK1-LABEL: define {{[^@]+}}@.omp_task_entry..3 415 // CHECK1-SAME: (i32 noundef [[TMP0:%.*]], %struct.kmp_task_t_with_privates.1* noalias noundef [[TMP1:%.*]]) #[[ATTR4]] { 416 // CHECK1-NEXT: entry: 417 // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4 418 // CHECK1-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8 419 // CHECK1-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8 420 // CHECK1-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8 421 // CHECK1-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8 422 // CHECK1-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon.0*, align 8 423 // CHECK1-NEXT: [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4 424 // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4 425 // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates.1*, align 8 426 // CHECK1-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4 427 // CHECK1-NEXT: store %struct.kmp_task_t_with_privates.1* [[TMP1]], %struct.kmp_task_t_with_privates.1** [[DOTADDR1]], align 8 428 // CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4 429 // CHECK1-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates.1*, %struct.kmp_task_t_with_privates.1** [[DOTADDR1]], align 8 430 // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES_1:%.*]], %struct.kmp_task_t_with_privates.1* [[TMP3]], i32 0, i32 0 431 // CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2 432 // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0 433 // CHECK1-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8 434 // CHECK1-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon.0* 435 // CHECK1-NEXT: [[TMP9:%.*]] = bitcast %struct.kmp_task_t_with_privates.1* [[TMP3]] to i8* 436 // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META15:![0-9]+]]) 437 // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META18:![0-9]+]]) 438 // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META20:![0-9]+]]) 439 // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META22:![0-9]+]]) 440 // CHECK1-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !24 441 // CHECK1-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !24 442 // CHECK1-NEXT: store i8* null, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !24 443 // CHECK1-NEXT: store void (i8*, ...)* null, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !24 444 // CHECK1-NEXT: store i8* [[TMP9]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !24 445 // CHECK1-NEXT: store %struct.anon.0* [[TMP8]], %struct.anon.0** [[__CONTEXT_ADDR_I]], align 8, !noalias !24 446 // CHECK1-NEXT: [[TMP10:%.*]] = load %struct.anon.0*, %struct.anon.0** [[__CONTEXT_ADDR_I]], align 8, !noalias !24 447 // CHECK1-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !24 448 // CHECK1-NEXT: [[TMP12:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 4) #[[ATTR2]] 449 // CHECK1-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0 450 // CHECK1-NEXT: br i1 [[TMP13]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]] 451 // CHECK1: .cancel.exit.i: 452 // CHECK1-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !24 453 // CHECK1-NEXT: br label [[DOTOMP_OUTLINED__2_EXIT:%.*]] 454 // CHECK1: .cancel.continue.i: 455 // CHECK1-NEXT: store i32 0, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !24 456 // CHECK1-NEXT: br label [[DOTOMP_OUTLINED__2_EXIT]] 457 // CHECK1: .omp_outlined..2.exit: 458 // CHECK1-NEXT: [[CLEANUP_DEST_I:%.*]] = load i32, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !24 459 // CHECK1-NEXT: ret i32 0 460 // 461 // 462 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..4 463 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] { 464 // CHECK1-NEXT: entry: 465 // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 466 // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 467 // CHECK1-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4 468 // CHECK1-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4 469 // CHECK1-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4 470 // CHECK1-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4 471 // CHECK1-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4 472 // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 473 // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 474 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4 475 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4 476 // CHECK1-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4 477 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4 478 // CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 479 // CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4 480 // CHECK1-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP1]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1) 481 // CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4 482 // CHECK1-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 0 483 // CHECK1-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 0 484 // CHECK1-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_UB_]], align 4 485 // CHECK1-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4 486 // CHECK1-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_SECTIONS_IV_]], align 4 487 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 488 // CHECK1: omp.inner.for.cond: 489 // CHECK1-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 490 // CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4 491 // CHECK1-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]] 492 // CHECK1-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 493 // CHECK1: omp.inner.for.body: 494 // CHECK1-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 495 // CHECK1-NEXT: switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [ 496 // CHECK1-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]] 497 // CHECK1-NEXT: ] 498 // CHECK1: .omp.sections.case: 499 // CHECK1-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3) 500 // CHECK1-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0 501 // CHECK1-NEXT: br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]] 502 // CHECK1: .cancel.exit: 503 // CHECK1-NEXT: br label [[CANCEL_EXIT:%.*]] 504 // CHECK1: .cancel.continue: 505 // CHECK1-NEXT: [[TMP11:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3) 506 // CHECK1-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0 507 // CHECK1-NEXT: br i1 [[TMP12]], label [[DOTCANCEL_EXIT1:%.*]], label [[DOTCANCEL_CONTINUE2:%.*]] 508 // CHECK1: .cancel.exit1: 509 // CHECK1-NEXT: br label [[CANCEL_EXIT]] 510 // CHECK1: .cancel.continue2: 511 // CHECK1-NEXT: br label [[DOTOMP_SECTIONS_EXIT]] 512 // CHECK1: .omp.sections.exit: 513 // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 514 // CHECK1: omp.inner.for.inc: 515 // CHECK1-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 516 // CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP13]], 1 517 // CHECK1-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4 518 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]] 519 // CHECK1: omp.inner.for.end: 520 // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP1]]) 521 // CHECK1-NEXT: br label [[CANCEL_CONT:%.*]] 522 // CHECK1: cancel.cont: 523 // CHECK1-NEXT: ret void 524 // CHECK1: cancel.exit: 525 // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP1]]) 526 // CHECK1-NEXT: br label [[CANCEL_CONT]] 527 // 528 // 529 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..5 530 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] { 531 // CHECK1-NEXT: entry: 532 // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 533 // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 534 // CHECK1-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4 535 // CHECK1-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4 536 // CHECK1-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4 537 // CHECK1-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4 538 // CHECK1-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4 539 // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 540 // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 541 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4 542 // CHECK1-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_]], align 4 543 // CHECK1-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4 544 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4 545 // CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 546 // CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4 547 // CHECK1-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP1]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1) 548 // CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4 549 // CHECK1-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 1 550 // CHECK1-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 1 551 // CHECK1-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_UB_]], align 4 552 // CHECK1-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4 553 // CHECK1-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_SECTIONS_IV_]], align 4 554 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 555 // CHECK1: omp.inner.for.cond: 556 // CHECK1-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 557 // CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4 558 // CHECK1-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]] 559 // CHECK1-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 560 // CHECK1: omp.inner.for.body: 561 // CHECK1-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 562 // CHECK1-NEXT: switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [ 563 // CHECK1-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]] 564 // CHECK1-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE3:%.*]] 565 // CHECK1-NEXT: ] 566 // CHECK1: .omp.sections.case: 567 // CHECK1-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3) 568 // CHECK1-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0 569 // CHECK1-NEXT: br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]] 570 // CHECK1: .cancel.exit: 571 // CHECK1-NEXT: br label [[CANCEL_EXIT:%.*]] 572 // CHECK1: .cancel.continue: 573 // CHECK1-NEXT: [[TMP11:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3) 574 // CHECK1-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0 575 // CHECK1-NEXT: br i1 [[TMP12]], label [[DOTCANCEL_EXIT1:%.*]], label [[DOTCANCEL_CONTINUE2:%.*]] 576 // CHECK1: .cancel.exit1: 577 // CHECK1-NEXT: br label [[CANCEL_EXIT]] 578 // CHECK1: .cancel.continue2: 579 // CHECK1-NEXT: br label [[DOTOMP_SECTIONS_EXIT]] 580 // CHECK1: .omp.sections.case3: 581 // CHECK1-NEXT: [[TMP13:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3) 582 // CHECK1-NEXT: [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0 583 // CHECK1-NEXT: br i1 [[TMP14]], label [[DOTCANCEL_EXIT4:%.*]], label [[DOTCANCEL_CONTINUE5:%.*]] 584 // CHECK1: .cancel.exit4: 585 // CHECK1-NEXT: br label [[CANCEL_EXIT]] 586 // CHECK1: .cancel.continue5: 587 // CHECK1-NEXT: br label [[DOTOMP_SECTIONS_EXIT]] 588 // CHECK1: .omp.sections.exit: 589 // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 590 // CHECK1: omp.inner.for.inc: 591 // CHECK1-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 592 // CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP15]], 1 593 // CHECK1-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4 594 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]] 595 // CHECK1: omp.inner.for.end: 596 // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP1]]) 597 // CHECK1-NEXT: br label [[CANCEL_CONT:%.*]] 598 // CHECK1: cancel.cont: 599 // CHECK1-NEXT: ret void 600 // CHECK1: cancel.exit: 601 // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP1]]) 602 // CHECK1-NEXT: br label [[CANCEL_CONT]] 603 // 604 // 605 // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..6 606 // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[ARGC:%.*]]) #[[ATTR1]] { 607 // CHECK1-NEXT: entry: 608 // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 609 // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 610 // CHECK1-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8 611 // CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 612 // CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4 613 // CHECK1-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 614 // CHECK1-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4 615 // CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4 616 // CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 617 // CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 618 // CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 619 // CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 620 // CHECK1-NEXT: [[I3:%.*]] = alloca i32, align 4 621 // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 622 // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 623 // CHECK1-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8 624 // CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8 625 // CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4 626 // CHECK1-NEXT: store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4 627 // CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 628 // CHECK1-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP2]], 0 629 // CHECK1-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1 630 // CHECK1-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1 631 // CHECK1-NEXT: store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4 632 // CHECK1-NEXT: store i32 0, i32* [[I]], align 4 633 // CHECK1-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 634 // CHECK1-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP3]] 635 // CHECK1-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]] 636 // CHECK1: omp.precond.then: 637 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4 638 // CHECK1-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4 639 // CHECK1-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_UB]], align 4 640 // CHECK1-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4 641 // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 642 // CHECK1-NEXT: [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 643 // CHECK1-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4 644 // CHECK1-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB5]], i32 [[TMP6]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1) 645 // CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 646 // CHECK1-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4 647 // CHECK1-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP7]], [[TMP8]] 648 // CHECK1-NEXT: br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 649 // CHECK1: cond.true: 650 // CHECK1-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4 651 // CHECK1-NEXT: br label [[COND_END:%.*]] 652 // CHECK1: cond.false: 653 // CHECK1-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 654 // CHECK1-NEXT: br label [[COND_END]] 655 // CHECK1: cond.end: 656 // CHECK1-NEXT: [[COND:%.*]] = phi i32 [ [[TMP9]], [[COND_TRUE]] ], [ [[TMP10]], [[COND_FALSE]] ] 657 // CHECK1-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4 658 // CHECK1-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4 659 // CHECK1-NEXT: store i32 [[TMP11]], i32* [[DOTOMP_IV]], align 4 660 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 661 // CHECK1: omp.inner.for.cond: 662 // CHECK1-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 663 // CHECK1-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 664 // CHECK1-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP12]], [[TMP13]] 665 // CHECK1-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 666 // CHECK1: omp.inner.for.body: 667 // CHECK1-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 668 // CHECK1-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP14]], 1 669 // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]] 670 // CHECK1-NEXT: store i32 [[ADD]], i32* [[I3]], align 4 671 // CHECK1-NEXT: [[TMP15:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 672 // CHECK1-NEXT: [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4 673 // CHECK1-NEXT: [[TMP17:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP16]], i32 2) 674 // CHECK1-NEXT: [[TMP18:%.*]] = icmp ne i32 [[TMP17]], 0 675 // CHECK1-NEXT: br i1 [[TMP18]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]] 676 // CHECK1: .cancel.exit: 677 // CHECK1-NEXT: br label [[CANCEL_EXIT:%.*]] 678 // CHECK1: .cancel.continue: 679 // CHECK1-NEXT: [[TMP19:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 680 // CHECK1-NEXT: [[TMP20:%.*]] = load i32, i32* [[TMP19]], align 4 681 // CHECK1-NEXT: [[TMP21:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP20]], i32 2) 682 // CHECK1-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 0 683 // CHECK1-NEXT: br i1 [[TMP22]], label [[DOTCANCEL_EXIT6:%.*]], label [[DOTCANCEL_CONTINUE7:%.*]] 684 // CHECK1: .cancel.exit6: 685 // CHECK1-NEXT: br label [[CANCEL_EXIT]] 686 // CHECK1: .cancel.continue7: 687 // CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 688 // CHECK1: omp.body.continue: 689 // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 690 // CHECK1: omp.inner.for.inc: 691 // CHECK1-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 692 // CHECK1-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP23]], 1 693 // CHECK1-NEXT: store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4 694 // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]] 695 // CHECK1: omp.inner.for.end: 696 // CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 697 // CHECK1: omp.loop.exit: 698 // CHECK1-NEXT: [[TMP24:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 699 // CHECK1-NEXT: [[TMP25:%.*]] = load i32, i32* [[TMP24]], align 4 700 // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB5]], i32 [[TMP25]]) 701 // CHECK1-NEXT: br label [[OMP_PRECOND_END]] 702 // CHECK1: cancel.exit: 703 // CHECK1-NEXT: [[TMP26:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 704 // CHECK1-NEXT: [[TMP27:%.*]] = load i32, i32* [[TMP26]], align 4 705 // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB5]], i32 [[TMP27]]) 706 // CHECK1-NEXT: br label [[CANCEL_CONT:%.*]] 707 // CHECK1: omp.precond.end: 708 // CHECK1-NEXT: br label [[CANCEL_CONT]] 709 // CHECK1: cancel.cont: 710 // CHECK1-NEXT: ret void 711 // 712 // 713 // CHECK2-LABEL: define {{[^@]+}}@main 714 // CHECK2-SAME: (i32 noundef [[ARGC:%.*]], i8** noundef [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] { 715 // CHECK2-NEXT: entry: 716 // CHECK2-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 717 // CHECK2-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4 718 // CHECK2-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8 719 // CHECK2-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4 720 // CHECK2-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4 721 // CHECK2-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4 722 // CHECK2-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4 723 // CHECK2-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4 724 // CHECK2-NEXT: [[DOTOMP_SECTIONS_LB_3:%.*]] = alloca i32, align 4 725 // CHECK2-NEXT: [[DOTOMP_SECTIONS_UB_4:%.*]] = alloca i32, align 4 726 // CHECK2-NEXT: [[DOTOMP_SECTIONS_ST_5:%.*]] = alloca i32, align 4 727 // CHECK2-NEXT: [[DOTOMP_SECTIONS_IL_6:%.*]] = alloca i32, align 4 728 // CHECK2-NEXT: [[DOTOMP_SECTIONS_IV_7:%.*]] = alloca i32, align 4 729 // CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 730 // CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4 731 // CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 732 // CHECK2-NEXT: [[DOTCAPTURE_EXPR_25:%.*]] = alloca i32, align 4 733 // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 734 // CHECK2-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 735 // CHECK2-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 736 // CHECK2-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 737 // CHECK2-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 738 // CHECK2-NEXT: [[I28:%.*]] = alloca i32, align 4 739 // CHECK2-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1 740 // CHECK2-NEXT: [[AGG_CAPTURED42:%.*]] = alloca [[STRUCT_ANON_0:%.*]], align 1 741 // CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]]) 742 // CHECK2-NEXT: store i32 0, i32* [[RETVAL]], align 4 743 // CHECK2-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4 744 // CHECK2-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8 745 // CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i8***, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i8*** [[ARGV_ADDR]], i32* [[ARGC_ADDR]]) 746 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4 747 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4 748 // CHECK2-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4 749 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4 750 // CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1) 751 // CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4 752 // CHECK2-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0 753 // CHECK2-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i32 [[TMP1]], i32 0 754 // CHECK2-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_SECTIONS_UB_]], align 4 755 // CHECK2-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4 756 // CHECK2-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_IV_]], align 4 757 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 758 // CHECK2: omp.inner.for.cond: 759 // CHECK2-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 760 // CHECK2-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4 761 // CHECK2-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]] 762 // CHECK2-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 763 // CHECK2: omp.inner.for.body: 764 // CHECK2-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 765 // CHECK2-NEXT: switch i32 [[TMP7]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [ 766 // CHECK2-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]] 767 // CHECK2-NEXT: ] 768 // CHECK2: .omp.sections.case: 769 // CHECK2-NEXT: [[TMP8:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3) 770 // CHECK2-NEXT: [[TMP9:%.*]] = icmp ne i32 [[TMP8]], 0 771 // CHECK2-NEXT: br i1 [[TMP9]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]] 772 // CHECK2: .cancel.exit: 773 // CHECK2-NEXT: br label [[CANCEL_EXIT:%.*]] 774 // CHECK2: .cancel.continue: 775 // CHECK2-NEXT: [[TMP10:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3) 776 // CHECK2-NEXT: [[TMP11:%.*]] = icmp ne i32 [[TMP10]], 0 777 // CHECK2-NEXT: br i1 [[TMP11]], label [[DOTCANCEL_EXIT1:%.*]], label [[DOTCANCEL_CONTINUE2:%.*]] 778 // CHECK2: .cancel.exit1: 779 // CHECK2-NEXT: br label [[CANCEL_EXIT]] 780 // CHECK2: .cancel.continue2: 781 // CHECK2-NEXT: br label [[DOTOMP_SECTIONS_EXIT]] 782 // CHECK2: .omp.sections.exit: 783 // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 784 // CHECK2: omp.inner.for.inc: 785 // CHECK2-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 786 // CHECK2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP12]], 1 787 // CHECK2-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4 788 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] 789 // CHECK2: omp.inner.for.end: 790 // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]]) 791 // CHECK2-NEXT: br label [[CANCEL_CONT:%.*]] 792 // CHECK2: cancel.cont: 793 // CHECK2-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB4:[0-9]+]], i32 [[TMP0]]) 794 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_3]], align 4 795 // CHECK2-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_4]], align 4 796 // CHECK2-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_5]], align 4 797 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_6]], align 4 798 // CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_SECTIONS_IL_6]], i32* [[DOTOMP_SECTIONS_LB_3]], i32* [[DOTOMP_SECTIONS_UB_4]], i32* [[DOTOMP_SECTIONS_ST_5]], i32 1, i32 1) 799 // CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_4]], align 4 800 // CHECK2-NEXT: [[TMP14:%.*]] = icmp slt i32 [[TMP13]], 1 801 // CHECK2-NEXT: [[TMP15:%.*]] = select i1 [[TMP14]], i32 [[TMP13]], i32 1 802 // CHECK2-NEXT: store i32 [[TMP15]], i32* [[DOTOMP_SECTIONS_UB_4]], align 4 803 // CHECK2-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_3]], align 4 804 // CHECK2-NEXT: store i32 [[TMP16]], i32* [[DOTOMP_SECTIONS_IV_7]], align 4 805 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND8:%.*]] 806 // CHECK2: omp.inner.for.cond8: 807 // CHECK2-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_7]], align 4 808 // CHECK2-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_4]], align 4 809 // CHECK2-NEXT: [[CMP9:%.*]] = icmp sle i32 [[TMP17]], [[TMP18]] 810 // CHECK2-NEXT: br i1 [[CMP9]], label [[OMP_INNER_FOR_BODY10:%.*]], label [[OMP_INNER_FOR_END22:%.*]] 811 // CHECK2: omp.inner.for.body10: 812 // CHECK2-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_7]], align 4 813 // CHECK2-NEXT: switch i32 [[TMP19]], label [[DOTOMP_SECTIONS_EXIT19:%.*]] [ 814 // CHECK2-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE11:%.*]] 815 // CHECK2-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE14:%.*]] 816 // CHECK2-NEXT: ] 817 // CHECK2: .omp.sections.case11: 818 // CHECK2-NEXT: [[TMP20:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3) 819 // CHECK2-NEXT: [[TMP21:%.*]] = icmp ne i32 [[TMP20]], 0 820 // CHECK2-NEXT: br i1 [[TMP21]], label [[DOTCANCEL_EXIT12:%.*]], label [[DOTCANCEL_CONTINUE13:%.*]] 821 // CHECK2: .cancel.exit12: 822 // CHECK2-NEXT: br label [[CANCEL_EXIT23:%.*]] 823 // CHECK2: cancel.exit: 824 // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]]) 825 // CHECK2-NEXT: br label [[CANCEL_CONT]] 826 // CHECK2: .cancel.continue13: 827 // CHECK2-NEXT: br label [[DOTOMP_SECTIONS_EXIT19]] 828 // CHECK2: .omp.sections.case14: 829 // CHECK2-NEXT: [[TMP22:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3) 830 // CHECK2-NEXT: [[TMP23:%.*]] = icmp ne i32 [[TMP22]], 0 831 // CHECK2-NEXT: br i1 [[TMP23]], label [[DOTCANCEL_EXIT15:%.*]], label [[DOTCANCEL_CONTINUE16:%.*]] 832 // CHECK2: .cancel.exit15: 833 // CHECK2-NEXT: br label [[CANCEL_EXIT23]] 834 // CHECK2: .cancel.continue16: 835 // CHECK2-NEXT: [[TMP24:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 3) 836 // CHECK2-NEXT: [[TMP25:%.*]] = icmp ne i32 [[TMP24]], 0 837 // CHECK2-NEXT: br i1 [[TMP25]], label [[DOTCANCEL_EXIT17:%.*]], label [[DOTCANCEL_CONTINUE18:%.*]] 838 // CHECK2: .cancel.exit17: 839 // CHECK2-NEXT: br label [[CANCEL_EXIT23]] 840 // CHECK2: .cancel.continue18: 841 // CHECK2-NEXT: br label [[DOTOMP_SECTIONS_EXIT19]] 842 // CHECK2: .omp.sections.exit19: 843 // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC20:%.*]] 844 // CHECK2: omp.inner.for.inc20: 845 // CHECK2-NEXT: [[TMP26:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_7]], align 4 846 // CHECK2-NEXT: [[INC21:%.*]] = add nsw i32 [[TMP26]], 1 847 // CHECK2-NEXT: store i32 [[INC21]], i32* [[DOTOMP_SECTIONS_IV_7]], align 4 848 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND8]] 849 // CHECK2: omp.inner.for.end22: 850 // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]]) 851 // CHECK2-NEXT: br label [[CANCEL_CONT24:%.*]] 852 // CHECK2: cancel.cont24: 853 // CHECK2-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB4]], i32 [[TMP0]]) 854 // CHECK2-NEXT: [[TMP27:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4 855 // CHECK2-NEXT: store i32 [[TMP27]], i32* [[DOTCAPTURE_EXPR_]], align 4 856 // CHECK2-NEXT: [[TMP28:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 857 // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP28]], 0 858 // CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1 859 // CHECK2-NEXT: [[SUB26:%.*]] = sub nsw i32 [[DIV]], 1 860 // CHECK2-NEXT: store i32 [[SUB26]], i32* [[DOTCAPTURE_EXPR_25]], align 4 861 // CHECK2-NEXT: store i32 0, i32* [[I]], align 4 862 // CHECK2-NEXT: [[TMP29:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 863 // CHECK2-NEXT: [[CMP27:%.*]] = icmp slt i32 0, [[TMP29]] 864 // CHECK2-NEXT: br i1 [[CMP27]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]] 865 // CHECK2: omp.precond.then: 866 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4 867 // CHECK2-NEXT: [[TMP30:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_25]], align 4 868 // CHECK2-NEXT: store i32 [[TMP30]], i32* [[DOTOMP_UB]], align 4 869 // CHECK2-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4 870 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 871 // CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB5:[0-9]+]], i32 [[TMP0]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1) 872 // CHECK2-NEXT: [[TMP31:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 873 // CHECK2-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_25]], align 4 874 // CHECK2-NEXT: [[CMP29:%.*]] = icmp sgt i32 [[TMP31]], [[TMP32]] 875 // CHECK2-NEXT: br i1 [[CMP29]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 876 // CHECK2: cond.true: 877 // CHECK2-NEXT: [[TMP33:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_25]], align 4 878 // CHECK2-NEXT: br label [[COND_END:%.*]] 879 // CHECK2: cond.false: 880 // CHECK2-NEXT: [[TMP34:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 881 // CHECK2-NEXT: br label [[COND_END]] 882 // CHECK2: cond.end: 883 // CHECK2-NEXT: [[COND:%.*]] = phi i32 [ [[TMP33]], [[COND_TRUE]] ], [ [[TMP34]], [[COND_FALSE]] ] 884 // CHECK2-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4 885 // CHECK2-NEXT: [[TMP35:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4 886 // CHECK2-NEXT: store i32 [[TMP35]], i32* [[DOTOMP_IV]], align 4 887 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND30:%.*]] 888 // CHECK2: omp.inner.for.cond30: 889 // CHECK2-NEXT: [[TMP36:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 890 // CHECK2-NEXT: [[TMP37:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 891 // CHECK2-NEXT: [[CMP31:%.*]] = icmp sle i32 [[TMP36]], [[TMP37]] 892 // CHECK2-NEXT: br i1 [[CMP31]], label [[OMP_INNER_FOR_BODY32:%.*]], label [[OMP_INNER_FOR_END39:%.*]] 893 // CHECK2: omp.inner.for.body32: 894 // CHECK2-NEXT: [[TMP38:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 895 // CHECK2-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP38]], 1 896 // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]] 897 // CHECK2-NEXT: store i32 [[ADD]], i32* [[I28]], align 4 898 // CHECK2-NEXT: [[TMP39:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 2) 899 // CHECK2-NEXT: [[TMP40:%.*]] = icmp ne i32 [[TMP39]], 0 900 // CHECK2-NEXT: br i1 [[TMP40]], label [[DOTCANCEL_EXIT33:%.*]], label [[DOTCANCEL_CONTINUE34:%.*]] 901 // CHECK2: .cancel.exit33: 902 // CHECK2-NEXT: br label [[CANCEL_EXIT40:%.*]] 903 // CHECK2: cancel.exit23: 904 // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP0]]) 905 // CHECK2-NEXT: br label [[CANCEL_CONT24]] 906 // CHECK2: .cancel.continue34: 907 // CHECK2-NEXT: [[TMP41:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 2) 908 // CHECK2-NEXT: [[TMP42:%.*]] = icmp ne i32 [[TMP41]], 0 909 // CHECK2-NEXT: br i1 [[TMP42]], label [[DOTCANCEL_EXIT35:%.*]], label [[DOTCANCEL_CONTINUE36:%.*]] 910 // CHECK2: .cancel.exit35: 911 // CHECK2-NEXT: br label [[CANCEL_EXIT40]] 912 // CHECK2: .cancel.continue36: 913 // CHECK2-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 914 // CHECK2: omp.body.continue: 915 // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC37:%.*]] 916 // CHECK2: omp.inner.for.inc37: 917 // CHECK2-NEXT: [[TMP43:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 918 // CHECK2-NEXT: [[ADD38:%.*]] = add nsw i32 [[TMP43]], 1 919 // CHECK2-NEXT: store i32 [[ADD38]], i32* [[DOTOMP_IV]], align 4 920 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND30]] 921 // CHECK2: omp.inner.for.end39: 922 // CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 923 // CHECK2: omp.loop.exit: 924 // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB5]], i32 [[TMP0]]) 925 // CHECK2-NEXT: br label [[OMP_PRECOND_END]] 926 // CHECK2: cancel.exit40: 927 // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB5]], i32 [[TMP0]]) 928 // CHECK2-NEXT: br label [[CANCEL_CONT41:%.*]] 929 // CHECK2: omp.precond.end: 930 // CHECK2-NEXT: br label [[CANCEL_CONT41]] 931 // CHECK2: cancel.cont41: 932 // CHECK2-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP0]]) 933 // CHECK2-NEXT: [[TMP44:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*)) 934 // CHECK2-NEXT: [[TMP45:%.*]] = bitcast i8* [[TMP44]] to %struct.kmp_task_t_with_privates* 935 // CHECK2-NEXT: [[TMP46:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP45]], i32 0, i32 0 936 // CHECK2-NEXT: [[TMP47:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i8* [[TMP44]]) 937 // CHECK2-NEXT: [[TMP48:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates.1*)* @.omp_task_entry..3 to i32 (i32, i8*)*)) 938 // CHECK2-NEXT: [[TMP49:%.*]] = bitcast i8* [[TMP48]] to %struct.kmp_task_t_with_privates.1* 939 // CHECK2-NEXT: [[TMP50:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES_1:%.*]], %struct.kmp_task_t_with_privates.1* [[TMP49]], i32 0, i32 0 940 // CHECK2-NEXT: [[TMP51:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i8* [[TMP48]]) 941 // CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*)) 942 // CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..5 to void (i32*, i32*, ...)*)) 943 // CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined..6 to void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]]) 944 // CHECK2-NEXT: [[TMP52:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4 945 // CHECK2-NEXT: ret i32 [[TMP52]] 946 // 947 // 948 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined. 949 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i8*** noundef nonnull align 8 dereferenceable(8) [[ARGV:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[ARGC:%.*]]) #[[ATTR1:[0-9]+]] { 950 // CHECK2-NEXT: entry: 951 // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 952 // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 953 // CHECK2-NEXT: [[ARGV_ADDR:%.*]] = alloca i8***, align 8 954 // CHECK2-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8 955 // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 956 // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 957 // CHECK2-NEXT: store i8*** [[ARGV]], i8**** [[ARGV_ADDR]], align 8 958 // CHECK2-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8 959 // CHECK2-NEXT: [[TMP0:%.*]] = load i8***, i8**** [[ARGV_ADDR]], align 8 960 // CHECK2-NEXT: [[TMP1:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8 961 // CHECK2-NEXT: [[TMP2:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 962 // CHECK2-NEXT: [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4 963 // CHECK2-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], i32 1) 964 // CHECK2-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 965 // CHECK2-NEXT: br i1 [[TMP5]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]] 966 // CHECK2: .cancel.exit: 967 // CHECK2-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB2]], i32 [[TMP3]]) 968 // CHECK2-NEXT: br label [[RETURN:%.*]] 969 // CHECK2: .cancel.continue: 970 // CHECK2-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP3]], i32 1) 971 // CHECK2-NEXT: [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0 972 // CHECK2-NEXT: br i1 [[TMP8]], label [[DOTCANCEL_EXIT1:%.*]], label [[DOTCANCEL_CONTINUE2:%.*]] 973 // CHECK2: .cancel.exit1: 974 // CHECK2-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancel_barrier(%struct.ident_t* @[[GLOB2]], i32 [[TMP3]]) 975 // CHECK2-NEXT: br label [[RETURN]] 976 // CHECK2: .cancel.continue2: 977 // CHECK2-NEXT: [[TMP10:%.*]] = load i32, i32* [[TMP1]], align 4 978 // CHECK2-NEXT: [[CONV:%.*]] = trunc i32 [[TMP10]] to i8 979 // CHECK2-NEXT: [[TMP11:%.*]] = load i8**, i8*** [[TMP0]], align 8 980 // CHECK2-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8*, i8** [[TMP11]], i64 0 981 // CHECK2-NEXT: [[TMP12:%.*]] = load i8*, i8** [[ARRAYIDX]], align 8 982 // CHECK2-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i8, i8* [[TMP12]], i64 0 983 // CHECK2-NEXT: store i8 [[CONV]], i8* [[ARRAYIDX3]], align 1 984 // CHECK2-NEXT: br label [[RETURN]] 985 // CHECK2: return: 986 // CHECK2-NEXT: ret void 987 // 988 // 989 // CHECK2-LABEL: define {{[^@]+}}@.omp_task_entry. 990 // CHECK2-SAME: (i32 noundef [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias noundef [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] { 991 // CHECK2-NEXT: entry: 992 // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4 993 // CHECK2-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8 994 // CHECK2-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8 995 // CHECK2-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8 996 // CHECK2-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8 997 // CHECK2-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8 998 // CHECK2-NEXT: [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4 999 // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4 1000 // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8 1001 // CHECK2-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4 1002 // CHECK2-NEXT: store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8 1003 // CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4 1004 // CHECK2-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8 1005 // CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0 1006 // CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2 1007 // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0 1008 // CHECK2-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8 1009 // CHECK2-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon* 1010 // CHECK2-NEXT: [[TMP9:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8* 1011 // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]]) 1012 // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]]) 1013 // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]]) 1014 // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META12:![0-9]+]]) 1015 // CHECK2-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14 1016 // CHECK2-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !14 1017 // CHECK2-NEXT: store i8* null, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !14 1018 // CHECK2-NEXT: store void (i8*, ...)* null, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !14 1019 // CHECK2-NEXT: store i8* [[TMP9]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !14 1020 // CHECK2-NEXT: store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14 1021 // CHECK2-NEXT: [[TMP10:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !14 1022 // CHECK2-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !14 1023 // CHECK2-NEXT: [[TMP12:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 4) #[[ATTR2:[0-9]+]] 1024 // CHECK2-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0 1025 // CHECK2-NEXT: br i1 [[TMP13]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]] 1026 // CHECK2: .cancel.exit.i: 1027 // CHECK2-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14 1028 // CHECK2-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT:%.*]] 1029 // CHECK2: .cancel.continue.i: 1030 // CHECK2-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 4) #[[ATTR2]] 1031 // CHECK2-NEXT: [[TMP15:%.*]] = icmp ne i32 [[TMP14]], 0 1032 // CHECK2-NEXT: br i1 [[TMP15]], label [[DOTCANCEL_EXIT1_I:%.*]], label [[DOTCANCEL_CONTINUE2_I:%.*]] 1033 // CHECK2: .cancel.exit1.i: 1034 // CHECK2-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14 1035 // CHECK2-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT]] 1036 // CHECK2: .cancel.continue2.i: 1037 // CHECK2-NEXT: store i32 0, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14 1038 // CHECK2-NEXT: br label [[DOTOMP_OUTLINED__1_EXIT]] 1039 // CHECK2: .omp_outlined..1.exit: 1040 // CHECK2-NEXT: [[CLEANUP_DEST_I:%.*]] = load i32, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !14 1041 // CHECK2-NEXT: ret i32 0 1042 // 1043 // 1044 // CHECK2-LABEL: define {{[^@]+}}@.omp_task_entry..3 1045 // CHECK2-SAME: (i32 noundef [[TMP0:%.*]], %struct.kmp_task_t_with_privates.1* noalias noundef [[TMP1:%.*]]) #[[ATTR4]] { 1046 // CHECK2-NEXT: entry: 1047 // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4 1048 // CHECK2-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8 1049 // CHECK2-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8 1050 // CHECK2-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8 1051 // CHECK2-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8 1052 // CHECK2-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon.0*, align 8 1053 // CHECK2-NEXT: [[CLEANUP_DEST_SLOT_I:%.*]] = alloca i32, align 4 1054 // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4 1055 // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates.1*, align 8 1056 // CHECK2-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4 1057 // CHECK2-NEXT: store %struct.kmp_task_t_with_privates.1* [[TMP1]], %struct.kmp_task_t_with_privates.1** [[DOTADDR1]], align 8 1058 // CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4 1059 // CHECK2-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates.1*, %struct.kmp_task_t_with_privates.1** [[DOTADDR1]], align 8 1060 // CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES_1:%.*]], %struct.kmp_task_t_with_privates.1* [[TMP3]], i32 0, i32 0 1061 // CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2 1062 // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0 1063 // CHECK2-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8 1064 // CHECK2-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon.0* 1065 // CHECK2-NEXT: [[TMP9:%.*]] = bitcast %struct.kmp_task_t_with_privates.1* [[TMP3]] to i8* 1066 // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META15:![0-9]+]]) 1067 // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META18:![0-9]+]]) 1068 // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META20:![0-9]+]]) 1069 // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META22:![0-9]+]]) 1070 // CHECK2-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !24 1071 // CHECK2-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !24 1072 // CHECK2-NEXT: store i8* null, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !24 1073 // CHECK2-NEXT: store void (i8*, ...)* null, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !24 1074 // CHECK2-NEXT: store i8* [[TMP9]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !24 1075 // CHECK2-NEXT: store %struct.anon.0* [[TMP8]], %struct.anon.0** [[__CONTEXT_ADDR_I]], align 8, !noalias !24 1076 // CHECK2-NEXT: [[TMP10:%.*]] = load %struct.anon.0*, %struct.anon.0** [[__CONTEXT_ADDR_I]], align 8, !noalias !24 1077 // CHECK2-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !24 1078 // CHECK2-NEXT: [[TMP12:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP11]], i32 4) #[[ATTR2]] 1079 // CHECK2-NEXT: [[TMP13:%.*]] = icmp ne i32 [[TMP12]], 0 1080 // CHECK2-NEXT: br i1 [[TMP13]], label [[DOTCANCEL_EXIT_I:%.*]], label [[DOTCANCEL_CONTINUE_I:%.*]] 1081 // CHECK2: .cancel.exit.i: 1082 // CHECK2-NEXT: store i32 1, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !24 1083 // CHECK2-NEXT: br label [[DOTOMP_OUTLINED__2_EXIT:%.*]] 1084 // CHECK2: .cancel.continue.i: 1085 // CHECK2-NEXT: store i32 0, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !24 1086 // CHECK2-NEXT: br label [[DOTOMP_OUTLINED__2_EXIT]] 1087 // CHECK2: .omp_outlined..2.exit: 1088 // CHECK2-NEXT: [[CLEANUP_DEST_I:%.*]] = load i32, i32* [[CLEANUP_DEST_SLOT_I]], align 4, !noalias !24 1089 // CHECK2-NEXT: ret i32 0 1090 // 1091 // 1092 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..4 1093 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] { 1094 // CHECK2-NEXT: entry: 1095 // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 1096 // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 1097 // CHECK2-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4 1098 // CHECK2-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4 1099 // CHECK2-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4 1100 // CHECK2-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4 1101 // CHECK2-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4 1102 // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 1103 // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 1104 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4 1105 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_UB_]], align 4 1106 // CHECK2-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4 1107 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4 1108 // CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 1109 // CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4 1110 // CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP1]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1) 1111 // CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4 1112 // CHECK2-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 0 1113 // CHECK2-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 0 1114 // CHECK2-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_UB_]], align 4 1115 // CHECK2-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4 1116 // CHECK2-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_SECTIONS_IV_]], align 4 1117 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 1118 // CHECK2: omp.inner.for.cond: 1119 // CHECK2-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 1120 // CHECK2-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4 1121 // CHECK2-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]] 1122 // CHECK2-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 1123 // CHECK2: omp.inner.for.body: 1124 // CHECK2-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 1125 // CHECK2-NEXT: switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [ 1126 // CHECK2-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]] 1127 // CHECK2-NEXT: ] 1128 // CHECK2: .omp.sections.case: 1129 // CHECK2-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3) 1130 // CHECK2-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0 1131 // CHECK2-NEXT: br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]] 1132 // CHECK2: .cancel.exit: 1133 // CHECK2-NEXT: br label [[CANCEL_EXIT:%.*]] 1134 // CHECK2: .cancel.continue: 1135 // CHECK2-NEXT: [[TMP11:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3) 1136 // CHECK2-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0 1137 // CHECK2-NEXT: br i1 [[TMP12]], label [[DOTCANCEL_EXIT1:%.*]], label [[DOTCANCEL_CONTINUE2:%.*]] 1138 // CHECK2: .cancel.exit1: 1139 // CHECK2-NEXT: br label [[CANCEL_EXIT]] 1140 // CHECK2: .cancel.continue2: 1141 // CHECK2-NEXT: br label [[DOTOMP_SECTIONS_EXIT]] 1142 // CHECK2: .omp.sections.exit: 1143 // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 1144 // CHECK2: omp.inner.for.inc: 1145 // CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 1146 // CHECK2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP13]], 1 1147 // CHECK2-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4 1148 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] 1149 // CHECK2: omp.inner.for.end: 1150 // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP1]]) 1151 // CHECK2-NEXT: br label [[CANCEL_CONT:%.*]] 1152 // CHECK2: cancel.cont: 1153 // CHECK2-NEXT: ret void 1154 // CHECK2: cancel.exit: 1155 // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP1]]) 1156 // CHECK2-NEXT: br label [[CANCEL_CONT]] 1157 // 1158 // 1159 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..5 1160 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]]) #[[ATTR1]] { 1161 // CHECK2-NEXT: entry: 1162 // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 1163 // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 1164 // CHECK2-NEXT: [[DOTOMP_SECTIONS_LB_:%.*]] = alloca i32, align 4 1165 // CHECK2-NEXT: [[DOTOMP_SECTIONS_UB_:%.*]] = alloca i32, align 4 1166 // CHECK2-NEXT: [[DOTOMP_SECTIONS_ST_:%.*]] = alloca i32, align 4 1167 // CHECK2-NEXT: [[DOTOMP_SECTIONS_IL_:%.*]] = alloca i32, align 4 1168 // CHECK2-NEXT: [[DOTOMP_SECTIONS_IV_:%.*]] = alloca i32, align 4 1169 // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 1170 // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 1171 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_LB_]], align 4 1172 // CHECK2-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_UB_]], align 4 1173 // CHECK2-NEXT: store i32 1, i32* [[DOTOMP_SECTIONS_ST_]], align 4 1174 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_SECTIONS_IL_]], align 4 1175 // CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 1176 // CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4 1177 // CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB3]], i32 [[TMP1]], i32 34, i32* [[DOTOMP_SECTIONS_IL_]], i32* [[DOTOMP_SECTIONS_LB_]], i32* [[DOTOMP_SECTIONS_UB_]], i32* [[DOTOMP_SECTIONS_ST_]], i32 1, i32 1) 1178 // CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4 1179 // CHECK2-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP2]], 1 1180 // CHECK2-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP2]], i32 1 1181 // CHECK2-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_SECTIONS_UB_]], align 4 1182 // CHECK2-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_LB_]], align 4 1183 // CHECK2-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_SECTIONS_IV_]], align 4 1184 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 1185 // CHECK2: omp.inner.for.cond: 1186 // CHECK2-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 1187 // CHECK2-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_UB_]], align 4 1188 // CHECK2-NEXT: [[CMP:%.*]] = icmp sle i32 [[TMP6]], [[TMP7]] 1189 // CHECK2-NEXT: br i1 [[CMP]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 1190 // CHECK2: omp.inner.for.body: 1191 // CHECK2-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 1192 // CHECK2-NEXT: switch i32 [[TMP8]], label [[DOTOMP_SECTIONS_EXIT:%.*]] [ 1193 // CHECK2-NEXT: i32 0, label [[DOTOMP_SECTIONS_CASE:%.*]] 1194 // CHECK2-NEXT: i32 1, label [[DOTOMP_SECTIONS_CASE3:%.*]] 1195 // CHECK2-NEXT: ] 1196 // CHECK2: .omp.sections.case: 1197 // CHECK2-NEXT: [[TMP9:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3) 1198 // CHECK2-NEXT: [[TMP10:%.*]] = icmp ne i32 [[TMP9]], 0 1199 // CHECK2-NEXT: br i1 [[TMP10]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]] 1200 // CHECK2: .cancel.exit: 1201 // CHECK2-NEXT: br label [[CANCEL_EXIT:%.*]] 1202 // CHECK2: .cancel.continue: 1203 // CHECK2-NEXT: [[TMP11:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3) 1204 // CHECK2-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP11]], 0 1205 // CHECK2-NEXT: br i1 [[TMP12]], label [[DOTCANCEL_EXIT1:%.*]], label [[DOTCANCEL_CONTINUE2:%.*]] 1206 // CHECK2: .cancel.exit1: 1207 // CHECK2-NEXT: br label [[CANCEL_EXIT]] 1208 // CHECK2: .cancel.continue2: 1209 // CHECK2-NEXT: br label [[DOTOMP_SECTIONS_EXIT]] 1210 // CHECK2: .omp.sections.case3: 1211 // CHECK2-NEXT: [[TMP13:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP1]], i32 3) 1212 // CHECK2-NEXT: [[TMP14:%.*]] = icmp ne i32 [[TMP13]], 0 1213 // CHECK2-NEXT: br i1 [[TMP14]], label [[DOTCANCEL_EXIT4:%.*]], label [[DOTCANCEL_CONTINUE5:%.*]] 1214 // CHECK2: .cancel.exit4: 1215 // CHECK2-NEXT: br label [[CANCEL_EXIT]] 1216 // CHECK2: .cancel.continue5: 1217 // CHECK2-NEXT: br label [[DOTOMP_SECTIONS_EXIT]] 1218 // CHECK2: .omp.sections.exit: 1219 // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 1220 // CHECK2: omp.inner.for.inc: 1221 // CHECK2-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTOMP_SECTIONS_IV_]], align 4 1222 // CHECK2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP15]], 1 1223 // CHECK2-NEXT: store i32 [[INC]], i32* [[DOTOMP_SECTIONS_IV_]], align 4 1224 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] 1225 // CHECK2: omp.inner.for.end: 1226 // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP1]]) 1227 // CHECK2-NEXT: br label [[CANCEL_CONT:%.*]] 1228 // CHECK2: cancel.cont: 1229 // CHECK2-NEXT: ret void 1230 // CHECK2: cancel.exit: 1231 // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP1]]) 1232 // CHECK2-NEXT: br label [[CANCEL_CONT]] 1233 // 1234 // 1235 // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..6 1236 // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32* noundef nonnull align 4 dereferenceable(4) [[ARGC:%.*]]) #[[ATTR1]] { 1237 // CHECK2-NEXT: entry: 1238 // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 1239 // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 1240 // CHECK2-NEXT: [[ARGC_ADDR:%.*]] = alloca i32*, align 8 1241 // CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 1242 // CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4 1243 // CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 1244 // CHECK2-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4 1245 // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 1246 // CHECK2-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 1247 // CHECK2-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 1248 // CHECK2-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 1249 // CHECK2-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 1250 // CHECK2-NEXT: [[I3:%.*]] = alloca i32, align 4 1251 // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 1252 // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 1253 // CHECK2-NEXT: store i32* [[ARGC]], i32** [[ARGC_ADDR]], align 8 1254 // CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[ARGC_ADDR]], align 8 1255 // CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4 1256 // CHECK2-NEXT: store i32 [[TMP1]], i32* [[DOTCAPTURE_EXPR_]], align 4 1257 // CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 1258 // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP2]], 0 1259 // CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1 1260 // CHECK2-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1 1261 // CHECK2-NEXT: store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4 1262 // CHECK2-NEXT: store i32 0, i32* [[I]], align 4 1263 // CHECK2-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 1264 // CHECK2-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP3]] 1265 // CHECK2-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]] 1266 // CHECK2: omp.precond.then: 1267 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4 1268 // CHECK2-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4 1269 // CHECK2-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_UB]], align 4 1270 // CHECK2-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4 1271 // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 1272 // CHECK2-NEXT: [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 1273 // CHECK2-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4 1274 // CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB5]], i32 [[TMP6]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1) 1275 // CHECK2-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 1276 // CHECK2-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4 1277 // CHECK2-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[TMP7]], [[TMP8]] 1278 // CHECK2-NEXT: br i1 [[CMP4]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 1279 // CHECK2: cond.true: 1280 // CHECK2-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4 1281 // CHECK2-NEXT: br label [[COND_END:%.*]] 1282 // CHECK2: cond.false: 1283 // CHECK2-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 1284 // CHECK2-NEXT: br label [[COND_END]] 1285 // CHECK2: cond.end: 1286 // CHECK2-NEXT: [[COND:%.*]] = phi i32 [ [[TMP9]], [[COND_TRUE]] ], [ [[TMP10]], [[COND_FALSE]] ] 1287 // CHECK2-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4 1288 // CHECK2-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4 1289 // CHECK2-NEXT: store i32 [[TMP11]], i32* [[DOTOMP_IV]], align 4 1290 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 1291 // CHECK2: omp.inner.for.cond: 1292 // CHECK2-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1293 // CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 1294 // CHECK2-NEXT: [[CMP5:%.*]] = icmp sle i32 [[TMP12]], [[TMP13]] 1295 // CHECK2-NEXT: br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 1296 // CHECK2: omp.inner.for.body: 1297 // CHECK2-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1298 // CHECK2-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP14]], 1 1299 // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]] 1300 // CHECK2-NEXT: store i32 [[ADD]], i32* [[I3]], align 4 1301 // CHECK2-NEXT: [[TMP15:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 1302 // CHECK2-NEXT: [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4 1303 // CHECK2-NEXT: [[TMP17:%.*]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @[[GLOB1]], i32 [[TMP16]], i32 2) 1304 // CHECK2-NEXT: [[TMP18:%.*]] = icmp ne i32 [[TMP17]], 0 1305 // CHECK2-NEXT: br i1 [[TMP18]], label [[DOTCANCEL_EXIT:%.*]], label [[DOTCANCEL_CONTINUE:%.*]] 1306 // CHECK2: .cancel.exit: 1307 // CHECK2-NEXT: br label [[CANCEL_EXIT:%.*]] 1308 // CHECK2: .cancel.continue: 1309 // CHECK2-NEXT: [[TMP19:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 1310 // CHECK2-NEXT: [[TMP20:%.*]] = load i32, i32* [[TMP19]], align 4 1311 // CHECK2-NEXT: [[TMP21:%.*]] = call i32 @__kmpc_cancel(%struct.ident_t* @[[GLOB1]], i32 [[TMP20]], i32 2) 1312 // CHECK2-NEXT: [[TMP22:%.*]] = icmp ne i32 [[TMP21]], 0 1313 // CHECK2-NEXT: br i1 [[TMP22]], label [[DOTCANCEL_EXIT6:%.*]], label [[DOTCANCEL_CONTINUE7:%.*]] 1314 // CHECK2: .cancel.exit6: 1315 // CHECK2-NEXT: br label [[CANCEL_EXIT]] 1316 // CHECK2: .cancel.continue7: 1317 // CHECK2-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 1318 // CHECK2: omp.body.continue: 1319 // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 1320 // CHECK2: omp.inner.for.inc: 1321 // CHECK2-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1322 // CHECK2-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP23]], 1 1323 // CHECK2-NEXT: store i32 [[ADD8]], i32* [[DOTOMP_IV]], align 4 1324 // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] 1325 // CHECK2: omp.inner.for.end: 1326 // CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 1327 // CHECK2: omp.loop.exit: 1328 // CHECK2-NEXT: [[TMP24:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 1329 // CHECK2-NEXT: [[TMP25:%.*]] = load i32, i32* [[TMP24]], align 4 1330 // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB5]], i32 [[TMP25]]) 1331 // CHECK2-NEXT: br label [[OMP_PRECOND_END]] 1332 // CHECK2: cancel.exit: 1333 // CHECK2-NEXT: [[TMP26:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 1334 // CHECK2-NEXT: [[TMP27:%.*]] = load i32, i32* [[TMP26]], align 4 1335 // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB5]], i32 [[TMP27]]) 1336 // CHECK2-NEXT: br label [[CANCEL_CONT:%.*]] 1337 // CHECK2: omp.precond.end: 1338 // CHECK2-NEXT: br label [[CANCEL_CONT]] 1339 // CHECK2: cancel.cont: 1340 // CHECK2-NEXT: ret void 1341 // 1342