Skip to content

Commit ce80323

Browse files
[Flang][OpenMP] Use simdloop operation only for omp simd pragma (#79559)
OpenMP standard differentiates between omp simd (2.9.3.1) and omp do/for simd (2.9.3.2 for OpenMP 5.0 standard) pragmas. The first one describes the loop which needs to be vectorized. The second pragma describes the loop which needs to be workshared between existing threads. Each thread can use SIMD instructions to execute its chunk of the loop. That's why we need to model ``` !$omp simd do-loop ``` as `omp.simdloop` operation and add compiler hints for vectorization. The worksharing loop: !$omp do simd do-loop should be represented as worksharing loop (`omp.wsloop`). Currently Flang denotes both types of OpenMP pragmas by `omp.simdloop` operation. In consequence we cannot differentiate between: ``` !$omp parallel simd do-loop ``` and ``` !$omp parallel do simd do-loop ``` The second loop should be workshared between multiple threads. The first one describes the loop which needs to be redundantly executed by multiple threads. Current Flang implementation does not perform worksharing for `!$omp do simd` pragma and generates valid code only for the first case.
1 parent 9f80ecb commit ce80323

File tree

9 files changed

+120
-50
lines changed

9 files changed

+120
-50
lines changed

flang/lib/Lower/OpenMP.cpp

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3317,6 +3317,29 @@ static void createWsLoop(Fortran::lower::AbstractConverter &converter,
33173317
/*outer=*/false, &dsp);
33183318
}
33193319

3320+
static void createSimdWsLoop(
3321+
Fortran::lower::AbstractConverter &converter,
3322+
Fortran::lower::pft::Evaluation &eval, llvm::omp::Directive ompDirective,
3323+
const Fortran::parser::OmpClauseList &beginClauseList,
3324+
const Fortran::parser::OmpClauseList *endClauseList, mlir::Location loc) {
3325+
ClauseProcessor cp(converter, beginClauseList);
3326+
cp.processTODO<
3327+
Fortran::parser::OmpClause::Aligned, Fortran::parser::OmpClause::Allocate,
3328+
Fortran::parser::OmpClause::Linear, Fortran::parser::OmpClause::Safelen,
3329+
Fortran::parser::OmpClause::Simdlen, Fortran::parser::OmpClause::Order>(
3330+
loc, ompDirective);
3331+
// TODO: Add support for vectorization - add vectorization hints inside loop
3332+
// body.
3333+
// OpenMP standard does not specify the length of vector instructions.
3334+
// Currently we safely assume that for !$omp do simd pragma the SIMD length
3335+
// is equal to 1 (i.e. we generate standard workshare loop).
3336+
// When support for vectorization is enabled, then we need to add handling of
3337+
// if clause. Currently if clause can be skipped because we always assume
3338+
// SIMD length = 1.
3339+
createWsLoop(converter, eval, ompDirective, beginClauseList, endClauseList,
3340+
loc);
3341+
}
3342+
33203343
static void genOMP(Fortran::lower::AbstractConverter &converter,
33213344
Fortran::lower::SymMap &symTable,
33223345
Fortran::semantics::SemanticsContext &semanticsContext,
@@ -3383,8 +3406,13 @@ static void genOMP(Fortran::lower::AbstractConverter &converter,
33833406
")");
33843407
}
33853408

