Skip to content

Commit 10708df

Browse files
committed
[OpenMP][flang][MLIR] Decouple alloc, init, and copy regions for omp.private|declare_reduction ops (llvm#125699)
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 8bb2787 commit 10708df

File tree

6 files changed

+183
-124
lines changed

6 files changed

+183
-124
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
@@ -33,46 +33,52 @@ subroutine worst_case(a, b, c, d)
3333
! CHECK-LABEL: define internal void @worst_case_..omp_par
3434
! CHECK-NEXT: omp.par.entry:
3535
! [reduction alloc regions inlined here]
36-
! CHECK: br label %omp.private.init
36+
! CHECK: br label %omp.region.after_alloca
3737

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

41-
! CHECK: omp.private.init7: ; preds = %omp.private.init
47+
! CHECK: omp.private.init2:
4248
! [begin private alloc for first var]
4349
! [read the length from the mold argument]
4450
! [if it is non-zero...]
45-
! CHECK: br i1 {{.*}}, label %omp.private.init8, label %omp.private.init9
51+
! CHECK: br i1 %{{.*}}, label %omp.private.init3, label %omp.private.init4
4652

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

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

54-
! CHECK: omp.region.cont6: ; preds = %omp.private.init10
60+
! CHECK: omp.region.cont: ; preds = %omp.private.init5
5561
! CHECK-NEXT: %{{.*}} = phi ptr
56-
! CHECK-NEXT: br label %omp.private.init1
62+
! CHECK-NEXT: br label %omp.private.init7
5763

58-
! CHECK: omp.private.init1: ; preds = %omp.region.cont6
64+
! CHECK: omp.private.init7:
5965
! [begin private alloc for first var]
6066
! [read the length from the mold argument]
6167
! [if it is non-zero...]
62-
! CHECK: br i1 %{{.*}}, label %omp.private.init2, label %omp.private.init3
68+
! CHECK: br i1 {{.*}}, label %omp.private.init8, label %omp.private.init9
6369

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

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

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

75-
! CHECK: omp.private.copy: ; preds = %omp.region.cont
81+
! CHECK: omp.private.copy:
7682
! CHECK-NEXT: br label %omp.private.copy12
7783

7884
! CHECK: omp.private.copy12: ; preds = %omp.private.copy
@@ -97,15 +103,9 @@ subroutine worst_case(a, b, c, d)
97103

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

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

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

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

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

0 commit comments

Comments
 (0)