brintos

brintos / llvm-project-archived public Read only

0
0
Text · 172.0 KiB · 7b2048b Raw
2619 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs2//  RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-unknown-linux-gnu -fopenmp -DNORM \3//RUN:  -emit-llvm -o - %s | FileCheck %s --check-prefix NORM4 5//RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-unknown-linux-gnu -fopenmp -DCOMP \6//RUN:  -emit-llvm -o - %s | FileCheck %s --check-prefix COMP7 8// Prefer compound operators since that is what the spec seems to say.9//  RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-unknown-linux-gnu -fopenmp -DNORM -DCOMP \10//RUN:  -emit-llvm -o - %s | FileCheck %s --check-prefix COMP11 12//RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-unknown-linux-gnu -fopenmp-simd -DNORM \13//RUN:  -emit-llvm -o - %s | FileCheck %s --check-prefix SIMD-ONLY14 15//RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-unknown-linux-gnu -fopenmp-simd -DCOMP \16//RUN:  -emit-llvm -o - %s | FileCheck %s --check-prefix SIMD-ONLY17 18//RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-unknown-linux-gnu -fopenmp-simd -DNORM -DCOMP \19//RUN:  -emit-llvm -o - %s | FileCheck %s --check-prefix SIMD-ONLY20 21 22struct Point {23  int x = 0;24  int y = 0;25#if NORM26  Point operator+(Point const &other) const;27  Point operator-(Point const &other) const;28  Point operator*(Point const &other) const;29  Point operator&(Point const &other) const;30  Point operator|(Point const &other) const;31  Point operator^(Point const &other) const;32#endif33  Point operator&&(Point const &other) const;34  Point operator||(Point const &other) const;35  Point &operator=(Point const &other);36#if COMP37  Point &operator+=(Point const &other);38  Point &operator*=(Point const &other);39  Point &operator&=(Point const &other);40  Point &operator|=(Point const &other);41  Point &operator^=(Point const &other);42#endif43};44 45void work(Point &P, int N, Point const *Points);46 47void foo(int N, Point const *Points) {48  Point Red;49  #pragma omp parallel for reduction(+: Red)50  for (unsigned I = 0; I < N; ++I)51    work(Red, I, Points);52 53  #pragma omp parallel for reduction(-: Red)54  for (unsigned I = 0; I < N; ++I)55    work(Red, I, Points);56 57  #pragma omp parallel for reduction(*: Red)58  for (unsigned I = 0; I < N; ++I)59    work(Red, I, Points);60 61  #pragma omp parallel for reduction(&: Red)62  for (unsigned I = 0; I < N; ++I)63    work(Red, I, Points);64 65  #pragma omp parallel for reduction(|: Red)66  for (unsigned I = 0; I < N; ++I)67    work(Red, I, Points);68 69  #pragma omp parallel for reduction(^: Red)70  for (unsigned I = 0; I < N; ++I)71    work(Red, I, Points);72 73  #pragma omp parallel for reduction(&&: Red)74  for (unsigned I = 0; I < N; ++I)75    work(Red, I, Points);76 77  #pragma omp parallel for reduction(||: Red)78  for (unsigned I = 0; I < N; ++I)79    work(Red, I, Points);80}81// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point82// NORM-SAME: (i32 [[N:%.*]], ptr [[POINTS:%.*]]) #[[ATTR0:[0-9]+]] {83// NORM-NEXT:  entry:84// NORM-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 485// NORM-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 886// NORM-NEXT:    [[RED:%.*]] = alloca [[STRUCT_POINT:%.*]], align 487// NORM-NEXT:    store i32 [[N]], ptr [[N_ADDR]], align 488// NORM-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 889// NORM-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED]]) #[[ATTR2:[0-9]+]]90// NORM-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3:[0-9]+]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])91// NORM-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.1, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])92// NORM-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.2, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])93// NORM-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.3, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])94// NORM-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.4, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])95// NORM-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.5, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])96// NORM-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.6, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])97// NORM-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.7, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])98// NORM-NEXT:    ret void99//100//101// NORM-LABEL: define {{[^@]+}}@_ZN5PointC1Ev102// NORM-SAME: (ptr nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 {103// NORM-NEXT:  entry:104// NORM-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 8105// NORM-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 8106// NORM-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8107// NORM-NEXT:    call void @_ZN5PointC2Ev(ptr nonnull align 4 dereferenceable(8) [[THIS1]]) #[[ATTR2]]108// NORM-NEXT:    ret void109//110//111// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined112// NORM-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1:[0-9]+]] {113// NORM-NEXT:  entry:114// NORM-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8115// NORM-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8116// NORM-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 8117// NORM-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 8118// NORM-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 8119// NORM-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4120// NORM-NEXT:    [[TMP:%.*]] = alloca i32, align 4121// NORM-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4122// NORM-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4123// NORM-NEXT:    [[I:%.*]] = alloca i32, align 4124// NORM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4125// NORM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4126// NORM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4127// NORM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4128// NORM-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4129// NORM-NEXT:    [[I4:%.*]] = alloca i32, align 4130// NORM-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8131// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4132// NORM-NEXT:    [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4133// NORM-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8134// NORM-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8135// NORM-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 8136// NORM-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 8137// NORM-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8138// NORM-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8139// NORM-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8140// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8141// NORM-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4142// NORM-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4143// NORM-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4144// NORM-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 0145// NORM-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 1146// NORM-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 1147// NORM-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4148// NORM-NEXT:    store i32 0, ptr [[I]], align 4149// NORM-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4150// NORM-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]151// NORM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]152// NORM:       omp.precond.then:153// NORM-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4154// NORM-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4155// NORM-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4156// NORM-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4157// NORM-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4158// NORM-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]159// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8160// NORM-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4161// NORM-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)162// NORM-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4163// NORM-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4164// NORM-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]165// NORM-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]166// NORM:       cond.true:167// NORM-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4168// NORM-NEXT:    br label [[COND_END:%.*]]169// NORM:       cond.false:170// NORM-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4171// NORM-NEXT:    br label [[COND_END]]172// NORM:       cond.end:173// NORM-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]174// NORM-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4175// NORM-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4176// NORM-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4177// NORM-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]178// NORM:       omp.inner.for.cond:179// NORM-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4180// NORM-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4181// NORM-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 1182// NORM-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]183// NORM-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]184// NORM:       omp.inner.for.body:185// NORM-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4186// NORM-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 1187// NORM-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]188// NORM-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 4189// NORM-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 4190// NORM-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8191// NORM-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])192// NORM-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]193// NORM:       omp.body.continue:194// NORM-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]195// NORM:       omp.inner.for.inc:196// NORM-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4197// NORM-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 1198// NORM-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4199// NORM-NEXT:    br label [[OMP_INNER_FOR_COND]]200// NORM:       omp.inner.for.end:201// NORM-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]202// NORM:       omp.loop.exit:203// NORM-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8204// NORM-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4205// NORM-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])206// NORM-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0207// NORM-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 8208// NORM-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8209// NORM-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 4210// NORM-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2:[0-9]+]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)211// NORM-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [212// NORM-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]213// NORM-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]214// NORM-NEXT:    ]215// NORM:       .omp.reduction.case1:216// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointplERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])217// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 4218// NORM-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])219// NORM-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)220// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]221// NORM:       .omp.reduction.case2:222// NORM-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8223// NORM-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4224// NORM-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)225// NORM-NEXT:    [[CALL11:%.*]] = call i64 @_ZNK5PointplERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])226// NORM-NEXT:    store i64 [[CALL11]], ptr [[REF_TMP10]], align 4227// NORM-NEXT:    [[CALL12:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP10]])228// NORM-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)229// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]230// NORM:       .omp.reduction.default:231// NORM-NEXT:    br label [[OMP_PRECOND_END]]232// NORM:       omp.precond.end:233// NORM-NEXT:    ret void234//235//236// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.omp.reduction.reduction_func237// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {238// NORM-NEXT:  entry:239// NORM-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8240// NORM-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8241// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4242// NORM-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8243// NORM-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8244// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8245// NORM-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8246// NORM-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0247// NORM-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8248// NORM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0249// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8250// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointplERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])251// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 4252// NORM-NEXT:    [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])253// NORM-NEXT:    ret void254//255//256// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.1257// NORM-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {258// NORM-NEXT:  entry:259// NORM-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8260// NORM-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8261// NORM-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 8262// NORM-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 8263// NORM-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 8264// NORM-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4265// NORM-NEXT:    [[TMP:%.*]] = alloca i32, align 4266// NORM-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4267// NORM-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4268// NORM-NEXT:    [[I:%.*]] = alloca i32, align 4269// NORM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4270// NORM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4271// NORM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4272// NORM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4273// NORM-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4274// NORM-NEXT:    [[I4:%.*]] = alloca i32, align 4275// NORM-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8276// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4277// NORM-NEXT:    [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4278// NORM-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8279// NORM-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8280// NORM-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 8281// NORM-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 8282// NORM-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8283// NORM-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8284// NORM-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8285// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8286// NORM-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4287// NORM-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4288// NORM-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4289// NORM-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 0290// NORM-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 1291// NORM-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 1292// NORM-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4293// NORM-NEXT:    store i32 0, ptr [[I]], align 4294// NORM-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4295// NORM-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]296// NORM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]297// NORM:       omp.precond.then:298// NORM-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4299// NORM-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4300// NORM-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4301// NORM-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4302// NORM-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4303// NORM-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]304// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8305// NORM-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4306// NORM-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)307// NORM-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4308// NORM-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4309// NORM-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]310// NORM-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]311// NORM:       cond.true:312// NORM-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4313// NORM-NEXT:    br label [[COND_END:%.*]]314// NORM:       cond.false:315// NORM-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4316// NORM-NEXT:    br label [[COND_END]]317// NORM:       cond.end:318// NORM-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]319// NORM-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4320// NORM-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4321// NORM-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4322// NORM-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]323// NORM:       omp.inner.for.cond:324// NORM-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4325// NORM-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4326// NORM-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 1327// NORM-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]328// NORM-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]329// NORM:       omp.inner.for.body:330// NORM-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4331// NORM-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 1332// NORM-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]333// NORM-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 4334// NORM-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 4335// NORM-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8336// NORM-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])337// NORM-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]338// NORM:       omp.body.continue:339// NORM-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]340// NORM:       omp.inner.for.inc:341// NORM-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4342// NORM-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 1343// NORM-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4344// NORM-NEXT:    br label [[OMP_INNER_FOR_COND]]345// NORM:       omp.inner.for.end:346// NORM-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]347// NORM:       omp.loop.exit:348// NORM-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8349// NORM-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4350// NORM-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])351// NORM-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0352// NORM-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 8353// NORM-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8354// NORM-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 4355// NORM-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.1.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)356// NORM-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [357// NORM-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]358// NORM-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]359// NORM-NEXT:    ]360// NORM:       .omp.reduction.case1:361// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointplERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])362// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 4363// NORM-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])364// NORM-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)365// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]366// NORM:       .omp.reduction.case2:367// NORM-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8368// NORM-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4369// NORM-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)370// NORM-NEXT:    [[CALL11:%.*]] = call i64 @_ZNK5PointplERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])371// NORM-NEXT:    store i64 [[CALL11]], ptr [[REF_TMP10]], align 4372// NORM-NEXT:    [[CALL12:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP10]])373// NORM-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)374// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]375// NORM:       .omp.reduction.default:376// NORM-NEXT:    br label [[OMP_PRECOND_END]]377// NORM:       omp.precond.end:378// NORM-NEXT:    ret void379//380//381// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.1.omp.reduction.reduction_func382// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {383// NORM-NEXT:  entry:384// NORM-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8385// NORM-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8386// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4387// NORM-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8388// NORM-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8389// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8390// NORM-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8391// NORM-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0392// NORM-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8393// NORM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0394// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8395// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointplERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])396// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 4397// NORM-NEXT:    [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])398// NORM-NEXT:    ret void399//400//401// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.2402// NORM-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {403// NORM-NEXT:  entry:404// NORM-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8405// NORM-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8406// NORM-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 8407// NORM-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 8408// NORM-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 8409// NORM-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4410// NORM-NEXT:    [[TMP:%.*]] = alloca i32, align 4411// NORM-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4412// NORM-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4413// NORM-NEXT:    [[I:%.*]] = alloca i32, align 4414// NORM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4415// NORM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4416// NORM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4417// NORM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4418// NORM-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4419// NORM-NEXT:    [[I4:%.*]] = alloca i32, align 4420// NORM-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8421// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4422// NORM-NEXT:    [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4423// NORM-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8424// NORM-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8425// NORM-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 8426// NORM-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 8427// NORM-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8428// NORM-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8429// NORM-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8430// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8431// NORM-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4432// NORM-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4433// NORM-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4434// NORM-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 0435// NORM-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 1436// NORM-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 1437// NORM-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4438// NORM-NEXT:    store i32 0, ptr [[I]], align 4439// NORM-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4440// NORM-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]441// NORM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]442// NORM:       omp.precond.then:443// NORM-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4444// NORM-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4445// NORM-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4446// NORM-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4447// NORM-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4448// NORM-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]449// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8450// NORM-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4451// NORM-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)452// NORM-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4453// NORM-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4454// NORM-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]455// NORM-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]456// NORM:       cond.true:457// NORM-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4458// NORM-NEXT:    br label [[COND_END:%.*]]459// NORM:       cond.false:460// NORM-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4461// NORM-NEXT:    br label [[COND_END]]462// NORM:       cond.end:463// NORM-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]464// NORM-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4465// NORM-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4466// NORM-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4467// NORM-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]468// NORM:       omp.inner.for.cond:469// NORM-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4470// NORM-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4471// NORM-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 1472// NORM-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]473// NORM-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]474// NORM:       omp.inner.for.body:475// NORM-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4476// NORM-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 1477// NORM-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]478// NORM-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 4479// NORM-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 4480// NORM-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8481// NORM-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])482// NORM-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]483// NORM:       omp.body.continue:484// NORM-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]485// NORM:       omp.inner.for.inc:486// NORM-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4487// NORM-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 1488// NORM-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4489// NORM-NEXT:    br label [[OMP_INNER_FOR_COND]]490// NORM:       omp.inner.for.end:491// NORM-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]492// NORM:       omp.loop.exit:493// NORM-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8494// NORM-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4495// NORM-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])496// NORM-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0497// NORM-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 8498// NORM-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8499// NORM-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 4500// NORM-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.2.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)501// NORM-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [502// NORM-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]503// NORM-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]504// NORM-NEXT:    ]505// NORM:       .omp.reduction.case1:506// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointmlERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])507// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 4508// NORM-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])509// NORM-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)510// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]511// NORM:       .omp.reduction.case2:512// NORM-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8513// NORM-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4514// NORM-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)515// NORM-NEXT:    [[CALL11:%.*]] = call i64 @_ZNK5PointmlERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])516// NORM-NEXT:    store i64 [[CALL11]], ptr [[REF_TMP10]], align 4517// NORM-NEXT:    [[CALL12:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP10]])518// NORM-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)519// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]520// NORM:       .omp.reduction.default:521// NORM-NEXT:    br label [[OMP_PRECOND_END]]522// NORM:       omp.precond.end:523// NORM-NEXT:    ret void524//525//526// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.2.omp.reduction.reduction_func527// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {528// NORM-NEXT:  entry:529// NORM-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8530// NORM-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8531// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4532// NORM-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8533// NORM-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8534// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8535// NORM-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8536// NORM-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0537// NORM-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8538// NORM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0539// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8540// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointmlERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])541// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 4542// NORM-NEXT:    [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])543// NORM-NEXT:    ret void544//545//546// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.3547// NORM-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {548// NORM-NEXT:  entry:549// NORM-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8550// NORM-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8551// NORM-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 8552// NORM-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 8553// NORM-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 8554// NORM-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4555// NORM-NEXT:    [[TMP:%.*]] = alloca i32, align 4556// NORM-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4557// NORM-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4558// NORM-NEXT:    [[I:%.*]] = alloca i32, align 4559// NORM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4560// NORM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4561// NORM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4562// NORM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4563// NORM-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4564// NORM-NEXT:    [[I4:%.*]] = alloca i32, align 4565// NORM-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8566// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4567// NORM-NEXT:    [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4568// NORM-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8569// NORM-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8570// NORM-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 8571// NORM-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 8572// NORM-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8573// NORM-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8574// NORM-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8575// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8576// NORM-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4577// NORM-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4578// NORM-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4579// NORM-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 0580// NORM-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 1581// NORM-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 1582// NORM-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4583// NORM-NEXT:    store i32 0, ptr [[I]], align 4584// NORM-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4585// NORM-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]586// NORM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]587// NORM:       omp.precond.then:588// NORM-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4589// NORM-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4590// NORM-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4591// NORM-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4592// NORM-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4593// NORM-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]594// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8595// NORM-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4596// NORM-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)597// NORM-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4598// NORM-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4599// NORM-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]600// NORM-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]601// NORM:       cond.true:602// NORM-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4603// NORM-NEXT:    br label [[COND_END:%.*]]604// NORM:       cond.false:605// NORM-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4606// NORM-NEXT:    br label [[COND_END]]607// NORM:       cond.end:608// NORM-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]609// NORM-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4610// NORM-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4611// NORM-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4612// NORM-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]613// NORM:       omp.inner.for.cond:614// NORM-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4615// NORM-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4616// NORM-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 1617// NORM-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]618// NORM-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]619// NORM:       omp.inner.for.body:620// NORM-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4621// NORM-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 1622// NORM-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]623// NORM-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 4624// NORM-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 4625// NORM-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8626// NORM-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])627// NORM-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]628// NORM:       omp.body.continue:629// NORM-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]630// NORM:       omp.inner.for.inc:631// NORM-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4632// NORM-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 1633// NORM-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4634// NORM-NEXT:    br label [[OMP_INNER_FOR_COND]]635// NORM:       omp.inner.for.end:636// NORM-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]637// NORM:       omp.loop.exit:638// NORM-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8639// NORM-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4640// NORM-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])641// NORM-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0642// NORM-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 8643// NORM-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8644// NORM-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 4645// NORM-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.3.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)646// NORM-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [647// NORM-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]648// NORM-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]649// NORM-NEXT:    ]650// NORM:       .omp.reduction.case1:651// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointanERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])652// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 4653// NORM-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])654// NORM-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)655// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]656// NORM:       .omp.reduction.case2:657// NORM-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8658// NORM-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4659// NORM-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)660// NORM-NEXT:    [[CALL11:%.*]] = call i64 @_ZNK5PointanERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])661// NORM-NEXT:    store i64 [[CALL11]], ptr [[REF_TMP10]], align 4662// NORM-NEXT:    [[CALL12:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP10]])663// NORM-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)664// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]665// NORM:       .omp.reduction.default:666// NORM-NEXT:    br label [[OMP_PRECOND_END]]667// NORM:       omp.precond.end:668// NORM-NEXT:    ret void669//670//671// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.3.omp.reduction.reduction_func672// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {673// NORM-NEXT:  entry:674// NORM-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8675// NORM-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8676// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4677// NORM-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8678// NORM-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8679// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8680// NORM-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8681// NORM-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0682// NORM-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8683// NORM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0684// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8685// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointanERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])686// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 4687// NORM-NEXT:    [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])688// NORM-NEXT:    ret void689//690//691// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.4692// NORM-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {693// NORM-NEXT:  entry:694// NORM-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8695// NORM-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8696// NORM-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 8697// NORM-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 8698// NORM-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 8699// NORM-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4700// NORM-NEXT:    [[TMP:%.*]] = alloca i32, align 4701// NORM-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4702// NORM-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4703// NORM-NEXT:    [[I:%.*]] = alloca i32, align 4704// NORM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4705// NORM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4706// NORM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4707// NORM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4708// NORM-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4709// NORM-NEXT:    [[I4:%.*]] = alloca i32, align 4710// NORM-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8711// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4712// NORM-NEXT:    [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4713// NORM-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8714// NORM-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8715// NORM-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 8716// NORM-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 8717// NORM-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8718// NORM-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8719// NORM-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8720// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8721// NORM-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4722// NORM-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4723// NORM-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4724// NORM-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 0725// NORM-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 1726// NORM-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 1727// NORM-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4728// NORM-NEXT:    store i32 0, ptr [[I]], align 4729// NORM-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4730// NORM-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]731// NORM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]732// NORM:       omp.precond.then:733// NORM-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4734// NORM-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4735// NORM-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4736// NORM-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4737// NORM-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4738// NORM-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]739// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8740// NORM-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4741// NORM-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)742// NORM-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4743// NORM-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4744// NORM-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]745// NORM-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]746// NORM:       cond.true:747// NORM-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4748// NORM-NEXT:    br label [[COND_END:%.*]]749// NORM:       cond.false:750// NORM-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4751// NORM-NEXT:    br label [[COND_END]]752// NORM:       cond.end:753// NORM-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]754// NORM-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4755// NORM-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4756// NORM-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4757// NORM-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]758// NORM:       omp.inner.for.cond:759// NORM-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4760// NORM-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4761// NORM-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 1762// NORM-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]763// NORM-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]764// NORM:       omp.inner.for.body:765// NORM-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4766// NORM-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 1767// NORM-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]768// NORM-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 4769// NORM-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 4770// NORM-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8771// NORM-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])772// NORM-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]773// NORM:       omp.body.continue:774// NORM-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]775// NORM:       omp.inner.for.inc:776// NORM-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4777// NORM-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 1778// NORM-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4779// NORM-NEXT:    br label [[OMP_INNER_FOR_COND]]780// NORM:       omp.inner.for.end:781// NORM-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]782// NORM:       omp.loop.exit:783// NORM-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8784// NORM-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4785// NORM-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])786// NORM-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0787// NORM-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 8788// NORM-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8789// NORM-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 4790// NORM-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.4.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)791// NORM-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [792// NORM-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]793// NORM-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]794// NORM-NEXT:    ]795// NORM:       .omp.reduction.case1:796// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointorERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])797// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 4798// NORM-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])799// NORM-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)800// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]801// NORM:       .omp.reduction.case2:802// NORM-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8803// NORM-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4804// NORM-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)805// NORM-NEXT:    [[CALL11:%.*]] = call i64 @_ZNK5PointorERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])806// NORM-NEXT:    store i64 [[CALL11]], ptr [[REF_TMP10]], align 4807// NORM-NEXT:    [[CALL12:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP10]])808// NORM-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)809// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]810// NORM:       .omp.reduction.default:811// NORM-NEXT:    br label [[OMP_PRECOND_END]]812// NORM:       omp.precond.end:813// NORM-NEXT:    ret void814//815//816// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.4.omp.reduction.reduction_func817// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {818// NORM-NEXT:  entry:819// NORM-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8820// NORM-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8821// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4822// NORM-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8823// NORM-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8824// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8825// NORM-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8826// NORM-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0827// NORM-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8828// NORM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0829// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8830// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointorERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])831// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 4832// NORM-NEXT:    [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])833// NORM-NEXT:    ret void834//835//836// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.5837// NORM-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {838// NORM-NEXT:  entry:839// NORM-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8840// NORM-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8841// NORM-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 8842// NORM-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 8843// NORM-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 8844// NORM-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4845// NORM-NEXT:    [[TMP:%.*]] = alloca i32, align 4846// NORM-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4847// NORM-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4848// NORM-NEXT:    [[I:%.*]] = alloca i32, align 4849// NORM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4850// NORM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4851// NORM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4852// NORM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4853// NORM-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4854// NORM-NEXT:    [[I4:%.*]] = alloca i32, align 4855// NORM-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8856// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4857// NORM-NEXT:    [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4858// NORM-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8859// NORM-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8860// NORM-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 8861// NORM-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 8862// NORM-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8863// NORM-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8864// NORM-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8865// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8866// NORM-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4867// NORM-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4868// NORM-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4869// NORM-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 0870// NORM-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 1871// NORM-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 1872// NORM-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4873// NORM-NEXT:    store i32 0, ptr [[I]], align 4874// NORM-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4875// NORM-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]876// NORM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]877// NORM:       omp.precond.then:878// NORM-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4879// NORM-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4880// NORM-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4881// NORM-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4882// NORM-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4883// NORM-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]884// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8885// NORM-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4886// NORM-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)887// NORM-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4888// NORM-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4889// NORM-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]890// NORM-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]891// NORM:       cond.true:892// NORM-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4893// NORM-NEXT:    br label [[COND_END:%.*]]894// NORM:       cond.false:895// NORM-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4896// NORM-NEXT:    br label [[COND_END]]897// NORM:       cond.end:898// NORM-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]899// NORM-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4900// NORM-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4901// NORM-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4902// NORM-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]903// NORM:       omp.inner.for.cond:904// NORM-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4905// NORM-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4906// NORM-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 1907// NORM-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]908// NORM-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]909// NORM:       omp.inner.for.body:910// NORM-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4911// NORM-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 1912// NORM-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]913// NORM-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 4914// NORM-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 4915// NORM-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8916// NORM-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])917// NORM-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]918// NORM:       omp.body.continue:919// NORM-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]920// NORM:       omp.inner.for.inc:921// NORM-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4922// NORM-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 1923// NORM-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4924// NORM-NEXT:    br label [[OMP_INNER_FOR_COND]]925// NORM:       omp.inner.for.end:926// NORM-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]927// NORM:       omp.loop.exit:928// NORM-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8929// NORM-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4930// NORM-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])931// NORM-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0932// NORM-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 8933// NORM-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8934// NORM-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 4935// NORM-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.5.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)936// NORM-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [937// NORM-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]938// NORM-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]939// NORM-NEXT:    ]940// NORM:       .omp.reduction.case1:941// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointeoERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])942// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 4943// NORM-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])944// NORM-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)945// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]946// NORM:       .omp.reduction.case2:947// NORM-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8948// NORM-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4949// NORM-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)950// NORM-NEXT:    [[CALL11:%.*]] = call i64 @_ZNK5PointeoERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])951// NORM-NEXT:    store i64 [[CALL11]], ptr [[REF_TMP10]], align 4952// NORM-NEXT:    [[CALL12:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP10]])953// NORM-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)954// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]955// NORM:       .omp.reduction.default:956// NORM-NEXT:    br label [[OMP_PRECOND_END]]957// NORM:       omp.precond.end:958// NORM-NEXT:    ret void959//960//961// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.5.omp.reduction.reduction_func962// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {963// NORM-NEXT:  entry:964// NORM-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 8965// NORM-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 8966// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4967// NORM-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 8968// NORM-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 8969// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8970// NORM-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 8971// NORM-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0972// NORM-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8973// NORM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0974// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8975// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointeoERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])976// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 4977// NORM-NEXT:    [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])978// NORM-NEXT:    ret void979//980//981// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.6982// NORM-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {983// NORM-NEXT:  entry:984// NORM-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8985// NORM-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8986// NORM-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 8987// NORM-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 8988// NORM-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 8989// NORM-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 4990// NORM-NEXT:    [[TMP:%.*]] = alloca i32, align 4991// NORM-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4992// NORM-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4993// NORM-NEXT:    [[I:%.*]] = alloca i32, align 4994// NORM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4995// NORM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4996// NORM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4997// NORM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4998// NORM-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4999// NORM-NEXT:    [[I4:%.*]] = alloca i32, align 41000// NORM-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 81001// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 41002// NORM-NEXT:    [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 41003// NORM-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81004// NORM-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81005// NORM-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 81006// NORM-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 81007// NORM-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 81008// NORM-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 81009// NORM-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 81010// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 81011// NORM-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 41012// NORM-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 41013// NORM-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41014// NORM-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 01015// NORM-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 11016// NORM-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 11017// NORM-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41018// NORM-NEXT:    store i32 0, ptr [[I]], align 41019// NORM-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41020// NORM-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]1021// NORM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]1022// NORM:       omp.precond.then:1023// NORM-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 41024// NORM-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41025// NORM-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 41026// NORM-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41027// NORM-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41028// NORM-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]1029// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81030// NORM-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41031// NORM-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1032// NORM-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41033// NORM-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41034// NORM-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]1035// NORM-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1036// NORM:       cond.true:1037// NORM-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41038// NORM-NEXT:    br label [[COND_END:%.*]]1039// NORM:       cond.false:1040// NORM-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41041// NORM-NEXT:    br label [[COND_END]]1042// NORM:       cond.end:1043// NORM-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]1044// NORM-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 41045// NORM-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41046// NORM-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 41047// NORM-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1048// NORM:       omp.inner.for.cond:1049// NORM-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41050// NORM-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41051// NORM-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 11052// NORM-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]1053// NORM-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1054// NORM:       omp.inner.for.body:1055// NORM-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41056// NORM-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 11057// NORM-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]1058// NORM-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 41059// NORM-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 41060// NORM-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 81061// NORM-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])1062// NORM-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]1063// NORM:       omp.body.continue:1064// NORM-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1065// NORM:       omp.inner.for.inc:1066// NORM-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41067// NORM-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 11068// NORM-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 41069// NORM-NEXT:    br label [[OMP_INNER_FOR_COND]]1070// NORM:       omp.inner.for.end:1071// NORM-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1072// NORM:       omp.loop.exit:1073// NORM-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81074// NORM-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41075// NORM-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])1076// NORM-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01077// NORM-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 81078// NORM-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81079// NORM-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 41080// NORM-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.6.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1081// NORM-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1082// NORM-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1083// NORM-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1084// NORM-NEXT:    ]1085// NORM:       .omp.reduction.case1:1086// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointaaERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1087// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 41088// NORM-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])1089// NORM-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)1090// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1091// NORM:       .omp.reduction.case2:1092// NORM-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81093// NORM-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 41094// NORM-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1095// NORM-NEXT:    [[CALL11:%.*]] = call i64 @_ZNK5PointaaERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1096// NORM-NEXT:    store i64 [[CALL11]], ptr [[REF_TMP10]], align 41097// NORM-NEXT:    [[CALL12:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP10]])1098// NORM-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1099// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1100// NORM:       .omp.reduction.default:1101// NORM-NEXT:    br label [[OMP_PRECOND_END]]1102// NORM:       omp.precond.end:1103// NORM-NEXT:    ret void1104//1105//1106// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.6.omp.reduction.reduction_func1107// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {1108// NORM-NEXT:  entry:1109// NORM-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 81110// NORM-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 81111// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 41112// NORM-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 81113// NORM-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 81114// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81115// NORM-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81116// NORM-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 01117// NORM-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81118// NORM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 01119// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81120// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointaaERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])1121// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 41122// NORM-NEXT:    [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])1123// NORM-NEXT:    ret void1124//1125//1126// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.71127// NORM-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {1128// NORM-NEXT:  entry:1129// NORM-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81130// NORM-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81131// NORM-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 81132// NORM-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 81133// NORM-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 81134// NORM-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 41135// NORM-NEXT:    [[TMP:%.*]] = alloca i32, align 41136// NORM-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41137// NORM-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41138// NORM-NEXT:    [[I:%.*]] = alloca i32, align 41139// NORM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 41140// NORM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 41141// NORM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41142// NORM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41143// NORM-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 41144// NORM-NEXT:    [[I4:%.*]] = alloca i32, align 41145// NORM-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 81146// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 41147// NORM-NEXT:    [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 41148// NORM-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81149// NORM-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81150// NORM-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 81151// NORM-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 81152// NORM-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 81153// NORM-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 81154// NORM-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 81155// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 81156// NORM-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 41157// NORM-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 41158// NORM-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41159// NORM-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 01160// NORM-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 11161// NORM-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 11162// NORM-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41163// NORM-NEXT:    store i32 0, ptr [[I]], align 41164// NORM-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41165// NORM-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]1166// NORM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]1167// NORM:       omp.precond.then:1168// NORM-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 41169// NORM-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41170// NORM-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 41171// NORM-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41172// NORM-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41173// NORM-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]1174// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81175// NORM-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41176// NORM-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1177// NORM-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41178// NORM-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41179// NORM-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]1180// NORM-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1181// NORM:       cond.true:1182// NORM-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41183// NORM-NEXT:    br label [[COND_END:%.*]]1184// NORM:       cond.false:1185// NORM-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41186// NORM-NEXT:    br label [[COND_END]]1187// NORM:       cond.end:1188// NORM-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]1189// NORM-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 41190// NORM-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41191// NORM-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 41192// NORM-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1193// NORM:       omp.inner.for.cond:1194// NORM-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41195// NORM-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41196// NORM-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 11197// NORM-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]1198// NORM-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1199// NORM:       omp.inner.for.body:1200// NORM-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41201// NORM-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 11202// NORM-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]1203// NORM-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 41204// NORM-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 41205// NORM-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 81206// NORM-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])1207// NORM-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]1208// NORM:       omp.body.continue:1209// NORM-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1210// NORM:       omp.inner.for.inc:1211// NORM-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41212// NORM-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 11213// NORM-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 41214// NORM-NEXT:    br label [[OMP_INNER_FOR_COND]]1215// NORM:       omp.inner.for.end:1216// NORM-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1217// NORM:       omp.loop.exit:1218// NORM-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81219// NORM-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41220// NORM-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])1221// NORM-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01222// NORM-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 81223// NORM-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81224// NORM-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 41225// NORM-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.7.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1226// NORM-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1227// NORM-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1228// NORM-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1229// NORM-NEXT:    ]1230// NORM:       .omp.reduction.case1:1231// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointooERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1232// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 41233// NORM-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])1234// NORM-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)1235// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1236// NORM:       .omp.reduction.case2:1237// NORM-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81238// NORM-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 41239// NORM-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1240// NORM-NEXT:    [[CALL11:%.*]] = call i64 @_ZNK5PointooERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1241// NORM-NEXT:    store i64 [[CALL11]], ptr [[REF_TMP10]], align 41242// NORM-NEXT:    [[CALL12:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP10]])1243// NORM-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1244// NORM-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1245// NORM:       .omp.reduction.default:1246// NORM-NEXT:    br label [[OMP_PRECOND_END]]1247// NORM:       omp.precond.end:1248// NORM-NEXT:    ret void1249//1250//1251// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.7.omp.reduction.reduction_func1252// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {1253// NORM-NEXT:  entry:1254// NORM-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 81255// NORM-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 81256// NORM-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 41257// NORM-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 81258// NORM-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 81259// NORM-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81260// NORM-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81261// NORM-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 01262// NORM-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81263// NORM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 01264// NORM-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81265// NORM-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointooERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])1266// NORM-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 41267// NORM-NEXT:    [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])1268// NORM-NEXT:    ret void1269//1270//1271// NORM-LABEL: define {{[^@]+}}@_ZN5PointC2Ev1272// NORM-SAME: (ptr nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 {1273// NORM-NEXT:  entry:1274// NORM-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 81275// NORM-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 81276// NORM-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81277// NORM-NEXT:    [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_POINT:%.*]], ptr [[THIS1]], i32 0, i32 01278// NORM-NEXT:    store i32 0, ptr [[X]], align 41279// NORM-NEXT:    [[Y:%.*]] = getelementptr inbounds nuw [[STRUCT_POINT]], ptr [[THIS1]], i32 0, i32 11280// NORM-NEXT:    store i32 0, ptr [[Y]], align 41281// NORM-NEXT:    ret void1282//1283//1284// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point1285// COMP-SAME: (i32 [[N:%.*]], ptr [[POINTS:%.*]]) #[[ATTR0:[0-9]+]] {1286// COMP-NEXT:  entry:1287// COMP-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 41288// COMP-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 81289// COMP-NEXT:    [[RED:%.*]] = alloca [[STRUCT_POINT:%.*]], align 41290// COMP-NEXT:    store i32 [[N]], ptr [[N_ADDR]], align 41291// COMP-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 81292// COMP-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED]]) #[[ATTR2:[0-9]+]]1293// COMP-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3:[0-9]+]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])1294// COMP-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.1, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])1295// COMP-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.2, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])1296// COMP-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.3, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])1297// COMP-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.4, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])1298// COMP-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.5, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])1299// COMP-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.6, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])1300// COMP-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @_Z3fooiPK5Point.omp_outlined.7, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])1301// COMP-NEXT:    ret void1302//1303//1304// COMP-LABEL: define {{[^@]+}}@_ZN5PointC1Ev1305// COMP-SAME: (ptr nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 {1306// COMP-NEXT:  entry:1307// COMP-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 81308// COMP-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 81309// COMP-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 81310// COMP-NEXT:    call void @_ZN5PointC2Ev(ptr nonnull align 4 dereferenceable(8) [[THIS1]]) #[[ATTR2]]1311// COMP-NEXT:    ret void1312//1313//1314// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined1315// COMP-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1:[0-9]+]] {1316// COMP-NEXT:  entry:1317// COMP-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81318// COMP-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81319// COMP-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 81320// COMP-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 81321// COMP-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 81322// COMP-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 41323// COMP-NEXT:    [[TMP:%.*]] = alloca i32, align 41324// COMP-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41325// COMP-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41326// COMP-NEXT:    [[I:%.*]] = alloca i32, align 41327// COMP-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 41328// COMP-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 41329// COMP-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41330// COMP-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41331// COMP-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 41332// COMP-NEXT:    [[I4:%.*]] = alloca i32, align 41333// COMP-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 81334// COMP-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81335// COMP-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81336// COMP-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 81337// COMP-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 81338// COMP-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 81339// COMP-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 81340// COMP-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 81341// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 81342// COMP-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 41343// COMP-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 41344// COMP-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41345// COMP-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 01346// COMP-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 11347// COMP-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 11348// COMP-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41349// COMP-NEXT:    store i32 0, ptr [[I]], align 41350// COMP-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41351// COMP-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]1352// COMP-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]1353// COMP:       omp.precond.then:1354// COMP-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 41355// COMP-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41356// COMP-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 41357// COMP-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41358// COMP-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41359// COMP-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]1360// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81361// COMP-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41362// COMP-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1:[0-9]+]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1363// COMP-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41364// COMP-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41365// COMP-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]1366// COMP-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1367// COMP:       cond.true:1368// COMP-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41369// COMP-NEXT:    br label [[COND_END:%.*]]1370// COMP:       cond.false:1371// COMP-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41372// COMP-NEXT:    br label [[COND_END]]1373// COMP:       cond.end:1374// COMP-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]1375// COMP-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 41376// COMP-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41377// COMP-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 41378// COMP-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1379// COMP:       omp.inner.for.cond:1380// COMP-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41381// COMP-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41382// COMP-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 11383// COMP-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]1384// COMP-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1385// COMP:       omp.inner.for.body:1386// COMP-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41387// COMP-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 11388// COMP-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]1389// COMP-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 41390// COMP-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 41391// COMP-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 81392// COMP-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])1393// COMP-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]1394// COMP:       omp.body.continue:1395// COMP-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1396// COMP:       omp.inner.for.inc:1397// COMP-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41398// COMP-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 11399// COMP-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 41400// COMP-NEXT:    br label [[OMP_INNER_FOR_COND]]1401// COMP:       omp.inner.for.end:1402// COMP-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1403// COMP:       omp.loop.exit:1404// COMP-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81405// COMP-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41406// COMP-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])1407// COMP-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01408// COMP-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 81409// COMP-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81410// COMP-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 41411// COMP-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2:[0-9]+]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1412// COMP-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1413// COMP-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1414// COMP-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1415// COMP-NEXT:    ]1416// COMP:       .omp.reduction.case1:1417// COMP-NEXT:    [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointpLERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1418// COMP-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)1419// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1420// COMP:       .omp.reduction.case2:1421// COMP-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81422// COMP-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 41423// COMP-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1424// COMP-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointpLERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1425// COMP-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1426// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1427// COMP:       .omp.reduction.default:1428// COMP-NEXT:    br label [[OMP_PRECOND_END]]1429// COMP:       omp.precond.end:1430// COMP-NEXT:    ret void1431//1432//1433// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.omp.reduction.reduction_func1434// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] {1435// COMP-NEXT:  entry:1436// COMP-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 81437// COMP-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 81438// COMP-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 81439// COMP-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 81440// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81441// COMP-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81442// COMP-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 01443// COMP-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81444// COMP-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 01445// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81446// COMP-NEXT:    [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointpLERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])1447// COMP-NEXT:    ret void1448//1449//1450// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.11451// COMP-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {1452// COMP-NEXT:  entry:1453// COMP-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81454// COMP-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81455// COMP-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 81456// COMP-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 81457// COMP-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 81458// COMP-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 41459// COMP-NEXT:    [[TMP:%.*]] = alloca i32, align 41460// COMP-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41461// COMP-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41462// COMP-NEXT:    [[I:%.*]] = alloca i32, align 41463// COMP-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 41464// COMP-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 41465// COMP-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41466// COMP-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41467// COMP-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 41468// COMP-NEXT:    [[I4:%.*]] = alloca i32, align 41469// COMP-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 81470// COMP-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81471// COMP-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81472// COMP-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 81473// COMP-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 81474// COMP-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 81475// COMP-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 81476// COMP-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 81477// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 81478// COMP-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 41479// COMP-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 41480// COMP-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41481// COMP-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 01482// COMP-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 11483// COMP-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 11484// COMP-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41485// COMP-NEXT:    store i32 0, ptr [[I]], align 41486// COMP-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41487// COMP-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]1488// COMP-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]1489// COMP:       omp.precond.then:1490// COMP-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 41491// COMP-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41492// COMP-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 41493// COMP-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41494// COMP-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41495// COMP-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]1496// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81497// COMP-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41498// COMP-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1499// COMP-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41500// COMP-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41501// COMP-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]1502// COMP-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1503// COMP:       cond.true:1504// COMP-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41505// COMP-NEXT:    br label [[COND_END:%.*]]1506// COMP:       cond.false:1507// COMP-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41508// COMP-NEXT:    br label [[COND_END]]1509// COMP:       cond.end:1510// COMP-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]1511// COMP-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 41512// COMP-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41513// COMP-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 41514// COMP-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1515// COMP:       omp.inner.for.cond:1516// COMP-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41517// COMP-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41518// COMP-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 11519// COMP-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]1520// COMP-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1521// COMP:       omp.inner.for.body:1522// COMP-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41523// COMP-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 11524// COMP-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]1525// COMP-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 41526// COMP-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 41527// COMP-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 81528// COMP-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])1529// COMP-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]1530// COMP:       omp.body.continue:1531// COMP-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1532// COMP:       omp.inner.for.inc:1533// COMP-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41534// COMP-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 11535// COMP-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 41536// COMP-NEXT:    br label [[OMP_INNER_FOR_COND]]1537// COMP:       omp.inner.for.end:1538// COMP-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1539// COMP:       omp.loop.exit:1540// COMP-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81541// COMP-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41542// COMP-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])1543// COMP-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01544// COMP-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 81545// COMP-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81546// COMP-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 41547// COMP-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.1.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1548// COMP-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1549// COMP-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1550// COMP-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1551// COMP-NEXT:    ]1552// COMP:       .omp.reduction.case1:1553// COMP-NEXT:    [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointpLERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1554// COMP-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)1555// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1556// COMP:       .omp.reduction.case2:1557// COMP-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81558// COMP-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 41559// COMP-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1560// COMP-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointpLERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1561// COMP-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1562// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1563// COMP:       .omp.reduction.default:1564// COMP-NEXT:    br label [[OMP_PRECOND_END]]1565// COMP:       omp.precond.end:1566// COMP-NEXT:    ret void1567//1568//1569// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.1.omp.reduction.reduction_func1570// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {1571// COMP-NEXT:  entry:1572// COMP-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 81573// COMP-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 81574// COMP-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 81575// COMP-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 81576// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81577// COMP-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81578// COMP-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 01579// COMP-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81580// COMP-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 01581// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81582// COMP-NEXT:    [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointpLERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])1583// COMP-NEXT:    ret void1584//1585//1586// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.21587// COMP-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {1588// COMP-NEXT:  entry:1589// COMP-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81590// COMP-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81591// COMP-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 81592// COMP-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 81593// COMP-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 81594// COMP-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 41595// COMP-NEXT:    [[TMP:%.*]] = alloca i32, align 41596// COMP-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41597// COMP-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41598// COMP-NEXT:    [[I:%.*]] = alloca i32, align 41599// COMP-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 41600// COMP-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 41601// COMP-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41602// COMP-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41603// COMP-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 41604// COMP-NEXT:    [[I4:%.*]] = alloca i32, align 41605// COMP-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 81606// COMP-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81607// COMP-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81608// COMP-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 81609// COMP-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 81610// COMP-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 81611// COMP-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 81612// COMP-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 81613// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 81614// COMP-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 41615// COMP-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 41616// COMP-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41617// COMP-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 01618// COMP-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 11619// COMP-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 11620// COMP-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41621// COMP-NEXT:    store i32 0, ptr [[I]], align 41622// COMP-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41623// COMP-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]1624// COMP-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]1625// COMP:       omp.precond.then:1626// COMP-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 41627// COMP-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41628// COMP-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 41629// COMP-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41630// COMP-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41631// COMP-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]1632// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81633// COMP-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41634// COMP-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1635// COMP-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41636// COMP-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41637// COMP-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]1638// COMP-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1639// COMP:       cond.true:1640// COMP-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41641// COMP-NEXT:    br label [[COND_END:%.*]]1642// COMP:       cond.false:1643// COMP-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41644// COMP-NEXT:    br label [[COND_END]]1645// COMP:       cond.end:1646// COMP-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]1647// COMP-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 41648// COMP-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41649// COMP-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 41650// COMP-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1651// COMP:       omp.inner.for.cond:1652// COMP-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41653// COMP-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41654// COMP-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 11655// COMP-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]1656// COMP-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1657// COMP:       omp.inner.for.body:1658// COMP-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41659// COMP-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 11660// COMP-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]1661// COMP-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 41662// COMP-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 41663// COMP-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 81664// COMP-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])1665// COMP-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]1666// COMP:       omp.body.continue:1667// COMP-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1668// COMP:       omp.inner.for.inc:1669// COMP-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41670// COMP-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 11671// COMP-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 41672// COMP-NEXT:    br label [[OMP_INNER_FOR_COND]]1673// COMP:       omp.inner.for.end:1674// COMP-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1675// COMP:       omp.loop.exit:1676// COMP-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81677// COMP-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41678// COMP-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])1679// COMP-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01680// COMP-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 81681// COMP-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81682// COMP-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 41683// COMP-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.2.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1684// COMP-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1685// COMP-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1686// COMP-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1687// COMP-NEXT:    ]1688// COMP:       .omp.reduction.case1:1689// COMP-NEXT:    [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointmLERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1690// COMP-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)1691// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1692// COMP:       .omp.reduction.case2:1693// COMP-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81694// COMP-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 41695// COMP-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1696// COMP-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointmLERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1697// COMP-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1698// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1699// COMP:       .omp.reduction.default:1700// COMP-NEXT:    br label [[OMP_PRECOND_END]]1701// COMP:       omp.precond.end:1702// COMP-NEXT:    ret void1703//1704//1705// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.2.omp.reduction.reduction_func1706// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {1707// COMP-NEXT:  entry:1708// COMP-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 81709// COMP-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 81710// COMP-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 81711// COMP-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 81712// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81713// COMP-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81714// COMP-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 01715// COMP-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81716// COMP-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 01717// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81718// COMP-NEXT:    [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointmLERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])1719// COMP-NEXT:    ret void1720//1721//1722// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.31723// COMP-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {1724// COMP-NEXT:  entry:1725// COMP-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81726// COMP-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81727// COMP-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 81728// COMP-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 81729// COMP-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 81730// COMP-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 41731// COMP-NEXT:    [[TMP:%.*]] = alloca i32, align 41732// COMP-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41733// COMP-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41734// COMP-NEXT:    [[I:%.*]] = alloca i32, align 41735// COMP-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 41736// COMP-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 41737// COMP-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41738// COMP-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41739// COMP-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 41740// COMP-NEXT:    [[I4:%.*]] = alloca i32, align 41741// COMP-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 81742// COMP-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81743// COMP-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81744// COMP-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 81745// COMP-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 81746// COMP-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 81747// COMP-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 81748// COMP-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 81749// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 81750// COMP-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 41751// COMP-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 41752// COMP-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41753// COMP-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 01754// COMP-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 11755// COMP-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 11756// COMP-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41757// COMP-NEXT:    store i32 0, ptr [[I]], align 41758// COMP-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41759// COMP-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]1760// COMP-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]1761// COMP:       omp.precond.then:1762// COMP-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 41763// COMP-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41764// COMP-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 41765// COMP-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41766// COMP-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41767// COMP-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]1768// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81769// COMP-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41770// COMP-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1771// COMP-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41772// COMP-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41773// COMP-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]1774// COMP-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1775// COMP:       cond.true:1776// COMP-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41777// COMP-NEXT:    br label [[COND_END:%.*]]1778// COMP:       cond.false:1779// COMP-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41780// COMP-NEXT:    br label [[COND_END]]1781// COMP:       cond.end:1782// COMP-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]1783// COMP-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 41784// COMP-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41785// COMP-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 41786// COMP-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1787// COMP:       omp.inner.for.cond:1788// COMP-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41789// COMP-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41790// COMP-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 11791// COMP-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]1792// COMP-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1793// COMP:       omp.inner.for.body:1794// COMP-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41795// COMP-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 11796// COMP-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]1797// COMP-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 41798// COMP-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 41799// COMP-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 81800// COMP-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])1801// COMP-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]1802// COMP:       omp.body.continue:1803// COMP-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1804// COMP:       omp.inner.for.inc:1805// COMP-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41806// COMP-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 11807// COMP-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 41808// COMP-NEXT:    br label [[OMP_INNER_FOR_COND]]1809// COMP:       omp.inner.for.end:1810// COMP-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1811// COMP:       omp.loop.exit:1812// COMP-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81813// COMP-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41814// COMP-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])1815// COMP-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01816// COMP-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 81817// COMP-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81818// COMP-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 41819// COMP-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.3.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1820// COMP-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1821// COMP-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1822// COMP-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1823// COMP-NEXT:    ]1824// COMP:       .omp.reduction.case1:1825// COMP-NEXT:    [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaNERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1826// COMP-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)1827// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1828// COMP:       .omp.reduction.case2:1829// COMP-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81830// COMP-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 41831// COMP-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1832// COMP-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaNERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1833// COMP-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1834// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1835// COMP:       .omp.reduction.default:1836// COMP-NEXT:    br label [[OMP_PRECOND_END]]1837// COMP:       omp.precond.end:1838// COMP-NEXT:    ret void1839//1840//1841// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.3.omp.reduction.reduction_func1842// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {1843// COMP-NEXT:  entry:1844// COMP-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 81845// COMP-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 81846// COMP-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 81847// COMP-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 81848// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81849// COMP-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81850// COMP-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 01851// COMP-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81852// COMP-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 01853// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81854// COMP-NEXT:    [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaNERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])1855// COMP-NEXT:    ret void1856//1857//1858// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.41859// COMP-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {1860// COMP-NEXT:  entry:1861// COMP-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81862// COMP-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81863// COMP-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 81864// COMP-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 81865// COMP-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 81866// COMP-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 41867// COMP-NEXT:    [[TMP:%.*]] = alloca i32, align 41868// COMP-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 41869// COMP-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 41870// COMP-NEXT:    [[I:%.*]] = alloca i32, align 41871// COMP-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 41872// COMP-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 41873// COMP-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 41874// COMP-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 41875// COMP-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 41876// COMP-NEXT:    [[I4:%.*]] = alloca i32, align 41877// COMP-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 81878// COMP-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 81879// COMP-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 81880// COMP-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 81881// COMP-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 81882// COMP-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 81883// COMP-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 81884// COMP-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 81885// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 81886// COMP-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 41887// COMP-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 41888// COMP-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41889// COMP-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 01890// COMP-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 11891// COMP-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 11892// COMP-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 41893// COMP-NEXT:    store i32 0, ptr [[I]], align 41894// COMP-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 41895// COMP-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]1896// COMP-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]1897// COMP:       omp.precond.then:1898// COMP-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 41899// COMP-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41900// COMP-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 41901// COMP-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 41902// COMP-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 41903// COMP-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]1904// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81905// COMP-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 41906// COMP-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)1907// COMP-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41908// COMP-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41909// COMP-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]1910// COMP-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1911// COMP:       cond.true:1912// COMP-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 41913// COMP-NEXT:    br label [[COND_END:%.*]]1914// COMP:       cond.false:1915// COMP-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41916// COMP-NEXT:    br label [[COND_END]]1917// COMP:       cond.end:1918// COMP-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]1919// COMP-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 41920// COMP-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 41921// COMP-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 41922// COMP-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]1923// COMP:       omp.inner.for.cond:1924// COMP-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41925// COMP-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 41926// COMP-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 11927// COMP-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]1928// COMP-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]1929// COMP:       omp.inner.for.body:1930// COMP-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41931// COMP-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 11932// COMP-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]1933// COMP-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 41934// COMP-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 41935// COMP-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 81936// COMP-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])1937// COMP-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]1938// COMP:       omp.body.continue:1939// COMP-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]1940// COMP:       omp.inner.for.inc:1941// COMP-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 41942// COMP-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 11943// COMP-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 41944// COMP-NEXT:    br label [[OMP_INNER_FOR_COND]]1945// COMP:       omp.inner.for.end:1946// COMP-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]1947// COMP:       omp.loop.exit:1948// COMP-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81949// COMP-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 41950// COMP-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])1951// COMP-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01952// COMP-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 81953// COMP-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81954// COMP-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 41955// COMP-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.4.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)1956// COMP-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [1957// COMP-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]1958// COMP-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]1959// COMP-NEXT:    ]1960// COMP:       .omp.reduction.case1:1961// COMP-NEXT:    [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointoRERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1962// COMP-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)1963// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1964// COMP:       .omp.reduction.case2:1965// COMP-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 81966// COMP-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 41967// COMP-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1968// COMP-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointoRERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])1969// COMP-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)1970// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]1971// COMP:       .omp.reduction.default:1972// COMP-NEXT:    br label [[OMP_PRECOND_END]]1973// COMP:       omp.precond.end:1974// COMP-NEXT:    ret void1975//1976//1977// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.4.omp.reduction.reduction_func1978// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {1979// COMP-NEXT:  entry:1980// COMP-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 81981// COMP-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 81982// COMP-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 81983// COMP-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 81984// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 81985// COMP-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 81986// COMP-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 01987// COMP-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 81988// COMP-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 01989// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81990// COMP-NEXT:    [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointoRERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])1991// COMP-NEXT:    ret void1992//1993//1994// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.51995// COMP-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {1996// COMP-NEXT:  entry:1997// COMP-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 81998// COMP-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 81999// COMP-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 82000// COMP-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 82001// COMP-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 82002// COMP-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 42003// COMP-NEXT:    [[TMP:%.*]] = alloca i32, align 42004// COMP-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 42005// COMP-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 42006// COMP-NEXT:    [[I:%.*]] = alloca i32, align 42007// COMP-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 42008// COMP-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 42009// COMP-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42010// COMP-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42011// COMP-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 42012// COMP-NEXT:    [[I4:%.*]] = alloca i32, align 42013// COMP-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 82014// COMP-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82015// COMP-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82016// COMP-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 82017// COMP-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 82018// COMP-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 82019// COMP-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 82020// COMP-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 82021// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 82022// COMP-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 42023// COMP-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 42024// COMP-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 42025// COMP-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 02026// COMP-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 12027// COMP-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 12028// COMP-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 42029// COMP-NEXT:    store i32 0, ptr [[I]], align 42030// COMP-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 42031// COMP-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]2032// COMP-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]2033// COMP:       omp.precond.then:2034// COMP-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 42035// COMP-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 42036// COMP-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 42037// COMP-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 42038// COMP-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 42039// COMP-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]2040// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82041// COMP-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 42042// COMP-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2043// COMP-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42044// COMP-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 42045// COMP-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]2046// COMP-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2047// COMP:       cond.true:2048// COMP-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 42049// COMP-NEXT:    br label [[COND_END:%.*]]2050// COMP:       cond.false:2051// COMP-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42052// COMP-NEXT:    br label [[COND_END]]2053// COMP:       cond.end:2054// COMP-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]2055// COMP-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 42056// COMP-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42057// COMP-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 42058// COMP-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]2059// COMP:       omp.inner.for.cond:2060// COMP-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42061// COMP-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42062// COMP-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 12063// COMP-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]2064// COMP-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2065// COMP:       omp.inner.for.body:2066// COMP-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42067// COMP-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 12068// COMP-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]2069// COMP-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 42070// COMP-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 42071// COMP-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 82072// COMP-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])2073// COMP-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]2074// COMP:       omp.body.continue:2075// COMP-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]2076// COMP:       omp.inner.for.inc:2077// COMP-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42078// COMP-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 12079// COMP-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 42080// COMP-NEXT:    br label [[OMP_INNER_FOR_COND]]2081// COMP:       omp.inner.for.end:2082// COMP-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]2083// COMP:       omp.loop.exit:2084// COMP-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82085// COMP-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 42086// COMP-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])2087// COMP-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02088// COMP-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 82089// COMP-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82090// COMP-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 42091// COMP-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.5.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2092// COMP-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2093// COMP-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2094// COMP-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2095// COMP-NEXT:    ]2096// COMP:       .omp.reduction.case1:2097// COMP-NEXT:    [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointeOERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])2098// COMP-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)2099// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]2100// COMP:       .omp.reduction.case2:2101// COMP-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82102// COMP-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 42103// COMP-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)2104// COMP-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointeOERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])2105// COMP-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)2106// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]2107// COMP:       .omp.reduction.default:2108// COMP-NEXT:    br label [[OMP_PRECOND_END]]2109// COMP:       omp.precond.end:2110// COMP-NEXT:    ret void2111//2112//2113// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.5.omp.reduction.reduction_func2114// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {2115// COMP-NEXT:  entry:2116// COMP-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 82117// COMP-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 82118// COMP-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 82119// COMP-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 82120// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82121// COMP-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82122// COMP-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02123// COMP-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82124// COMP-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02125// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82126// COMP-NEXT:    [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointeOERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])2127// COMP-NEXT:    ret void2128//2129//2130// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.62131// COMP-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {2132// COMP-NEXT:  entry:2133// COMP-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82134// COMP-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82135// COMP-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 82136// COMP-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 82137// COMP-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 82138// COMP-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 42139// COMP-NEXT:    [[TMP:%.*]] = alloca i32, align 42140// COMP-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 42141// COMP-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 42142// COMP-NEXT:    [[I:%.*]] = alloca i32, align 42143// COMP-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 42144// COMP-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 42145// COMP-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42146// COMP-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42147// COMP-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 42148// COMP-NEXT:    [[I4:%.*]] = alloca i32, align 42149// COMP-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 82150// COMP-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 42151// COMP-NEXT:    [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 42152// COMP-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82153// COMP-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82154// COMP-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 82155// COMP-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 82156// COMP-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 82157// COMP-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 82158// COMP-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 82159// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 82160// COMP-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 42161// COMP-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 42162// COMP-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 42163// COMP-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 02164// COMP-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 12165// COMP-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 12166// COMP-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 42167// COMP-NEXT:    store i32 0, ptr [[I]], align 42168// COMP-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 42169// COMP-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]2170// COMP-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]2171// COMP:       omp.precond.then:2172// COMP-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 42173// COMP-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 42174// COMP-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 42175// COMP-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 42176// COMP-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 42177// COMP-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]2178// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82179// COMP-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 42180// COMP-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2181// COMP-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42182// COMP-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 42183// COMP-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]2184// COMP-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2185// COMP:       cond.true:2186// COMP-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 42187// COMP-NEXT:    br label [[COND_END:%.*]]2188// COMP:       cond.false:2189// COMP-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42190// COMP-NEXT:    br label [[COND_END]]2191// COMP:       cond.end:2192// COMP-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]2193// COMP-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 42194// COMP-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42195// COMP-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 42196// COMP-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]2197// COMP:       omp.inner.for.cond:2198// COMP-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42199// COMP-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42200// COMP-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 12201// COMP-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]2202// COMP-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2203// COMP:       omp.inner.for.body:2204// COMP-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42205// COMP-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 12206// COMP-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]2207// COMP-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 42208// COMP-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 42209// COMP-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 82210// COMP-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])2211// COMP-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]2212// COMP:       omp.body.continue:2213// COMP-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]2214// COMP:       omp.inner.for.inc:2215// COMP-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42216// COMP-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 12217// COMP-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 42218// COMP-NEXT:    br label [[OMP_INNER_FOR_COND]]2219// COMP:       omp.inner.for.end:2220// COMP-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]2221// COMP:       omp.loop.exit:2222// COMP-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82223// COMP-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 42224// COMP-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])2225// COMP-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02226// COMP-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 82227// COMP-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82228// COMP-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 42229// COMP-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.6.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2230// COMP-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2231// COMP-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2232// COMP-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2233// COMP-NEXT:    ]2234// COMP:       .omp.reduction.case1:2235// COMP-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointaaERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])2236// COMP-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 42237// COMP-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])2238// COMP-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)2239// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]2240// COMP:       .omp.reduction.case2:2241// COMP-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82242// COMP-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 42243// COMP-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)2244// COMP-NEXT:    [[CALL11:%.*]] = call i64 @_ZNK5PointaaERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])2245// COMP-NEXT:    store i64 [[CALL11]], ptr [[REF_TMP10]], align 42246// COMP-NEXT:    [[CALL12:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP10]])2247// COMP-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)2248// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]2249// COMP:       .omp.reduction.default:2250// COMP-NEXT:    br label [[OMP_PRECOND_END]]2251// COMP:       omp.precond.end:2252// COMP-NEXT:    ret void2253//2254//2255// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.6.omp.reduction.reduction_func2256// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {2257// COMP-NEXT:  entry:2258// COMP-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 82259// COMP-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 82260// COMP-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 42261// COMP-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 82262// COMP-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 82263// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82264// COMP-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82265// COMP-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02266// COMP-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82267// COMP-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02268// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82269// COMP-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointaaERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])2270// COMP-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 42271// COMP-NEXT:    [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])2272// COMP-NEXT:    ret void2273//2274//2275// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.72276// COMP-SAME: (ptr noalias [[DOTGLOBAL_TID_:%.*]], ptr noalias [[DOTBOUND_TID_:%.*]], ptr nonnull align 4 dereferenceable(4) [[N:%.*]], ptr nonnull align 4 dereferenceable(8) [[RED:%.*]], ptr nonnull align 8 dereferenceable(8) [[POINTS:%.*]]) #[[ATTR1]] {2277// COMP-NEXT:  entry:2278// COMP-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 82279// COMP-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 82280// COMP-NEXT:    [[N_ADDR:%.*]] = alloca ptr, align 82281// COMP-NEXT:    [[RED_ADDR:%.*]] = alloca ptr, align 82282// COMP-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 82283// COMP-NEXT:    [[DOTOMP_IV:%.*]] = alloca i32, align 42284// COMP-NEXT:    [[TMP:%.*]] = alloca i32, align 42285// COMP-NEXT:    [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 42286// COMP-NEXT:    [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 42287// COMP-NEXT:    [[I:%.*]] = alloca i32, align 42288// COMP-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 42289// COMP-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 42290// COMP-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 42291// COMP-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 42292// COMP-NEXT:    [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 42293// COMP-NEXT:    [[I4:%.*]] = alloca i32, align 42294// COMP-NEXT:    [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 82295// COMP-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 42296// COMP-NEXT:    [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 42297// COMP-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 82298// COMP-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 82299// COMP-NEXT:    store ptr [[N]], ptr [[N_ADDR]], align 82300// COMP-NEXT:    store ptr [[RED]], ptr [[RED_ADDR]], align 82301// COMP-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 82302// COMP-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 82303// COMP-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 82304// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 82305// COMP-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 42306// COMP-NEXT:    store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 42307// COMP-NEXT:    [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 42308// COMP-NEXT:    [[SUB:%.*]] = sub i32 [[TMP4]], 02309// COMP-NEXT:    [[DIV:%.*]] = udiv i32 [[SUB]], 12310// COMP-NEXT:    [[SUB2:%.*]] = sub i32 [[DIV]], 12311// COMP-NEXT:    store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 42312// COMP-NEXT:    store i32 0, ptr [[I]], align 42313// COMP-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 42314// COMP-NEXT:    [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]2315// COMP-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]2316// COMP:       omp.precond.then:2317// COMP-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 42318// COMP-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 42319// COMP-NEXT:    store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 42320// COMP-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 42321// COMP-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 42322// COMP-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR2]]2323// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82324// COMP-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 42325// COMP-NEXT:    call void @__kmpc_for_static_init_4u(ptr @[[GLOB1]], i32 [[TMP8]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)2326// COMP-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42327// COMP-NEXT:    [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 42328// COMP-NEXT:    [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]2329// COMP-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]2330// COMP:       cond.true:2331// COMP-NEXT:    [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 42332// COMP-NEXT:    br label [[COND_END:%.*]]2333// COMP:       cond.false:2334// COMP-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42335// COMP-NEXT:    br label [[COND_END]]2336// COMP:       cond.end:2337// COMP-NEXT:    [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]2338// COMP-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 42339// COMP-NEXT:    [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 42340// COMP-NEXT:    store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 42341// COMP-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]2342// COMP:       omp.inner.for.cond:2343// COMP-NEXT:    [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42344// COMP-NEXT:    [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 42345// COMP-NEXT:    [[ADD:%.*]] = add i32 [[TMP15]], 12346// COMP-NEXT:    [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]2347// COMP-NEXT:    br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]2348// COMP:       omp.inner.for.body:2349// COMP-NEXT:    [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42350// COMP-NEXT:    [[MUL:%.*]] = mul i32 [[TMP16]], 12351// COMP-NEXT:    [[ADD7:%.*]] = add i32 0, [[MUL]]2352// COMP-NEXT:    store i32 [[ADD7]], ptr [[I4]], align 42353// COMP-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I4]], align 42354// COMP-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 82355// COMP-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])2356// COMP-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]2357// COMP:       omp.body.continue:2358// COMP-NEXT:    br label [[OMP_INNER_FOR_INC:%.*]]2359// COMP:       omp.inner.for.inc:2360// COMP-NEXT:    [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 42361// COMP-NEXT:    [[ADD8:%.*]] = add i32 [[TMP19]], 12362// COMP-NEXT:    store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 42363// COMP-NEXT:    br label [[OMP_INNER_FOR_COND]]2364// COMP:       omp.inner.for.end:2365// COMP-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]2366// COMP:       omp.loop.exit:2367// COMP-NEXT:    [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82368// COMP-NEXT:    [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 42369// COMP-NEXT:    call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])2370// COMP-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 02371// COMP-NEXT:    store ptr [[RED3]], ptr [[TMP22]], align 82372// COMP-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82373// COMP-NEXT:    [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 42374// COMP-NEXT:    [[TMP25:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_Z3fooiPK5Point.omp_outlined.7.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)2375// COMP-NEXT:    switch i32 [[TMP25]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [2376// COMP-NEXT:      i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]2377// COMP-NEXT:      i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]2378// COMP-NEXT:    ]2379// COMP:       .omp.reduction.case1:2380// COMP-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointooERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])2381// COMP-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 42382// COMP-NEXT:    [[CALL9:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])2383// COMP-NEXT:    call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP24]], ptr @.gomp_critical_user_.reduction.var)2384// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]2385// COMP:       .omp.reduction.case2:2386// COMP-NEXT:    [[TMP26:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 82387// COMP-NEXT:    [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 42388// COMP-NEXT:    call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)2389// COMP-NEXT:    [[CALL11:%.*]] = call i64 @_ZNK5PointooERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])2390// COMP-NEXT:    store i64 [[CALL11]], ptr [[REF_TMP10]], align 42391// COMP-NEXT:    [[CALL12:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP10]])2392// COMP-NEXT:    call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP27]], ptr @.gomp_critical_user_.atomic_reduction.var)2393// COMP-NEXT:    br label [[DOTOMP_REDUCTION_DEFAULT]]2394// COMP:       .omp.reduction.default:2395// COMP-NEXT:    br label [[OMP_PRECOND_END]]2396// COMP:       omp.precond.end:2397// COMP-NEXT:    ret void2398//2399//2400// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point.omp_outlined.7.omp.reduction.reduction_func2401// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR4]] {2402// COMP-NEXT:  entry:2403// COMP-NEXT:    [[DOTADDR:%.*]] = alloca ptr, align 82404// COMP-NEXT:    [[DOTADDR1:%.*]] = alloca ptr, align 82405// COMP-NEXT:    [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 42406// COMP-NEXT:    store ptr [[TMP0]], ptr [[DOTADDR]], align 82407// COMP-NEXT:    store ptr [[TMP1]], ptr [[DOTADDR1]], align 82408// COMP-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 82409// COMP-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[DOTADDR1]], align 82410// COMP-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 02411// COMP-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 82412// COMP-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 02413// COMP-NEXT:    [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 82414// COMP-NEXT:    [[CALL:%.*]] = call i64 @_ZNK5PointooERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[TMP5]])2415// COMP-NEXT:    store i64 [[CALL]], ptr [[REF_TMP]], align 42416// COMP-NEXT:    [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP7]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])2417// COMP-NEXT:    ret void2418//2419//2420// COMP-LABEL: define {{[^@]+}}@_ZN5PointC2Ev2421// COMP-SAME: (ptr nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 {2422// COMP-NEXT:  entry:2423// COMP-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 82424// COMP-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 82425// COMP-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82426// COMP-NEXT:    [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_POINT:%.*]], ptr [[THIS1]], i32 0, i32 02427// COMP-NEXT:    store i32 0, ptr [[X]], align 42428// COMP-NEXT:    [[Y:%.*]] = getelementptr inbounds nuw [[STRUCT_POINT]], ptr [[THIS1]], i32 0, i32 12429// COMP-NEXT:    store i32 0, ptr [[Y]], align 42430// COMP-NEXT:    ret void2431//2432//2433// SIMD-ONLY-LABEL: define {{[^@]+}}@_Z3fooiPK5Point2434// SIMD-ONLY-SAME: (i32 [[N:%.*]], ptr [[POINTS:%.*]]) #[[ATTR0:[0-9]+]] {2435// SIMD-ONLY-NEXT:  entry:2436// SIMD-ONLY-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 42437// SIMD-ONLY-NEXT:    [[POINTS_ADDR:%.*]] = alloca ptr, align 82438// SIMD-ONLY-NEXT:    [[RED:%.*]] = alloca [[STRUCT_POINT:%.*]], align 42439// SIMD-ONLY-NEXT:    [[I:%.*]] = alloca i32, align 42440// SIMD-ONLY-NEXT:    [[I1:%.*]] = alloca i32, align 42441// SIMD-ONLY-NEXT:    [[I8:%.*]] = alloca i32, align 42442// SIMD-ONLY-NEXT:    [[I15:%.*]] = alloca i32, align 42443// SIMD-ONLY-NEXT:    [[I22:%.*]] = alloca i32, align 42444// SIMD-ONLY-NEXT:    [[I29:%.*]] = alloca i32, align 42445// SIMD-ONLY-NEXT:    [[I36:%.*]] = alloca i32, align 42446// SIMD-ONLY-NEXT:    [[I43:%.*]] = alloca i32, align 42447// SIMD-ONLY-NEXT:    store i32 [[N]], ptr [[N_ADDR]], align 42448// SIMD-ONLY-NEXT:    store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 82449// SIMD-ONLY-NEXT:    call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED]]) #[[ATTR2:[0-9]+]]2450// SIMD-ONLY-NEXT:    store i32 0, ptr [[I]], align 42451// SIMD-ONLY-NEXT:    br label [[FOR_COND:%.*]]2452// SIMD-ONLY:       for.cond:2453// SIMD-ONLY-NEXT:    [[TMP0:%.*]] = load i32, ptr [[I]], align 42454// SIMD-ONLY-NEXT:    [[TMP1:%.*]] = load i32, ptr [[N_ADDR]], align 42455// SIMD-ONLY-NEXT:    [[CMP:%.*]] = icmp ult i32 [[TMP0]], [[TMP1]]2456// SIMD-ONLY-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]2457// SIMD-ONLY:       for.body:2458// SIMD-ONLY-NEXT:    [[TMP2:%.*]] = load i32, ptr [[I]], align 42459// SIMD-ONLY-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 82460// SIMD-ONLY-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED]], i32 [[TMP2]], ptr [[TMP3]])2461// SIMD-ONLY-NEXT:    br label [[FOR_INC:%.*]]2462// SIMD-ONLY:       for.inc:2463// SIMD-ONLY-NEXT:    [[TMP4:%.*]] = load i32, ptr [[I]], align 42464// SIMD-ONLY-NEXT:    [[INC:%.*]] = add i32 [[TMP4]], 12465// SIMD-ONLY-NEXT:    store i32 [[INC]], ptr [[I]], align 42466// SIMD-ONLY-NEXT:    br label [[FOR_COND]], !llvm.loop [[LOOP2:![0-9]+]]2467// SIMD-ONLY:       for.end:2468// SIMD-ONLY-NEXT:    store i32 0, ptr [[I1]], align 42469// SIMD-ONLY-NEXT:    br label [[FOR_COND2:%.*]]2470// SIMD-ONLY:       for.cond2:2471// SIMD-ONLY-NEXT:    [[TMP5:%.*]] = load i32, ptr [[I1]], align 42472// SIMD-ONLY-NEXT:    [[TMP6:%.*]] = load i32, ptr [[N_ADDR]], align 42473// SIMD-ONLY-NEXT:    [[CMP3:%.*]] = icmp ult i32 [[TMP5]], [[TMP6]]2474// SIMD-ONLY-NEXT:    br i1 [[CMP3]], label [[FOR_BODY4:%.*]], label [[FOR_END7:%.*]]2475// SIMD-ONLY:       for.body4:2476// SIMD-ONLY-NEXT:    [[TMP7:%.*]] = load i32, ptr [[I1]], align 42477// SIMD-ONLY-NEXT:    [[TMP8:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 82478// SIMD-ONLY-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED]], i32 [[TMP7]], ptr [[TMP8]])2479// SIMD-ONLY-NEXT:    br label [[FOR_INC5:%.*]]2480// SIMD-ONLY:       for.inc5:2481// SIMD-ONLY-NEXT:    [[TMP9:%.*]] = load i32, ptr [[I1]], align 42482// SIMD-ONLY-NEXT:    [[INC6:%.*]] = add i32 [[TMP9]], 12483// SIMD-ONLY-NEXT:    store i32 [[INC6]], ptr [[I1]], align 42484// SIMD-ONLY-NEXT:    br label [[FOR_COND2]], !llvm.loop [[LOOP4:![0-9]+]]2485// SIMD-ONLY:       for.end7:2486// SIMD-ONLY-NEXT:    store i32 0, ptr [[I8]], align 42487// SIMD-ONLY-NEXT:    br label [[FOR_COND9:%.*]]2488// SIMD-ONLY:       for.cond9:2489// SIMD-ONLY-NEXT:    [[TMP10:%.*]] = load i32, ptr [[I8]], align 42490// SIMD-ONLY-NEXT:    [[TMP11:%.*]] = load i32, ptr [[N_ADDR]], align 42491// SIMD-ONLY-NEXT:    [[CMP10:%.*]] = icmp ult i32 [[TMP10]], [[TMP11]]2492// SIMD-ONLY-NEXT:    br i1 [[CMP10]], label [[FOR_BODY11:%.*]], label [[FOR_END14:%.*]]2493// SIMD-ONLY:       for.body11:2494// SIMD-ONLY-NEXT:    [[TMP12:%.*]] = load i32, ptr [[I8]], align 42495// SIMD-ONLY-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 82496// SIMD-ONLY-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED]], i32 [[TMP12]], ptr [[TMP13]])2497// SIMD-ONLY-NEXT:    br label [[FOR_INC12:%.*]]2498// SIMD-ONLY:       for.inc12:2499// SIMD-ONLY-NEXT:    [[TMP14:%.*]] = load i32, ptr [[I8]], align 42500// SIMD-ONLY-NEXT:    [[INC13:%.*]] = add i32 [[TMP14]], 12501// SIMD-ONLY-NEXT:    store i32 [[INC13]], ptr [[I8]], align 42502// SIMD-ONLY-NEXT:    br label [[FOR_COND9]], !llvm.loop [[LOOP5:![0-9]+]]2503// SIMD-ONLY:       for.end14:2504// SIMD-ONLY-NEXT:    store i32 0, ptr [[I15]], align 42505// SIMD-ONLY-NEXT:    br label [[FOR_COND16:%.*]]2506// SIMD-ONLY:       for.cond16:2507// SIMD-ONLY-NEXT:    [[TMP15:%.*]] = load i32, ptr [[I15]], align 42508// SIMD-ONLY-NEXT:    [[TMP16:%.*]] = load i32, ptr [[N_ADDR]], align 42509// SIMD-ONLY-NEXT:    [[CMP17:%.*]] = icmp ult i32 [[TMP15]], [[TMP16]]2510// SIMD-ONLY-NEXT:    br i1 [[CMP17]], label [[FOR_BODY18:%.*]], label [[FOR_END21:%.*]]2511// SIMD-ONLY:       for.body18:2512// SIMD-ONLY-NEXT:    [[TMP17:%.*]] = load i32, ptr [[I15]], align 42513// SIMD-ONLY-NEXT:    [[TMP18:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 82514// SIMD-ONLY-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED]], i32 [[TMP17]], ptr [[TMP18]])2515// SIMD-ONLY-NEXT:    br label [[FOR_INC19:%.*]]2516// SIMD-ONLY:       for.inc19:2517// SIMD-ONLY-NEXT:    [[TMP19:%.*]] = load i32, ptr [[I15]], align 42518// SIMD-ONLY-NEXT:    [[INC20:%.*]] = add i32 [[TMP19]], 12519// SIMD-ONLY-NEXT:    store i32 [[INC20]], ptr [[I15]], align 42520// SIMD-ONLY-NEXT:    br label [[FOR_COND16]], !llvm.loop [[LOOP6:![0-9]+]]2521// SIMD-ONLY:       for.end21:2522// SIMD-ONLY-NEXT:    store i32 0, ptr [[I22]], align 42523// SIMD-ONLY-NEXT:    br label [[FOR_COND23:%.*]]2524// SIMD-ONLY:       for.cond23:2525// SIMD-ONLY-NEXT:    [[TMP20:%.*]] = load i32, ptr [[I22]], align 42526// SIMD-ONLY-NEXT:    [[TMP21:%.*]] = load i32, ptr [[N_ADDR]], align 42527// SIMD-ONLY-NEXT:    [[CMP24:%.*]] = icmp ult i32 [[TMP20]], [[TMP21]]2528// SIMD-ONLY-NEXT:    br i1 [[CMP24]], label [[FOR_BODY25:%.*]], label [[FOR_END28:%.*]]2529// SIMD-ONLY:       for.body25:2530// SIMD-ONLY-NEXT:    [[TMP22:%.*]] = load i32, ptr [[I22]], align 42531// SIMD-ONLY-NEXT:    [[TMP23:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 82532// SIMD-ONLY-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED]], i32 [[TMP22]], ptr [[TMP23]])2533// SIMD-ONLY-NEXT:    br label [[FOR_INC26:%.*]]2534// SIMD-ONLY:       for.inc26:2535// SIMD-ONLY-NEXT:    [[TMP24:%.*]] = load i32, ptr [[I22]], align 42536// SIMD-ONLY-NEXT:    [[INC27:%.*]] = add i32 [[TMP24]], 12537// SIMD-ONLY-NEXT:    store i32 [[INC27]], ptr [[I22]], align 42538// SIMD-ONLY-NEXT:    br label [[FOR_COND23]], !llvm.loop [[LOOP7:![0-9]+]]2539// SIMD-ONLY:       for.end28:2540// SIMD-ONLY-NEXT:    store i32 0, ptr [[I29]], align 42541// SIMD-ONLY-NEXT:    br label [[FOR_COND30:%.*]]2542// SIMD-ONLY:       for.cond30:2543// SIMD-ONLY-NEXT:    [[TMP25:%.*]] = load i32, ptr [[I29]], align 42544// SIMD-ONLY-NEXT:    [[TMP26:%.*]] = load i32, ptr [[N_ADDR]], align 42545// SIMD-ONLY-NEXT:    [[CMP31:%.*]] = icmp ult i32 [[TMP25]], [[TMP26]]2546// SIMD-ONLY-NEXT:    br i1 [[CMP31]], label [[FOR_BODY32:%.*]], label [[FOR_END35:%.*]]2547// SIMD-ONLY:       for.body32:2548// SIMD-ONLY-NEXT:    [[TMP27:%.*]] = load i32, ptr [[I29]], align 42549// SIMD-ONLY-NEXT:    [[TMP28:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 82550// SIMD-ONLY-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED]], i32 [[TMP27]], ptr [[TMP28]])2551// SIMD-ONLY-NEXT:    br label [[FOR_INC33:%.*]]2552// SIMD-ONLY:       for.inc33:2553// SIMD-ONLY-NEXT:    [[TMP29:%.*]] = load i32, ptr [[I29]], align 42554// SIMD-ONLY-NEXT:    [[INC34:%.*]] = add i32 [[TMP29]], 12555// SIMD-ONLY-NEXT:    store i32 [[INC34]], ptr [[I29]], align 42556// SIMD-ONLY-NEXT:    br label [[FOR_COND30]], !llvm.loop [[LOOP8:![0-9]+]]2557// SIMD-ONLY:       for.end35:2558// SIMD-ONLY-NEXT:    store i32 0, ptr [[I36]], align 42559// SIMD-ONLY-NEXT:    br label [[FOR_COND37:%.*]]2560// SIMD-ONLY:       for.cond37:2561// SIMD-ONLY-NEXT:    [[TMP30:%.*]] = load i32, ptr [[I36]], align 42562// SIMD-ONLY-NEXT:    [[TMP31:%.*]] = load i32, ptr [[N_ADDR]], align 42563// SIMD-ONLY-NEXT:    [[CMP38:%.*]] = icmp ult i32 [[TMP30]], [[TMP31]]2564// SIMD-ONLY-NEXT:    br i1 [[CMP38]], label [[FOR_BODY39:%.*]], label [[FOR_END42:%.*]]2565// SIMD-ONLY:       for.body39:2566// SIMD-ONLY-NEXT:    [[TMP32:%.*]] = load i32, ptr [[I36]], align 42567// SIMD-ONLY-NEXT:    [[TMP33:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 82568// SIMD-ONLY-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED]], i32 [[TMP32]], ptr [[TMP33]])2569// SIMD-ONLY-NEXT:    br label [[FOR_INC40:%.*]]2570// SIMD-ONLY:       for.inc40:2571// SIMD-ONLY-NEXT:    [[TMP34:%.*]] = load i32, ptr [[I36]], align 42572// SIMD-ONLY-NEXT:    [[INC41:%.*]] = add i32 [[TMP34]], 12573// SIMD-ONLY-NEXT:    store i32 [[INC41]], ptr [[I36]], align 42574// SIMD-ONLY-NEXT:    br label [[FOR_COND37]], !llvm.loop [[LOOP9:![0-9]+]]2575// SIMD-ONLY:       for.end42:2576// SIMD-ONLY-NEXT:    store i32 0, ptr [[I43]], align 42577// SIMD-ONLY-NEXT:    br label [[FOR_COND44:%.*]]2578// SIMD-ONLY:       for.cond44:2579// SIMD-ONLY-NEXT:    [[TMP35:%.*]] = load i32, ptr [[I43]], align 42580// SIMD-ONLY-NEXT:    [[TMP36:%.*]] = load i32, ptr [[N_ADDR]], align 42581// SIMD-ONLY-NEXT:    [[CMP45:%.*]] = icmp ult i32 [[TMP35]], [[TMP36]]2582// SIMD-ONLY-NEXT:    br i1 [[CMP45]], label [[FOR_BODY46:%.*]], label [[FOR_END49:%.*]]2583// SIMD-ONLY:       for.body46:2584// SIMD-ONLY-NEXT:    [[TMP37:%.*]] = load i32, ptr [[I43]], align 42585// SIMD-ONLY-NEXT:    [[TMP38:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 82586// SIMD-ONLY-NEXT:    call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED]], i32 [[TMP37]], ptr [[TMP38]])2587// SIMD-ONLY-NEXT:    br label [[FOR_INC47:%.*]]2588// SIMD-ONLY:       for.inc47:2589// SIMD-ONLY-NEXT:    [[TMP39:%.*]] = load i32, ptr [[I43]], align 42590// SIMD-ONLY-NEXT:    [[INC48:%.*]] = add i32 [[TMP39]], 12591// SIMD-ONLY-NEXT:    store i32 [[INC48]], ptr [[I43]], align 42592// SIMD-ONLY-NEXT:    br label [[FOR_COND44]], !llvm.loop [[LOOP10:![0-9]+]]2593// SIMD-ONLY:       for.end49:2594// SIMD-ONLY-NEXT:    ret void2595//2596//2597// SIMD-ONLY-LABEL: define {{[^@]+}}@_ZN5PointC1Ev2598// SIMD-ONLY-SAME: (ptr nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 {2599// SIMD-ONLY-NEXT:  entry:2600// SIMD-ONLY-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 82601// SIMD-ONLY-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 82602// SIMD-ONLY-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82603// SIMD-ONLY-NEXT:    call void @_ZN5PointC2Ev(ptr nonnull align 4 dereferenceable(8) [[THIS1]]) #[[ATTR2]]2604// SIMD-ONLY-NEXT:    ret void2605//2606//2607// SIMD-ONLY-LABEL: define {{[^@]+}}@_ZN5PointC2Ev2608// SIMD-ONLY-SAME: (ptr nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR0]] comdat align 2 {2609// SIMD-ONLY-NEXT:  entry:2610// SIMD-ONLY-NEXT:    [[THIS_ADDR:%.*]] = alloca ptr, align 82611// SIMD-ONLY-NEXT:    store ptr [[THIS]], ptr [[THIS_ADDR]], align 82612// SIMD-ONLY-NEXT:    [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 82613// SIMD-ONLY-NEXT:    [[X:%.*]] = getelementptr inbounds nuw [[STRUCT_POINT:%.*]], ptr [[THIS1]], i32 0, i32 02614// SIMD-ONLY-NEXT:    store i32 0, ptr [[X]], align 42615// SIMD-ONLY-NEXT:    [[Y:%.*]] = getelementptr inbounds nuw [[STRUCT_POINT]], ptr [[THIS1]], i32 0, i32 12616// SIMD-ONLY-NEXT:    store i32 0, ptr [[Y]], align 42617// SIMD-ONLY-NEXT:    ret void2618//2619