3386-
// 2.9.3.1 SIMD construct
3387-
if (llvm::omp::allSimdSet.test(ompDirective)) {
3409+
if (llvm::omp::allDoSimdSet.test(ompDirective)) {
3410+
// 2.9.3.2 Workshare SIMD construct
3411+
createSimdWsLoop(converter, eval, ompDirective, loopOpClauseList,
3412+
endClauseList, currentLocation);
3413+
3414+
} else if (llvm::omp::allSimdSet.test(ompDirective)) {
3415+
// 2.9.3.1 SIMD construct
33883416
createSimdLoop(converter, eval, ompDirective, loopOpClauseList,
33893417
currentLocation);
33903418
} else {

flang/test/Lower/OpenMP/FIR/if-clause.f90

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,23 +28,21 @@ program main
2828
! ----------------------------------------------------------------------------
2929
! DO SIMD
3030
! ----------------------------------------------------------------------------
31-
! CHECK: omp.simdloop
31+
! CHECK: omp.wsloop
3232
! CHECK-NOT: if({{.*}})
3333
! CHECK-SAME: {
3434
!$omp do simd
3535
do i = 1, 10
3636
end do
3737
!$omp end do simd
3838

39-
! CHECK: omp.simdloop
40-
! CHECK-SAME: if({{.*}})
39+
! CHECK: omp.wsloop
4140
!$omp do simd if(.true.)
4241
do i = 1, 10
4342
end do
4443
!$omp end do simd
4544

46-
! CHECK: omp.simdloop
47-
! CHECK-SAME: if({{.*}})
45+
! CHECK: omp.wsloop
4846
!$omp do simd if(simd: .true.)
4947
do i = 1, 10
5048
end do
@@ -103,7 +101,7 @@ program main
103101
! CHECK: omp.parallel
104102
! CHECK-NOT: if({{.*}})
105103
! CHECK-SAME: {
106-
! CHECK: omp.simdloop
104+
! CHECK: omp.wsloop
107105
! CHECK-NOT: if({{.*}})
108106
! CHECK-SAME: {
109107
!$omp parallel do simd
@@ -113,25 +111,23 @@ program main
113111

114112
! CHECK: omp.parallel
115113
! CHECK-SAME: if({{.*}})
116-
! CHECK: omp.simdloop
117-
! CHECK-SAME: if({{.*}})
114+
! CHECK: omp.wsloop
118115
!$omp parallel do simd if(.true.)
119116
do i = 1, 10
120117
end do
121118
!$omp end parallel do simd
122119

123120
! CHECK: omp.parallel
124121
! CHECK-SAME: if({{.*}})
125-
! CHECK: omp.simdloop
126-
! CHECK-SAME: if({{.*}})
122+
! CHECK: omp.wsloop
127123
!$omp parallel do simd if(parallel: .true.) if(simd: .false.)
128124
do i = 1, 10
129125
end do
130126
!$omp end parallel do simd
131127

132128
! CHECK: omp.parallel
133129
! CHECK-SAME: if({{.*}})
134-
! CHECK: omp.simdloop
130+
! CHECK: omp.wsloop
135131
! CHECK-NOT: if({{.*}})
136132
! CHECK-SAME: {
137133
!$omp parallel do simd if(parallel: .true.)
@@ -142,8 +138,7 @@ program main
142138
! CHECK: omp.parallel
143139
! CHECK-NOT: if({{.*}})
144140
! CHECK-SAME: {
145-
! CHECK: omp.simdloop
146-
! CHECK-SAME: if({{.*}})
141+
! CHECK: omp.wsloop
147142
!$omp parallel do simd if(simd: .true.)
148143
do i = 1, 10
149144
end do
@@ -306,7 +301,7 @@ program main
306301
! CHECK: omp.parallel
307302
! CHECK-NOT: if({{.*}})
308303
! CHECK-SAME: {
309-
! CHECK: omp.simdloop
304+
! CHECK: omp.wsloop
310305
! CHECK-NOT: if({{.*}})
311306
! CHECK-SAME: {
312307
!$omp target parallel do simd
@@ -318,8 +313,7 @@ program main
318313
! CHECK-SAME: if({{.*}})
319314
! CHECK: omp.parallel
320315
! CHECK-SAME: if({{.*}})
321-
! CHECK: omp.simdloop
322-
! CHECK-SAME: if({{.*}})
316+
! CHECK: omp.wsloop
323317
!$omp target parallel do simd if(.true.)
324318
do i = 1, 10
325319
end do
@@ -329,8 +323,7 @@ program main
329323
! CHECK-SAME: if({{.*}})
330324
! CHECK: omp.parallel
331325
! CHECK-SAME: if({{.*}})
332-
! CHECK: omp.simdloop
333-
! CHECK-SAME: if({{.*}})
326+
! CHECK: omp.wsloop
334327
!$omp target parallel do simd if(target: .true.) if(parallel: .false.) &
335328
!$omp& if(simd: .true.)
336329
do i = 1, 10
@@ -342,7 +335,7 @@ program main
342335
! CHECK: omp.parallel
343336
! CHECK-NOT: if({{.*}})
344337
! CHECK-SAME: {
345-
! CHECK: omp.simdloop
338+
! CHECK: omp.wsloop
346339
! CHECK-NOT: if({{.*}})
347340
! CHECK-SAME: {
348341
!$omp target parallel do simd if(target: .true.)
@@ -355,8 +348,7 @@ program main
355348
! CHECK-SAME: {
356349
! CHECK: omp.parallel
357350
! CHECK-SAME: if({{.*}})
358-
! CHECK: omp.simdloop
359-
! CHECK-SAME: if({{.*}})
351+
! CHECK: omp.wsloop
360352
!$omp target parallel do simd if(parallel: .true.) if(simd: .false.)
361353
do i = 1, 10
362354
end do

flang/test/Lower/OpenMP/FIR/loop-combined.f90

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ program main
2323
! ----------------------------------------------------------------------------
2424
! DO SIMD
2525
! ----------------------------------------------------------------------------
26-
! CHECK: omp.simdloop
26+
! CHECK: omp.wsloop
2727
!$omp do simd
2828
do i = 1, 10
2929
end do
@@ -33,7 +33,7 @@ program main
3333
! PARALLEL DO SIMD
3434
! ----------------------------------------------------------------------------
3535
! CHECK: omp.parallel
36-
! CHECK: omp.simdloop
36+
! CHECK: omp.wsloop
3737
!$omp parallel do simd
3838
do i = 1, 10
3939
end do
@@ -54,7 +54,7 @@ program main
5454
! ----------------------------------------------------------------------------
5555
! CHECK: omp.target
5656
! CHECK: omp.parallel
57-
! CHECK: omp.simdloop
57+
! CHECK: omp.wsloop
5858
!$omp target parallel do simd
5959
do i = 1, 10
6060
end do
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
! This test checks lowering of OpenMP do simd aligned() pragma
2+
3+
! RUN: %not_todo_cmd bbc -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
4+
! RUN: %not_todo_cmd %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
5+
subroutine testDoSimdAligned(int_array)
6+
use iso_c_binding
7+
type(c_ptr) :: int_array
8+
!CHECK: not yet implemented: Unhandled clause ALIGNED in DO SIMD construct
9+
!$omp do simd aligned(int_array)
10+
do index_ = 1, 10
11+
call c_test_call(int_array)
12+
end do
13+
!$omp end do simd
14+
15+
end subroutine testDoSimdAligned
16+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
! This test checks lowering of OpenMP do simd linear() pragma
2+
3+
! RUN: %not_todo_cmd bbc -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
4+
! RUN: %not_todo_cmd %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
5+
subroutine testDoSimdLinear(int_array)
6+
integer :: int_array(*)
7+
!CHECK: not yet implemented: Unhandled clause LINEAR in DO SIMD construct
8+
!$omp do simd linear(int_array)
9+
do index_ = 1, 10
10+
end do
11+
!$omp end do simd
12+
13+
end subroutine testDoSimdLinear
14+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
! This test checks lowering of OpenMP do simd safelen() pragma
2+
3+
! RUN: %not_todo_cmd bbc -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
4+
! RUN: %not_todo_cmd %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
5+
subroutine testDoSimdSafelen(int_array)
6+
integer :: int_array(*)
7+
!CHECK: not yet implemented: Unhandled clause SAFELEN in DO SIMD construct
8+
!$omp do simd safelen(4)
9+
do index_ = 1, 10
10+
end do
11+
!$omp end do simd
12+
13+
end subroutine testDoSimdSafelen
14+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
! This test checks lowering of OpenMP do simd simdlen() pragma
2+
3+
! RUN: %not_todo_cmd bbc -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
4+
! RUN: %not_todo_cmd %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
5+
subroutine testDoSimdSimdlen(int_array)
6+
integer :: int_array(*)
7+
!CHECK: not yet implemented: Unhandled clause SIMDLEN in DO SIMD construct
8+
!$omp do simd simdlen(4)
9+
do index_ = 1, 10
10+
end do
11+
!$omp end do simd
12+
13+
end subroutine testDoSimdSimdlen
14+

flang/test/Lower/OpenMP/if-clause.f90

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,23 +28,21 @@ program main
2828
! ----------------------------------------------------------------------------
2929
! DO SIMD
3030
! ----------------------------------------------------------------------------
31-
! CHECK: omp.simdloop
31+
! CHECK: omp.wsloop
3232
! CHECK-NOT: if({{.*}})
3333
! CHECK-SAME: {
3434
!$omp do simd
3535
do i = 1, 10
3636
end do
3737
!$omp end do simd
3838

39-
! CHECK: omp.simdloop
40-
! CHECK-SAME: if({{.*}})
39+
! CHECK: omp.wsloop
4140
!$omp do simd if(.true.)
4241
do i = 1, 10
4342
end do
4443
!$omp end do simd
4544

46-
! CHECK: omp.simdloop
47-
! CHECK-SAME: if({{.*}})
45+
! CHECK: omp.wsloop
4846
!$omp do simd if(simd: .true.)
4947
do i = 1, 10
5048
end do
@@ -103,7 +101,7 @@ program main
103101
! CHECK: omp.parallel
104102
! CHECK-NOT: if({{.*}})
105103
! CHECK-SAME: {
106-
! CHECK: omp.simdloop
104+
! CHECK: omp.wsloop
107105
! CHECK-NOT: if({{.*}})
108106
! CHECK-SAME: {
109107
!$omp parallel do simd
@@ -113,25 +111,23 @@ program main
113111

114112
! CHECK: omp.parallel
115113
! CHECK-SAME: if({{.*}})
116-
! CHECK: omp.simdloop
117-
! CHECK-SAME: if({{.*}})
114+
! CHECK: omp.wsloop
118115
!$omp parallel do simd if(.true.)
119116
do i = 1, 10
120117
end do
121118
!$omp end parallel do simd
122119

123120
! CHECK: omp.parallel
124121
! CHECK-SAME: if({{.*}})
125-
! CHECK: omp.simdloop
126-
! CHECK-SAME: if({{.*}})
122+
! CHECK: omp.wsloop
127123
!$omp parallel do simd if(parallel: .true.) if(simd: .false.)
128124
do i = 1, 10
129125
end do
130126
!$omp end parallel do simd
131127

132128
! CHECK: omp.parallel
133129
! CHECK-SAME: if({{.*}})
134-
! CHECK: omp.simdloop
130+
! CHECK: omp.wsloop
135131
! CHECK-NOT: if({{.*}})
136132
! CHECK-SAME: {
137133
!$omp parallel do simd if(parallel: .true.)
@@ -142,8 +138,7 @@ program main
142138
! CHECK: omp.parallel
143139
! CHECK-NOT: if({{.*}})
144140
! CHECK-SAME: {
145-
! CHECK: omp.simdloop
146-
! CHECK-SAME: if({{.*}})
141+
! CHECK: omp.wsloop
147142
!$omp parallel do simd if(simd: .true.)
148143
do i = 1, 10
149144
end do
@@ -306,7 +301,7 @@ program main
306301
! CHECK: omp.parallel
307302
! CHECK-NOT: if({{.*}})
308303
! CHECK-SAME: {
309-
! CHECK: omp.simdloop
304+
! CHECK: omp.wsloop
310305
! CHECK-NOT: if({{.*}})
311306
! CHECK-SAME: {
312307
!$omp target parallel do simd
@@ -318,8 +313,7 @@ program main
318313
! CHECK-SAME: if({{.*}})
319314
! CHECK: omp.parallel
320315
! CHECK-SAME: if({{.*}})
321-
! CHECK: omp.simdloop
322-
! CHECK-SAME: if({{.*}})
316+
! CHECK: omp.wsloop
323317
!$omp target parallel do simd if(.true.)
324318
do i = 1, 10
325319
end do
@@ -329,8 +323,7 @@ program main
329323
! CHECK-SAME: if({{.*}})
330324
! CHECK: omp.parallel
331325
! CHECK-SAME: if({{.*}})
332-
! CHECK: omp.simdloop
333-
! CHECK-SAME: if({{.*}})
326+
! CHECK: omp.wsloop
334327
!$omp target parallel do simd if(target: .true.) if(parallel: .false.) &
335328
!$omp& if(simd: .true.)
336329
do i = 1, 10
@@ -342,7 +335,7 @@ program main
342335
! CHECK: omp.parallel
343336
! CHECK-NOT: if({{.*}})
344337
! CHECK-SAME: {
345-
! CHECK: omp.simdloop
338+
! CHECK: omp.wsloop
346339
! CHECK-NOT: if({{.*}})
347340
! CHECK-SAME: {
348341
!$omp target parallel do simd if(target: .true.)
@@ -355,8 +348,7 @@ program main
355348
! CHECK-SAME: {
356349
! CHECK: omp.parallel
357350
! CHECK-SAME: if({{.*}})
358-
! CHECK: omp.simdloop
359-
! CHECK-SAME: if({{.*}})
351+
! CHECK: omp.wsloop
360352
!$omp target parallel do simd if(parallel: .true.) if(simd: .false.)
361353
do i = 1, 10
362354
end do

0 commit comments

Comments
 (0)