102 lines · plain
1!===----------------------------------------------------------------------===!2! This directory can be used to add Integration tests involving multiple3! stages of the compiler (for eg. from Fortran to LLVM IR). It should not4! contain executable tests. We should only add tests here sparingly and only5! if there is no other way to test. Repeat this message in each test that is6! added to this directory and sub-directories.7!===----------------------------------------------------------------------===!8 9!RUN: %flang_fc1 -emit-llvm -fopenmp %s -o - | FileCheck %s10 11!CHECK-DAG: define internal void @_copy_box_Uxi32(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})12!CHECK-DAG: define internal void @_copy_box_10xi32(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})13!CHECK-DAG: define internal void @_copy_i64(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})14!CHECK-DAG: define internal void @_copy_box_Uxi64(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})15!CHECK-DAG: define internal void @_copy_f32(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})16!CHECK-DAG: define internal void @_copy_box_2x3xf32(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})17!CHECK-DAG: define internal void @_copy_z32(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})18!CHECK-DAG: define internal void @_copy_box_10xz32(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})19!CHECK-DAG: define internal void @_copy_l32(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})20!CHECK-DAG: define internal void @_copy_box_5xl32(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})21!CHECK-DAG: define internal void @_copy_c8x8(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})22!CHECK-DAG: define internal void @_copy_box_10xc8x8(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})23!CHECK-DAG: define internal void @_copy_c16x5(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})24!CHECK-DAG: define internal void @_copy_rec__QFtest_typesTdt(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})25!CHECK-DAG: define internal void @_copy_box_heap_Uxi32(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})26!CHECK-DAG: define internal void @_copy_box_ptr_Uxc8x9(ptr {{[^%]*}}%{{.*}}, ptr {{[^%]*}}%{{.*}})27 28!CHECK-LABEL: define internal void @_copy_i32(29!CHECK-SAME: ptr {{[^%]*}}%[[DST:.*]], ptr {{[^%]*}}%[[SRC:.*]]){{.*}} {30!CHECK-NEXT: %[[SRC_VAL:.*]] = load i32, ptr %[[SRC]]31!CHECK-NEXT: store i32 %[[SRC_VAL]], ptr %[[DST]]32!CHECK-NEXT: ret void33!CHECK-NEXT: }34 35!CHECK-LABEL: define internal void @test_scalar_..omp_par({{.*}})36!CHECK-NEXT: omp.par.entry:37!CHECK: %[[TID_ADDR:.*]] = alloca i32, align 438!CHECK: %[[I:.*]] = alloca i32, align 439!CHECK: %[[J:.*]] = alloca i32, align 440!CHECK: br label %[[OMP_REDUCTION_INIT:.*]]41 42!CHECK: %[[DID_IT:.*]] = alloca i3243!CHECK: store i32 0, ptr %[[DID_IT]]44!CHECK: %[[THREAD_NUM1:.*]] = call i32 @__kmpc_global_thread_num(ptr @[[LOC:.*]])45!CHECK: %[[RET:.*]] = call i32 @__kmpc_single({{.*}})46!CHECK: %[[NOT_ZERO:.*]] = icmp ne i32 %[[RET]], 047!CHECK: br i1 %[[NOT_ZERO]], label %[[OMP_REGION_BODY:.*]], label %[[OMP_REGION_END:.*]]48 49!CHECK: [[OMP_REGION_END]]:50!CHECK: %[[THREAD_NUM2:.*]] = call i32 @__kmpc_global_thread_num(ptr @[[LOC:.*]])51!CHECK: %[[DID_IT_VAL:.*]] = load i32, ptr %[[DID_IT]]52!CHECK: call void @__kmpc_copyprivate(ptr @[[LOC]], i32 %[[THREAD_NUM2]], i64 0, ptr %[[I]], ptr @_copy_i32, i32 %[[DID_IT_VAL]])53!CHECK: %[[THREAD_NUM3:.*]] = call i32 @__kmpc_global_thread_num(ptr @[[LOC]])54!CHECK: %[[DID_IT_VAL2:.*]] = load i32, ptr %[[DID_IT]]55!CHECK: call void @__kmpc_copyprivate(ptr @[[LOC]], i32 %[[THREAD_NUM3]], i64 0, ptr %[[J]], ptr @_copy_i32, i32 %[[DID_IT_VAL2]])56 57!CHECK: [[OMP_REGION_BODY]]:58!CHECK: br label %[[OMP_SINGLE_REGION:.*]]59!CHECK: [[OMP_SINGLE_REGION]]:60!CHECK: store i32 11, ptr %[[I]]61!CHECK: store i32 22, ptr %[[J]]62!CHECK: br label %[[OMP_REGION_CONT3:.*]]63!CHECK: [[OMP_REGION_CONT3:.*]]:64!CHECK: store i32 1, ptr %[[DID_IT]]65!CHECK: call void @__kmpc_end_single(ptr @[[LOC]], i32 %[[THREAD_NUM1]])66!CHECK: br label %[[OMP_REGION_END]]67subroutine test_scalar()68 integer :: i, j69 70 !$omp parallel private(i, j)71 !$omp single72 i = 1173 j = 2274 !$omp end single copyprivate(i, j)75 !$omp end parallel76end subroutine77 78subroutine test_types(a, n)79 integer :: a(:), n80 integer(4) :: i4, i4a(10)81 integer(8) :: i8, i8a(n)82 real :: r, ra(2, 3)83 complex :: z, za(10)84 logical :: l, la(5)85 character(kind=1, len=8) :: c1, c1a(10)86 character(kind=2, len=5) :: c287 88 type dt89 integer :: i90 real :: r91 end type92 type(dt) :: t93 94 integer, allocatable :: aloc(:)95 character(kind=1, len=9), pointer :: ptr(:)96 97 !$omp parallel private(a, i4, i4a, i8, i8a, r, ra, z, za, l, la, c1, c1a, c2, t, aloc, ptr)98 !$omp single99 !$omp end single copyprivate(a, i4, i4a, i8, i8a, r, ra, z, za, l, la, c1, c1a, c2, t, aloc, ptr)100 !$omp end parallel101end subroutine102