xref: /llvm-project/flang/test/Lower/OpenMP/shared-loop.f90 (revision 8e10a3f80e264aaa186ab3cc74fea840f453c66d)
1! RUN: bbc -emit-hlfir -fopenmp %s -o - | FileCheck %s
2! RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
3
4! --- Check that with shared(i) the variable outside the parallel section
5! --- is updated.
6! CHECK-LABEL:  func.func @_QPomploop()
7! CHECK:    %[[ALLOC_I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFomploopEi"}
8! CHECK:    %[[DECL_I:.*]]:2 = hlfir.declare %[[ALLOC_I]] {uniq_name = "_QFomploopEi"} :
9! CHECK:    omp.parallel {
10! CHECK:      omp.sections {
11! CHECK:        omp.section {
12! CHECK:          %[[RES:.*]]:2 = fir.do_loop %[[ARG0:.*]] = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%[[ARG1:.*]] =
13! CHECK:            fir.store %[[ARG1]] to %[[DECL_I]]#1
14! CHECK:            %[[UPDATE_ITER:.*]] = arith.addi %[[ARG0]], %{{.*}}
15! CHECK:            %[[LOAD_I:.*]] = fir.load %[[DECL_I]]#1
16! CHECK:            %[[RES_I:.*]] = arith.addi %[[LOAD_I]], %{{.*}}
17! CHECK:            fir.result %[[UPDATE_ITER]], %[[RES_I]]
18! CHECK:          }
19! CHECK:          fir.store %[[RES]]#1 to %[[DECL_I]]#1
20! CHECK:          omp.terminator
21! CHECK:        }
22! CHECK:        omp.terminator
23! CHECK:      }
24! CHECK:      return
25! CHECK:    }
26subroutine omploop
27  implicit none
28  integer :: i, j
29  i = 1
30  j = 0
31  !$omp parallel shared(i)
32    !$omp sections
33      do i=1,10
34         j = j + i
35      end do
36    !$omp end sections
37  !$omp end parallel
38end subroutine
39
40! --- Check that with default(shared) the variable outside the parallel section
41! --- is NOT updated (i is private to the omp.parallel code)
42! CHECK-LABEL:  func.func @_QPomploop2()
43! CHECK:    %[[ALLOC_I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFomploop2Ei"}
44! CHECK:    %[[DECL_I:.*]]:2 = hlfir.declare %[[ALLOC_I]] {uniq_name = "_QFomploop2Ei"} :
45! CHECK:    omp.parallel {
46! CHECK:      %[[ALLOC_PRIV_I:.*]] = fir.alloca i32 {bindc_name = "i", pinned}
47! CHECK:      %[[DECL_PRIV_I:.*]]:2 = hlfir.declare %[[ALLOC_PRIV_I]]
48! CHECK:      omp.sections {
49! CHECK:        omp.section {
50! CHECK:          %[[RES:.*]]:2 = fir.do_loop %[[ARG0:.*]] = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%[[ARG1:.*]] =
51! CHECK-NOT:            fir.store %[[ARG1]] to %[[DECL_I]]#1
52! CHECK:            fir.store %[[ARG1]] to %[[DECL_PRIV_I]]#1
53! CHECK:            %[[UPDATE_ITER:.*]] = arith.addi %[[ARG0]], %{{.*}}
54! CHECK:            %[[LOAD_I:.*]] = fir.load %[[DECL_PRIV_I]]#1
55! CHECK:            %[[RES_I:.*]] = arith.addi %[[LOAD_I]], %{{.*}}
56! CHECK:            fir.result %[[UPDATE_ITER]], %[[RES_I]]
57! CHECK:          }
58! CHECK:          fir.store %[[RES]]#1 to %[[DECL_PRIV_I]]#1
59! CHECK:          omp.terminator
60! CHECK:        }
61! CHECK:        omp.terminator
62! CHECK:      }
63! CHECK:      return
64! CHECK:    }
65subroutine omploop2
66  implicit none
67  integer :: i, j
68  i = 1
69  j = 0
70  !$omp parallel default(shared)
71    !$omp sections
72      do i=1,10
73         j = j + i
74      end do
75    !$omp end sections
76  !$omp end parallel
77end subroutine
78
79
80! --- Check that with no data-sharing the variable outside the parallel section
81! --- is NOT updated (i is private to the omp.parallel code)
82! CHECK-LABEL:  func.func @_QPomploop3()
83! CHECK:    %[[ALLOC_I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFomploop3Ei"}
84! CHECK:    %[[DECL_I:.*]]:2 = hlfir.declare %[[ALLOC_I]] {uniq_name = "_QFomploop3Ei"} :
85! CHECK:    omp.parallel {
86! CHECK:      %[[ALLOC_PRIV_I:.*]] = fir.alloca i32 {bindc_name = "i", pinned}
87! CHECK:      %[[DECL_PRIV_I:.*]]:2 = hlfir.declare %[[ALLOC_PRIV_I]]
88! CHECK:      omp.sections {
89! CHECK:        omp.section {
90! CHECK:          %[[RES:.*]]:2 = fir.do_loop %[[ARG0:.*]] = %{{.*}} to %{{.*}} step %{{.*}} iter_args(%[[ARG1:.*]] =
91! CHECK-NOT:            fir.store %[[ARG1]] to %[[DECL_I]]#1
92! CHECK:            fir.store %[[ARG1]] to %[[DECL_PRIV_I]]#1
93! CHECK:            %[[UPDATE_ITER:.*]] = arith.addi %[[ARG0]], %{{.*}}
94! CHECK:            %[[LOAD_I:.*]] = fir.load %[[DECL_PRIV_I]]#1
95! CHECK:            %[[RES_I:.*]] = arith.addi %[[LOAD_I]], %{{.*}}
96! CHECK:            fir.result %[[UPDATE_ITER]], %[[RES_I]]
97! CHECK:          }
98! CHECK:          fir.store %[[RES]]#1 to %[[DECL_PRIV_I]]#1
99! CHECK:          omp.terminator
100! CHECK:        }
101! CHECK:        omp.terminator
102! CHECK:      }
103! CHECK:      return
104! CHECK:    }
105subroutine omploop3
106  implicit none
107  integer :: i, j
108  i = 1
109  j = 0
110  !$omp parallel
111    !$omp sections
112      do i=1,10
113         j = j + i
114      end do
115    !$omp end sections
116  !$omp end parallel
117end subroutine
118
119
120
121