forked from OSchip/llvm-project
2433 lines
160 KiB
C++
2433 lines
160 KiB
C++
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs
|
|
// RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-unknown-linux-gnu -fopenmp -DNORM \
|
|
//RUN: -emit-llvm -o - %s | FileCheck %s --check-prefix NORM
|
|
|
|
//RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-unknown-linux-gnu -fopenmp -DCOMP \
|
|
//RUN: -emit-llvm -o - %s | FileCheck %s --check-prefix COMP
|
|
|
|
// Prefer compound operators since that is what the spec seems to say.
|
|
// RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-unknown-linux-gnu -fopenmp -DNORM -DCOMP \
|
|
//RUN: -emit-llvm -o - %s | FileCheck %s --check-prefix COMP
|
|
|
|
//RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-unknown-linux-gnu -fopenmp-simd -DNORM \
|
|
//RUN: -emit-llvm -o - %s | FileCheck %s --check-prefix SIMD-ONLY
|
|
|
|
//RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-unknown-linux-gnu -fopenmp-simd -DCOMP \
|
|
//RUN: -emit-llvm -o - %s | FileCheck %s --check-prefix SIMD-ONLY
|
|
|
|
//RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-unknown-linux-gnu -fopenmp-simd -DNORM -DCOMP \
|
|
//RUN: -emit-llvm -o - %s | FileCheck %s --check-prefix SIMD-ONLY
|
|
|
|
// SIMD-ONLY-NOT: {{__kmpc|__tgt}}
|
|
|
|
struct Point {
|
|
int x = 0;
|
|
int y = 0;
|
|
#if NORM
|
|
Point operator+(Point const &other) const;
|
|
Point operator-(Point const &other) const;
|
|
Point operator*(Point const &other) const;
|
|
Point operator&(Point const &other) const;
|
|
Point operator|(Point const &other) const;
|
|
Point operator^(Point const &other) const;
|
|
#endif
|
|
Point operator&&(Point const &other) const;
|
|
Point operator||(Point const &other) const;
|
|
Point &operator=(Point const &other);
|
|
#if COMP
|
|
Point &operator+=(Point const &other);
|
|
Point &operator*=(Point const &other);
|
|
Point &operator&=(Point const &other);
|
|
Point &operator|=(Point const &other);
|
|
Point &operator^=(Point const &other);
|
|
#endif
|
|
};
|
|
|
|
void work(Point &P, int N, Point const *Points);
|
|
|
|
void foo(int N, Point const *Points) {
|
|
Point Red;
|
|
#pragma omp parallel for reduction(+: Red)
|
|
for (unsigned I = 0; I < N; ++I)
|
|
work(Red, I, Points);
|
|
|
|
#pragma omp parallel for reduction(-: Red)
|
|
for (unsigned I = 0; I < N; ++I)
|
|
work(Red, I, Points);
|
|
|
|
#pragma omp parallel for reduction(*: Red)
|
|
for (unsigned I = 0; I < N; ++I)
|
|
work(Red, I, Points);
|
|
|
|
#pragma omp parallel for reduction(&: Red)
|
|
for (unsigned I = 0; I < N; ++I)
|
|
work(Red, I, Points);
|
|
|
|
#pragma omp parallel for reduction(|: Red)
|
|
for (unsigned I = 0; I < N; ++I)
|
|
work(Red, I, Points);
|
|
|
|
#pragma omp parallel for reduction(^: Red)
|
|
for (unsigned I = 0; I < N; ++I)
|
|
work(Red, I, Points);
|
|
|
|
#pragma omp parallel for reduction(&&: Red)
|
|
for (unsigned I = 0; I < N; ++I)
|
|
work(Red, I, Points);
|
|
|
|
#pragma omp parallel for reduction(||: Red)
|
|
for (unsigned I = 0; I < N; ++I)
|
|
work(Red, I, Points);
|
|
}
|
|
// NORM-LABEL: define {{[^@]+}}@_Z3fooiPK5Point
|
|
// NORM-SAME: (i32 [[N:%.*]], ptr [[POINTS:%.*]]) #[[ATTR0:[0-9]+]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[RED:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 4
|
|
// NORM-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED]]) #[[ATTR4:[0-9]+]]
|
|
// NORM-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3:[0-9]+]], i32 3, ptr @.omp_outlined., ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// NORM-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..1, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// NORM-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..3, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// NORM-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..5, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// NORM-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..7, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// NORM-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..9, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// NORM-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..11, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// NORM-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..13, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@_ZN5PointC1Ev
|
|
// NORM-SAME: (ptr nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
|
// NORM-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
|
|
// NORM-NEXT: call void @_ZN5PointC2Ev(ptr nonnull align 4 dereferenceable(8) [[THIS1]]) #[[ATTR4]]
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp_outlined.
|
|
// 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:%.*]]) #[[ATTR2:[0-9]+]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// NORM-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// NORM-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// NORM-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// NORM-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[I]], align 4
|
|
// NORM-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// NORM-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// NORM: omp.precond.then:
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// NORM-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// NORM-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// NORM-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// NORM: cond.true:
|
|
// NORM-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: br label [[COND_END:%.*]]
|
|
// NORM: cond.false:
|
|
// NORM-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: br label [[COND_END]]
|
|
// NORM: cond.end:
|
|
// NORM-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// NORM-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// NORM: omp.inner.for.cond:
|
|
// NORM-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// NORM-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// NORM-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// NORM: omp.inner.for.body:
|
|
// NORM-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// NORM-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// NORM-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// NORM-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// NORM-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// NORM: omp.body.continue:
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// NORM: omp.inner.for.inc:
|
|
// NORM-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// NORM-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// NORM: omp.inner.for.end:
|
|
// NORM-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// NORM: omp.loop.exit:
|
|
// NORM-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// NORM-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// NORM-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// NORM-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// NORM-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// NORM-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2:[0-9]+]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// NORM-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// NORM-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// NORM-NEXT: ]
|
|
// NORM: .omp.reduction.case1:
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointplERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.case2:
|
|
// NORM-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 4
|
|
// NORM-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: [[CALL11:%.*]] = call i64 @_ZNK5PointplERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL11]], ptr [[REF_TMP10]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.default:
|
|
// NORM-NEXT: br label [[OMP_PRECOND_END]]
|
|
// NORM: omp.precond.end:
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func
|
|
// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5:[0-9]+]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// NORM-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointplERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// NORM-NEXT: [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp_outlined..1
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// NORM-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// NORM-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// NORM-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// NORM-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[I]], align 4
|
|
// NORM-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// NORM-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// NORM: omp.precond.then:
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// NORM-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// NORM-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// NORM-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// NORM: cond.true:
|
|
// NORM-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: br label [[COND_END:%.*]]
|
|
// NORM: cond.false:
|
|
// NORM-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: br label [[COND_END]]
|
|
// NORM: cond.end:
|
|
// NORM-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// NORM-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// NORM: omp.inner.for.cond:
|
|
// NORM-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// NORM-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// NORM-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// NORM: omp.inner.for.body:
|
|
// NORM-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// NORM-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// NORM-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// NORM-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// NORM-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// NORM: omp.body.continue:
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// NORM: omp.inner.for.inc:
|
|
// NORM-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// NORM-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// NORM: omp.inner.for.end:
|
|
// NORM-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// NORM: omp.loop.exit:
|
|
// NORM-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// NORM-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// NORM-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// NORM-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// NORM-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// NORM-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.2, ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// NORM-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// NORM-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// NORM-NEXT: ]
|
|
// NORM: .omp.reduction.case1:
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointplERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.case2:
|
|
// NORM-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 4
|
|
// NORM-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: [[CALL11:%.*]] = call i64 @_ZNK5PointplERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL11]], ptr [[REF_TMP10]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.default:
|
|
// NORM-NEXT: br label [[OMP_PRECOND_END]]
|
|
// NORM: omp.precond.end:
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.2
|
|
// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// NORM-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointplERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// NORM-NEXT: [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp_outlined..3
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// NORM-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// NORM-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// NORM-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// NORM-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[I]], align 4
|
|
// NORM-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// NORM-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// NORM: omp.precond.then:
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// NORM-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// NORM-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// NORM-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// NORM: cond.true:
|
|
// NORM-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: br label [[COND_END:%.*]]
|
|
// NORM: cond.false:
|
|
// NORM-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: br label [[COND_END]]
|
|
// NORM: cond.end:
|
|
// NORM-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// NORM-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// NORM: omp.inner.for.cond:
|
|
// NORM-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// NORM-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// NORM-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// NORM: omp.inner.for.body:
|
|
// NORM-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// NORM-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// NORM-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// NORM-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// NORM-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// NORM: omp.body.continue:
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// NORM: omp.inner.for.inc:
|
|
// NORM-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// NORM-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// NORM: omp.inner.for.end:
|
|
// NORM-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// NORM: omp.loop.exit:
|
|
// NORM-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// NORM-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// NORM-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// NORM-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// NORM-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// NORM-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.4, ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// NORM-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// NORM-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// NORM-NEXT: ]
|
|
// NORM: .omp.reduction.case1:
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointmlERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.case2:
|
|
// NORM-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 4
|
|
// NORM-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: [[CALL11:%.*]] = call i64 @_ZNK5PointmlERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL11]], ptr [[REF_TMP10]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.default:
|
|
// NORM-NEXT: br label [[OMP_PRECOND_END]]
|
|
// NORM: omp.precond.end:
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.4
|
|
// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// NORM-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointmlERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// NORM-NEXT: [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp_outlined..5
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// NORM-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// NORM-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// NORM-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// NORM-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[I]], align 4
|
|
// NORM-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// NORM-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// NORM: omp.precond.then:
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// NORM-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// NORM-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// NORM-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// NORM: cond.true:
|
|
// NORM-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: br label [[COND_END:%.*]]
|
|
// NORM: cond.false:
|
|
// NORM-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: br label [[COND_END]]
|
|
// NORM: cond.end:
|
|
// NORM-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// NORM-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// NORM: omp.inner.for.cond:
|
|
// NORM-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// NORM-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// NORM-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// NORM: omp.inner.for.body:
|
|
// NORM-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// NORM-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// NORM-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// NORM-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// NORM-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// NORM: omp.body.continue:
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// NORM: omp.inner.for.inc:
|
|
// NORM-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// NORM-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// NORM: omp.inner.for.end:
|
|
// NORM-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// NORM: omp.loop.exit:
|
|
// NORM-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// NORM-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// NORM-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// NORM-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// NORM-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// NORM-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.6, ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// NORM-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// NORM-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// NORM-NEXT: ]
|
|
// NORM: .omp.reduction.case1:
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointanERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.case2:
|
|
// NORM-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 4
|
|
// NORM-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: [[CALL11:%.*]] = call i64 @_ZNK5PointanERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL11]], ptr [[REF_TMP10]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.default:
|
|
// NORM-NEXT: br label [[OMP_PRECOND_END]]
|
|
// NORM: omp.precond.end:
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.6
|
|
// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// NORM-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointanERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// NORM-NEXT: [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp_outlined..7
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// NORM-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// NORM-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// NORM-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// NORM-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[I]], align 4
|
|
// NORM-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// NORM-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// NORM: omp.precond.then:
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// NORM-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// NORM-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// NORM-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// NORM: cond.true:
|
|
// NORM-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: br label [[COND_END:%.*]]
|
|
// NORM: cond.false:
|
|
// NORM-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: br label [[COND_END]]
|
|
// NORM: cond.end:
|
|
// NORM-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// NORM-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// NORM: omp.inner.for.cond:
|
|
// NORM-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// NORM-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// NORM-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// NORM: omp.inner.for.body:
|
|
// NORM-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// NORM-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// NORM-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// NORM-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// NORM-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// NORM: omp.body.continue:
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// NORM: omp.inner.for.inc:
|
|
// NORM-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// NORM-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// NORM: omp.inner.for.end:
|
|
// NORM-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// NORM: omp.loop.exit:
|
|
// NORM-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// NORM-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// NORM-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// NORM-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// NORM-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// NORM-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.8, ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// NORM-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// NORM-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// NORM-NEXT: ]
|
|
// NORM: .omp.reduction.case1:
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointorERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.case2:
|
|
// NORM-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 4
|
|
// NORM-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: [[CALL11:%.*]] = call i64 @_ZNK5PointorERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL11]], ptr [[REF_TMP10]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.default:
|
|
// NORM-NEXT: br label [[OMP_PRECOND_END]]
|
|
// NORM: omp.precond.end:
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.8
|
|
// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// NORM-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointorERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// NORM-NEXT: [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp_outlined..9
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// NORM-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// NORM-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// NORM-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// NORM-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[I]], align 4
|
|
// NORM-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// NORM-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// NORM: omp.precond.then:
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// NORM-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// NORM-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// NORM-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// NORM: cond.true:
|
|
// NORM-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: br label [[COND_END:%.*]]
|
|
// NORM: cond.false:
|
|
// NORM-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: br label [[COND_END]]
|
|
// NORM: cond.end:
|
|
// NORM-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// NORM-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// NORM: omp.inner.for.cond:
|
|
// NORM-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// NORM-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// NORM-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// NORM: omp.inner.for.body:
|
|
// NORM-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// NORM-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// NORM-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// NORM-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// NORM-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// NORM: omp.body.continue:
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// NORM: omp.inner.for.inc:
|
|
// NORM-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// NORM-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// NORM: omp.inner.for.end:
|
|
// NORM-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// NORM: omp.loop.exit:
|
|
// NORM-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// NORM-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// NORM-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// NORM-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// NORM-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// NORM-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.10, ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// NORM-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// NORM-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// NORM-NEXT: ]
|
|
// NORM: .omp.reduction.case1:
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointeoERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.case2:
|
|
// NORM-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 4
|
|
// NORM-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: [[CALL11:%.*]] = call i64 @_ZNK5PointeoERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL11]], ptr [[REF_TMP10]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.default:
|
|
// NORM-NEXT: br label [[OMP_PRECOND_END]]
|
|
// NORM: omp.precond.end:
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.10
|
|
// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// NORM-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointeoERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// NORM-NEXT: [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp_outlined..11
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// NORM-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// NORM-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// NORM-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// NORM-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[I]], align 4
|
|
// NORM-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// NORM-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// NORM: omp.precond.then:
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// NORM-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// NORM-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// NORM-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// NORM: cond.true:
|
|
// NORM-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: br label [[COND_END:%.*]]
|
|
// NORM: cond.false:
|
|
// NORM-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: br label [[COND_END]]
|
|
// NORM: cond.end:
|
|
// NORM-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// NORM-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// NORM: omp.inner.for.cond:
|
|
// NORM-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// NORM-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// NORM-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// NORM: omp.inner.for.body:
|
|
// NORM-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// NORM-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// NORM-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// NORM-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// NORM-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// NORM: omp.body.continue:
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// NORM: omp.inner.for.inc:
|
|
// NORM-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// NORM-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// NORM: omp.inner.for.end:
|
|
// NORM-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// NORM: omp.loop.exit:
|
|
// NORM-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// NORM-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// NORM-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// NORM-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// NORM-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// NORM-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.12, ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// NORM-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// NORM-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// NORM-NEXT: ]
|
|
// NORM: .omp.reduction.case1:
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointaaERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.case2:
|
|
// NORM-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 4
|
|
// NORM-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: [[CALL11:%.*]] = call i64 @_ZNK5PointaaERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL11]], ptr [[REF_TMP10]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.default:
|
|
// NORM-NEXT: br label [[OMP_PRECOND_END]]
|
|
// NORM: omp.precond.end:
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.12
|
|
// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// NORM-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointaaERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// NORM-NEXT: [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp_outlined..13
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// NORM-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// NORM-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// NORM-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// NORM-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// NORM-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// NORM-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// NORM-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[I]], align 4
|
|
// NORM-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// NORM-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// NORM-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// NORM: omp.precond.then:
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// NORM-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// NORM-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// NORM-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// NORM-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// NORM: cond.true:
|
|
// NORM-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// NORM-NEXT: br label [[COND_END:%.*]]
|
|
// NORM: cond.false:
|
|
// NORM-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: br label [[COND_END]]
|
|
// NORM: cond.end:
|
|
// NORM-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// NORM-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// NORM-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// NORM: omp.inner.for.cond:
|
|
// NORM-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// NORM-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// NORM-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// NORM-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// NORM: omp.inner.for.body:
|
|
// NORM-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// NORM-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// NORM-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// NORM-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// NORM-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// NORM-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// NORM: omp.body.continue:
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// NORM: omp.inner.for.inc:
|
|
// NORM-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// NORM-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// NORM-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// NORM: omp.inner.for.end:
|
|
// NORM-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// NORM: omp.loop.exit:
|
|
// NORM-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// NORM-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// NORM-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// NORM-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// NORM-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// NORM-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.14, ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// NORM-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// NORM-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// NORM-NEXT: ]
|
|
// NORM: .omp.reduction.case1:
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointooERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.case2:
|
|
// NORM-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// NORM-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 4
|
|
// NORM-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: [[CALL11:%.*]] = call i64 @_ZNK5PointooERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// NORM-NEXT: store i64 [[CALL11]], ptr [[REF_TMP10]], align 4
|
|
// 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]])
|
|
// NORM-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// NORM-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// NORM: .omp.reduction.default:
|
|
// NORM-NEXT: br label [[OMP_PRECOND_END]]
|
|
// NORM: omp.precond.end:
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.14
|
|
// NORM-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// NORM-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// NORM-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// NORM-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// NORM-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// NORM-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// NORM-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointooERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// NORM-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// NORM-NEXT: [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// NORM-LABEL: define {{[^@]+}}@_ZN5PointC2Ev
|
|
// NORM-SAME: (ptr nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
|
|
// NORM-NEXT: entry:
|
|
// NORM-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
|
// NORM-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
|
// NORM-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
|
|
// NORM-NEXT: [[X:%.*]] = getelementptr inbounds [[STRUCT_POINT:%.*]], ptr [[THIS1]], i32 0, i32 0
|
|
// NORM-NEXT: store i32 0, ptr [[X]], align 4
|
|
// NORM-NEXT: [[Y:%.*]] = getelementptr inbounds [[STRUCT_POINT]], ptr [[THIS1]], i32 0, i32 1
|
|
// NORM-NEXT: store i32 0, ptr [[Y]], align 4
|
|
// NORM-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@_Z3fooiPK5Point
|
|
// COMP-SAME: (i32 [[N:%.*]], ptr [[POINTS:%.*]]) #[[ATTR0:[0-9]+]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[RED:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// COMP-NEXT: store i32 [[N]], ptr [[N_ADDR]], align 4
|
|
// COMP-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED]]) #[[ATTR4:[0-9]+]]
|
|
// COMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3:[0-9]+]], i32 3, ptr @.omp_outlined., ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// COMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..1, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// COMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..3, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// COMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..5, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// COMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..7, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// COMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..9, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// COMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..11, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// COMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB3]], i32 3, ptr @.omp_outlined..13, ptr [[N_ADDR]], ptr [[RED]], ptr [[POINTS_ADDR]])
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@_ZN5PointC1Ev
|
|
// COMP-SAME: (ptr nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
|
// COMP-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
|
|
// COMP-NEXT: call void @_ZN5PointC2Ev(ptr nonnull align 4 dereferenceable(8) [[THIS1]]) #[[ATTR4]]
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp_outlined.
|
|
// 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:%.*]]) #[[ATTR2:[0-9]+]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// COMP-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// COMP-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// COMP-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// COMP-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// COMP-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// COMP-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[I]], align 4
|
|
// COMP-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// COMP-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// COMP: omp.precond.then:
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// COMP-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// COMP-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// COMP-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// COMP: cond.true:
|
|
// COMP-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: br label [[COND_END:%.*]]
|
|
// COMP: cond.false:
|
|
// COMP-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: br label [[COND_END]]
|
|
// COMP: cond.end:
|
|
// COMP-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// COMP-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// COMP: omp.inner.for.cond:
|
|
// COMP-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// COMP-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// COMP-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// COMP: omp.inner.for.body:
|
|
// COMP-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// COMP-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// COMP-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// COMP-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// COMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// COMP: omp.body.continue:
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// COMP: omp.inner.for.inc:
|
|
// COMP-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// COMP-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// COMP: omp.inner.for.end:
|
|
// COMP-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// COMP: omp.loop.exit:
|
|
// COMP-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// COMP-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// COMP-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// COMP-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// COMP-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// COMP-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2:[0-9]+]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func, ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// COMP-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// COMP-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// COMP-NEXT: ]
|
|
// COMP: .omp.reduction.case1:
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.case2:
|
|
// COMP-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 4
|
|
// COMP-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.default:
|
|
// COMP-NEXT: br label [[OMP_PRECOND_END]]
|
|
// COMP: omp.precond.end:
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func
|
|
// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5:[0-9]+]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// COMP-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// COMP-NEXT: [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointpLERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp_outlined..1
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// COMP-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// COMP-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// COMP-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// COMP-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// COMP-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// COMP-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[I]], align 4
|
|
// COMP-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// COMP-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// COMP: omp.precond.then:
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// COMP-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// COMP-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// COMP-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// COMP: cond.true:
|
|
// COMP-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: br label [[COND_END:%.*]]
|
|
// COMP: cond.false:
|
|
// COMP-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: br label [[COND_END]]
|
|
// COMP: cond.end:
|
|
// COMP-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// COMP-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// COMP: omp.inner.for.cond:
|
|
// COMP-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// COMP-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// COMP-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// COMP: omp.inner.for.body:
|
|
// COMP-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// COMP-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// COMP-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// COMP-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// COMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// COMP: omp.body.continue:
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// COMP: omp.inner.for.inc:
|
|
// COMP-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// COMP-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// COMP: omp.inner.for.end:
|
|
// COMP-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// COMP: omp.loop.exit:
|
|
// COMP-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// COMP-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// COMP-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// COMP-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// COMP-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// COMP-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.2, ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// COMP-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// COMP-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// COMP-NEXT: ]
|
|
// COMP: .omp.reduction.case1:
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.case2:
|
|
// COMP-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 4
|
|
// COMP-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.default:
|
|
// COMP-NEXT: br label [[OMP_PRECOND_END]]
|
|
// COMP: omp.precond.end:
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.2
|
|
// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// COMP-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// COMP-NEXT: [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointpLERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp_outlined..3
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// COMP-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// COMP-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// COMP-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// COMP-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// COMP-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// COMP-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[I]], align 4
|
|
// COMP-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// COMP-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// COMP: omp.precond.then:
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// COMP-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// COMP-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// COMP-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// COMP: cond.true:
|
|
// COMP-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: br label [[COND_END:%.*]]
|
|
// COMP: cond.false:
|
|
// COMP-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: br label [[COND_END]]
|
|
// COMP: cond.end:
|
|
// COMP-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// COMP-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// COMP: omp.inner.for.cond:
|
|
// COMP-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// COMP-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// COMP-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// COMP: omp.inner.for.body:
|
|
// COMP-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// COMP-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// COMP-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// COMP-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// COMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// COMP: omp.body.continue:
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// COMP: omp.inner.for.inc:
|
|
// COMP-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// COMP-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// COMP: omp.inner.for.end:
|
|
// COMP-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// COMP: omp.loop.exit:
|
|
// COMP-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// COMP-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// COMP-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// COMP-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// COMP-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// COMP-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.4, ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// COMP-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// COMP-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// COMP-NEXT: ]
|
|
// COMP: .omp.reduction.case1:
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.case2:
|
|
// COMP-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 4
|
|
// COMP-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.default:
|
|
// COMP-NEXT: br label [[OMP_PRECOND_END]]
|
|
// COMP: omp.precond.end:
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.4
|
|
// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// COMP-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// COMP-NEXT: [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointmLERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp_outlined..5
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// COMP-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// COMP-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// COMP-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// COMP-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// COMP-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// COMP-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[I]], align 4
|
|
// COMP-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// COMP-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// COMP: omp.precond.then:
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// COMP-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// COMP-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// COMP-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// COMP: cond.true:
|
|
// COMP-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: br label [[COND_END:%.*]]
|
|
// COMP: cond.false:
|
|
// COMP-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: br label [[COND_END]]
|
|
// COMP: cond.end:
|
|
// COMP-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// COMP-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// COMP: omp.inner.for.cond:
|
|
// COMP-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// COMP-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// COMP-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// COMP: omp.inner.for.body:
|
|
// COMP-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// COMP-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// COMP-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// COMP-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// COMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// COMP: omp.body.continue:
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// COMP: omp.inner.for.inc:
|
|
// COMP-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// COMP-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// COMP: omp.inner.for.end:
|
|
// COMP-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// COMP: omp.loop.exit:
|
|
// COMP-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// COMP-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// COMP-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// COMP-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// COMP-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// COMP-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.6, ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// COMP-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// COMP-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// COMP-NEXT: ]
|
|
// COMP: .omp.reduction.case1:
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.case2:
|
|
// COMP-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 4
|
|
// COMP-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.default:
|
|
// COMP-NEXT: br label [[OMP_PRECOND_END]]
|
|
// COMP: omp.precond.end:
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.6
|
|
// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// COMP-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// COMP-NEXT: [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaNERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp_outlined..7
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// COMP-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// COMP-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// COMP-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// COMP-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// COMP-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// COMP-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[I]], align 4
|
|
// COMP-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// COMP-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// COMP: omp.precond.then:
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// COMP-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// COMP-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// COMP-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// COMP: cond.true:
|
|
// COMP-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: br label [[COND_END:%.*]]
|
|
// COMP: cond.false:
|
|
// COMP-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: br label [[COND_END]]
|
|
// COMP: cond.end:
|
|
// COMP-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// COMP-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// COMP: omp.inner.for.cond:
|
|
// COMP-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// COMP-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// COMP-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// COMP: omp.inner.for.body:
|
|
// COMP-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// COMP-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// COMP-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// COMP-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// COMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// COMP: omp.body.continue:
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// COMP: omp.inner.for.inc:
|
|
// COMP-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// COMP-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// COMP: omp.inner.for.end:
|
|
// COMP-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// COMP: omp.loop.exit:
|
|
// COMP-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// COMP-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// COMP-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// COMP-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// COMP-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// COMP-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.8, ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// COMP-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// COMP-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// COMP-NEXT: ]
|
|
// COMP: .omp.reduction.case1:
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.case2:
|
|
// COMP-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 4
|
|
// COMP-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.default:
|
|
// COMP-NEXT: br label [[OMP_PRECOND_END]]
|
|
// COMP: omp.precond.end:
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.8
|
|
// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// COMP-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// COMP-NEXT: [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointoRERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp_outlined..9
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// COMP-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// COMP-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// COMP-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// COMP-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// COMP-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// COMP-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[I]], align 4
|
|
// COMP-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// COMP-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// COMP: omp.precond.then:
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// COMP-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// COMP-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// COMP-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// COMP: cond.true:
|
|
// COMP-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: br label [[COND_END:%.*]]
|
|
// COMP: cond.false:
|
|
// COMP-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: br label [[COND_END]]
|
|
// COMP: cond.end:
|
|
// COMP-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// COMP-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// COMP: omp.inner.for.cond:
|
|
// COMP-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// COMP-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// COMP-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// COMP: omp.inner.for.body:
|
|
// COMP-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// COMP-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// COMP-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// COMP-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// COMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// COMP: omp.body.continue:
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// COMP: omp.inner.for.inc:
|
|
// COMP-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// COMP-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// COMP: omp.inner.for.end:
|
|
// COMP-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// COMP: omp.loop.exit:
|
|
// COMP-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// COMP-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// COMP-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// COMP-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// COMP-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// COMP-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.10, ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// COMP-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// COMP-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// COMP-NEXT: ]
|
|
// COMP: .omp.reduction.case1:
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.case2:
|
|
// COMP-NEXT: [[TMP28:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP29:%.*]] = load i32, ptr [[TMP28]], align 4
|
|
// COMP-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP29]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.default:
|
|
// COMP-NEXT: br label [[OMP_PRECOND_END]]
|
|
// COMP: omp.precond.end:
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.10
|
|
// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// COMP-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// COMP-NEXT: [[CALL:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointeOERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp_outlined..11
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// COMP-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// COMP-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// COMP-NEXT: [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// COMP-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// COMP-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// COMP-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// COMP-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// COMP-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[I]], align 4
|
|
// COMP-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// COMP-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// COMP: omp.precond.then:
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// COMP-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// COMP-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// COMP-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// COMP: cond.true:
|
|
// COMP-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: br label [[COND_END:%.*]]
|
|
// COMP: cond.false:
|
|
// COMP-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: br label [[COND_END]]
|
|
// COMP: cond.end:
|
|
// COMP-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// COMP-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// COMP: omp.inner.for.cond:
|
|
// COMP-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// COMP-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// COMP-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// COMP: omp.inner.for.body:
|
|
// COMP-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// COMP-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// COMP-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// COMP-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// COMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// COMP: omp.body.continue:
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// COMP: omp.inner.for.inc:
|
|
// COMP-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// COMP-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// COMP: omp.inner.for.end:
|
|
// COMP-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// COMP: omp.loop.exit:
|
|
// COMP-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// COMP-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// COMP-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// COMP-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// COMP-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// COMP-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.12, ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// COMP-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// COMP-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// COMP-NEXT: ]
|
|
// COMP: .omp.reduction.case1:
|
|
// COMP-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointaaERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// COMP-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.case2:
|
|
// COMP-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 4
|
|
// COMP-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// COMP-NEXT: [[CALL11:%.*]] = call i64 @_ZNK5PointaaERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// COMP-NEXT: store i64 [[CALL11]], ptr [[REF_TMP10]], align 4
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.default:
|
|
// COMP-NEXT: br label [[OMP_PRECOND_END]]
|
|
// COMP: omp.precond.end:
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.12
|
|
// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// COMP-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// COMP-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// COMP-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointaaERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// COMP-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// COMP-NEXT: [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp_outlined..13
|
|
// 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:%.*]]) #[[ATTR2]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[N_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[RED_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[POINTS_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[TMP:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[I:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[RED3:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// COMP-NEXT: [[I4:%.*]] = alloca i32, align 4
|
|
// COMP-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8
|
|
// COMP-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// COMP-NEXT: [[REF_TMP10:%.*]] = alloca [[STRUCT_POINT]], align 4
|
|
// COMP-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[N]], ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[RED]], ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: store ptr [[POINTS]], ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[N_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[RED_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[POINTS_ADDR]], align 8
|
|
// COMP-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4
|
|
// COMP-NEXT: store i32 [[TMP3]], ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[SUB:%.*]] = sub i32 [[TMP4]], 0
|
|
// COMP-NEXT: [[DIV:%.*]] = udiv i32 [[SUB]], 1
|
|
// COMP-NEXT: [[SUB2:%.*]] = sub i32 [[DIV]], 1
|
|
// COMP-NEXT: store i32 [[SUB2]], ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[I]], align 4
|
|
// COMP-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
|
|
// COMP-NEXT: [[CMP:%.*]] = icmp ult i32 0, [[TMP5]]
|
|
// COMP-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
|
// COMP: omp.precond.then:
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: store i32 [[TMP6]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
|
|
// COMP-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
|
|
// COMP-NEXT: call void @_ZN5PointC1Ev(ptr nonnull align 4 dereferenceable(8) [[RED3]]) #[[ATTR4]]
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP7]], align 4
|
|
// 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)
|
|
// COMP-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP10:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[TMP9]], [[TMP10]]
|
|
// COMP-NEXT: br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
|
// COMP: cond.true:
|
|
// COMP-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_1]], align 4
|
|
// COMP-NEXT: br label [[COND_END:%.*]]
|
|
// COMP: cond.false:
|
|
// COMP-NEXT: [[TMP12:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: br label [[COND_END]]
|
|
// COMP: cond.end:
|
|
// COMP-NEXT: [[COND:%.*]] = phi i32 [ [[TMP11]], [[COND_TRUE]] ], [ [[TMP12]], [[COND_FALSE]] ]
|
|
// COMP-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[TMP13:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
|
|
// COMP-NEXT: store i32 [[TMP13]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
|
// COMP: omp.inner.for.cond:
|
|
// COMP-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[TMP15:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
|
|
// COMP-NEXT: [[ADD:%.*]] = add i32 [[TMP15]], 1
|
|
// COMP-NEXT: [[CMP6:%.*]] = icmp ult i32 [[TMP14]], [[ADD]]
|
|
// COMP-NEXT: br i1 [[CMP6]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
|
|
// COMP: omp.inner.for.body:
|
|
// COMP-NEXT: [[TMP16:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[MUL:%.*]] = mul i32 [[TMP16]], 1
|
|
// COMP-NEXT: [[ADD7:%.*]] = add i32 0, [[MUL]]
|
|
// COMP-NEXT: store i32 [[ADD7]], ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP17:%.*]] = load i32, ptr [[I4]], align 4
|
|
// COMP-NEXT: [[TMP18:%.*]] = load ptr, ptr [[TMP2]], align 8
|
|
// COMP-NEXT: call void @_Z4workR5PointiPKS_(ptr nonnull align 4 dereferenceable(8) [[RED3]], i32 [[TMP17]], ptr [[TMP18]])
|
|
// COMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
|
// COMP: omp.body.continue:
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
|
|
// COMP: omp.inner.for.inc:
|
|
// COMP-NEXT: [[TMP19:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: [[ADD8:%.*]] = add i32 [[TMP19]], 1
|
|
// COMP-NEXT: store i32 [[ADD8]], ptr [[DOTOMP_IV]], align 4
|
|
// COMP-NEXT: br label [[OMP_INNER_FOR_COND]]
|
|
// COMP: omp.inner.for.end:
|
|
// COMP-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
|
// COMP: omp.loop.exit:
|
|
// COMP-NEXT: [[TMP20:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 4
|
|
// COMP-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP21]])
|
|
// COMP-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0
|
|
// COMP-NEXT: store ptr [[RED3]], ptr [[TMP22]], align 8
|
|
// COMP-NEXT: [[TMP24:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP25:%.*]] = load i32, ptr [[TMP24]], align 4
|
|
// COMP-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], i32 1, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @.omp.reduction.reduction_func.14, ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: switch i32 [[TMP27]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [
|
|
// COMP-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]]
|
|
// COMP-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]]
|
|
// COMP-NEXT: ]
|
|
// COMP: .omp.reduction.case1:
|
|
// COMP-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointooERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// COMP-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_reduce_nowait(ptr @[[GLOB2]], i32 [[TMP25]], ptr @.gomp_critical_user_.reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.case2:
|
|
// COMP-NEXT: [[TMP29:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
|
|
// COMP-NEXT: [[TMP30:%.*]] = load i32, ptr [[TMP29]], align 4
|
|
// COMP-NEXT: call void @__kmpc_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// COMP-NEXT: [[CALL11:%.*]] = call i64 @_ZNK5PointooERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP1]], ptr nonnull align 4 dereferenceable(8) [[RED3]])
|
|
// COMP-NEXT: store i64 [[CALL11]], ptr [[REF_TMP10]], align 4
|
|
// 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]])
|
|
// COMP-NEXT: call void @__kmpc_end_critical(ptr @[[GLOB3]], i32 [[TMP30]], ptr @.gomp_critical_user_.atomic_reduction.var)
|
|
// COMP-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]]
|
|
// COMP: .omp.reduction.default:
|
|
// COMP-NEXT: br label [[OMP_PRECOND_END]]
|
|
// COMP: omp.precond.end:
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.14
|
|
// COMP-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) #[[ATTR5]] {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[DOTADDR1:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_POINT:%.*]], align 4
|
|
// COMP-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: store ptr [[TMP1]], ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[DOTADDR]], align 8
|
|
// COMP-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR1]], align 8
|
|
// COMP-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8
|
|
// COMP-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP2]], i64 0, i64 0
|
|
// COMP-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8
|
|
// COMP-NEXT: [[CALL:%.*]] = call i64 @_ZNK5PointooERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[TMP7]])
|
|
// COMP-NEXT: store i64 [[CALL]], ptr [[REF_TMP]], align 4
|
|
// COMP-NEXT: [[CALL2:%.*]] = call nonnull align 4 dereferenceable(8) ptr @_ZN5PointaSERKS_(ptr nonnull align 4 dereferenceable(8) [[TMP10]], ptr nonnull align 4 dereferenceable(8) [[REF_TMP]])
|
|
// COMP-NEXT: ret void
|
|
//
|
|
//
|
|
// COMP-LABEL: define {{[^@]+}}@_ZN5PointC2Ev
|
|
// COMP-SAME: (ptr nonnull align 4 dereferenceable(8) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 {
|
|
// COMP-NEXT: entry:
|
|
// COMP-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8
|
|
// COMP-NEXT: store ptr [[THIS]], ptr [[THIS_ADDR]], align 8
|
|
// COMP-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8
|
|
// COMP-NEXT: [[X:%.*]] = getelementptr inbounds [[STRUCT_POINT:%.*]], ptr [[THIS1]], i32 0, i32 0
|
|
// COMP-NEXT: store i32 0, ptr [[X]], align 4
|
|
// COMP-NEXT: [[Y:%.*]] = getelementptr inbounds [[STRUCT_POINT]], ptr [[THIS1]], i32 0, i32 1
|
|
// COMP-NEXT: store i32 0, ptr [[Y]], align 4
|
|
// COMP-NEXT: ret void
|
|
//
|