Skip to content

Commit b7cfed0

Browse files
committed
[OpenMP][flang][MLIR] Decouple alloc, init, and copy regions for omp.private|reduction ops
This PR changes the emitted block structure of alloc, init, and copy regions for `omp.private` and `omp.declare_reduction` ops a little bit. In particular, this decouples init and copy regions from the alloca insertion-point. The main motivation is fix "Instruction does not dominate all uses!" errors that happen specially when an init region uses a value from the OpenMP region it is being inlined into. The issue happens because, previous to this PR, we inline the init region right after the latest alloc block (since we used the alloca IP); which in some cases (see exmaple below), is too early and causes the use dominance issue. Example that would break without this PR (when delayed privatization is enabled for `omp.wsloop`s): ```fortran subroutine test2 (xyz) integer :: i integer :: xyz(:) !$omp target map(from:xyz) !$omp do private(xyz) do i = 1, 10 xyz(i) = i end do !$omp end target end subroutine ```
1 parent 8c36665 commit b7cfed0

File tree

6 files changed

+185
-125
lines changed

6 files changed

+185
-125
lines changed

flang/test/Integration/OpenMP/parallel-private-reduction-worstcase.f90

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -32,46 +32,52 @@ subroutine worst_case(a, b, c, d)
3232
! CHECK-LABEL: define internal void @worst_case_..omp_par
3333
! CHECK-NEXT: omp.par.entry:
3434
! [reduction alloc regions inlined here]
35-
! CHECK: br label %omp.private.init
35+
! CHECK: br label %omp.region.after_alloca
3636

37-
! CHECK: omp.private.init: ; preds = %omp.par.entry
38-
! CHECK-NEXT: br label %omp.private.init7
37+
! CHECK: omp.region.after_alloca:
38+
! CHECK-NEXT: br label %omp.par.region
39+
40+
! CHECK: omp.par.region:
41+
! CHECK-NEXT: br label %omp.private.init
42+
43+
! CHECK: omp.private.init:
44+
! CHECK-NEXT: br label %omp.private.init2
3945

40-
! CHECK: omp.private.init7: ; preds = %omp.private.init
46+
! CHECK: omp.private.init2:
4147
! [begin private alloc for first var]
4248
! [read the length from the mold argument]
4349
! [if it is non-zero...]
44-
! CHECK: br i1 {{.*}}, label %omp.private.init8, label %omp.private.init9
50+
! CHECK: br i1 %{{.*}}, label %omp.private.init3, label %omp.private.init4
4551

46-
! CHECK: omp.private.init9: ; preds = %omp.private.init7
47-
! [finish private alloc for first var with zero extent]
48-
! CHECK: br label %omp.private.init10
52+
! CHECK: omp.private.init4: ; preds = %omp.private.init2
53+
! [finish private alloc for second var with zero extent]
54+
! CHECK: br label %omp.private.init5
4955

50-
! CHECK: omp.private.init10: ; preds = %omp.private.init8, %omp.private.init9
51-
! CHECK-NEXT: br label %omp.region.cont6
56+
! CHECK: omp.private.init5: ; preds = %omp.private.init3, %omp.private.init4
57+
! CHECK-NEXT: br label %omp.region.cont
5258

53-
! CHECK: omp.region.cont6: ; preds = %omp.private.init10
59+
! CHECK: omp.region.cont: ; preds = %omp.private.init5
5460
! CHECK-NEXT: %{{.*}} = phi ptr
55-
! CHECK-NEXT: br label %omp.private.init1
61+
! CHECK-NEXT: br label %omp.private.init7
5662

57-
! CHECK: omp.private.init1: ; preds = %omp.region.cont6
63+
! CHECK: omp.private.init7:
5864
! [begin private alloc for first var]
5965
! [read the length from the mold argument]
6066
! [if it is non-zero...]
61-
! CHECK: br i1 %{{.*}}, label %omp.private.init2, label %omp.private.init3
67+
! CHECK: br i1 {{.*}}, label %omp.private.init8, label %omp.private.init9
6268

63-
! CHECK: omp.private.init3: ; preds = %omp.private.init1
64-
! [finish private alloc for second var with zero extent]
65-
! CHECK: br label %omp.private.init4
69+
! CHECK: omp.private.init9: ; preds = %omp.private.init7
70+
! [finish private alloc for first var with zero extent]
71+
! CHECK: br label %omp.private.init10
6672

67-
! CHECK: omp.private.init4: ; preds = %omp.private.init2, %omp.private.init3
68-
! CHECK-NEXT: br label %omp.region.cont
73+
! CHECK: omp.private.init10: ; preds = %omp.private.init8, %omp.private.init9
74+
! CHECK-NEXT: br label %omp.region.cont6
6975

70-
! CHECK: omp.region.cont: ; preds = %omp.private.init4
76+
! CHECK: omp.region.cont6: ; preds = %omp.private.init10
7177
! CHECK-NEXT: %{{.*}} = phi ptr
7278
! CHECK-NEXT: br label %omp.private.copy
7379

74-
! CHECK: omp.private.copy: ; preds = %omp.region.cont
80+
! CHECK: omp.private.copy:
7581
! CHECK-NEXT: br label %omp.private.copy12
7682

7783
! CHECK: omp.private.copy12: ; preds = %omp.private.copy
@@ -96,15 +102,9 @@ subroutine worst_case(a, b, c, d)
96102

97103
! CHECK: omp.region.cont15: ; preds = %omp.private.copy18
98104
! CHECK-NEXT: %{{.*}} = phi ptr
99-
! CHECK-NEXT: br label %omp.region.after_alloca
100-
101-
! CHECK: omp.region.after_alloca:
102-
! CHECK-NEXT: br label %omp.par.region
103-
104-
! CHECK: omp.par.region: ; preds = %omp.region.after_alloca
105105
! CHECK-NEXT: br label %omp.reduction.init
106106

107-
! CHECK: omp.reduction.init: ; preds = %omp.par.region
107+
! CHECK: omp.reduction.init: ; preds = %omp.region.cont15
108108
! [deffered stores for results of reduction alloc regions]
109109
! CHECK: br label %[[VAL_96:.*]]
110110

@@ -211,13 +211,13 @@ subroutine worst_case(a, b, c, d)
211211
! [source length was non-zero: call assign runtime]
212212
! CHECK: br label %omp.private.copy14
213213

214-
! CHECK: omp.private.init2: ; preds = %omp.private.init1
215-
! [var extent was non-zero: malloc a private array]
216-
! CHECK: br label %omp.private.init4
217-
218214
! CHECK: omp.private.init8: ; preds = %omp.private.init7
219215
! [var extent was non-zero: malloc a private array]
220216
! CHECK: br label %omp.private.init10
221217

218+
! CHECK: omp.private.init3: ; preds = %omp.private.init2
219+
! [var extent was non-zero: malloc a private array]
220+
! CHECK: br label %omp.private.init5
221+
222222
! CHECK: omp.par.outlined.exit.exitStub: ; preds = %omp.region.cont52
223223
! CHECK-NEXT: ret void

0 commit comments

Comments
 (0)