Skip to content

Commit 3785d74

Browse files
authored
[flang][OpenMP][LLVMIR] Support CFG and LLVM IR conversion for `omp.p… (#90164)
…rivate` Adds support for CFG conversion and conversion to LLVM IR for `omp.private` ops. This bridges a gap between FIR and LLVM to provide more support for lowering `omp.private` ops for things like allocatables.
1 parent 53cda4c commit 3785d74

File tree

7 files changed

+92
-13
lines changed

7 files changed

+92
-13
lines changed

flang/include/flang/Tools/CLOptions.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ void addNestedPassToOps(mlir::PassManager &pm, PassConstructor ctor) {
104104
void addNestedPassToAllTopLevelOperations(
105105
mlir::PassManager &pm, PassConstructor ctor) {
106106
addNestedPassToOps<mlir::func::FuncOp, mlir::omp::DeclareReductionOp,
107-
fir::GlobalOp>(pm, ctor);
107+
mlir::omp::PrivateClauseOp, fir::GlobalOp>(pm, ctor);
108108
}
109109

110110
void addNestedPassToAllTopLevelOperationsConditionally(mlir::PassManager &pm,

flang/lib/Optimizer/CodeGen/FIROpPatterns.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,9 @@ ConvertFIRToLLVMPattern::getBlockForAllocaInsert(mlir::Operation *op) const {
243243
return iface.getAllocaBlock();
244244
if (auto llvmFuncOp = mlir::dyn_cast<mlir::LLVM::LLVMFuncOp>(op))
245245
return &llvmFuncOp.front();
246+
if (auto ompPrivateOp = mlir::dyn_cast<mlir::omp::PrivateClauseOp>(op))
247+
return &ompPrivateOp.getAllocRegion().front();
248+
246249
return getBlockForAllocaInsert(op->getParentOp());
247250
}
248251

flang/test/Driver/bbc-mlir-pass-pipeline.f90

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@
1717
! CHECK-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
1818
! CHECK-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
1919

20-
! CHECK-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction']
20+
! CHECK-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
2121
! CHECK-NEXT: 'fir.global' Pipeline
2222
! CHECK-NEXT: CharacterConversion
2323
! CHECK-NEXT: 'func.func' Pipeline
2424
! CHECK-NEXT: ArrayValueCopy
2525
! CHECK-NEXT: CharacterConversion
2626
! CHECK-NEXT: 'omp.declare_reduction' Pipeline
2727
! CHECK-NEXT: CharacterConversion
28+
! CHECK-NEXT: 'omp.private' Pipeline
29+
! CHECK-NEXT: CharacterConversion
2830

2931
! CHECK-NEXT: Canonicalizer
3032
! CHECK-NEXT: SimplifyRegionLite
@@ -43,14 +45,16 @@
4345
! CHECK-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
4446
! CHECK-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
4547

46-
! CHECK-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction']
48+
! CHECK-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
4749
! CHECK-NEXT: 'fir.global' Pipeline
4850
! CHECK-NEXT: CFGConversion
4951
! CHECK-NEXT: 'func.func' Pipeline
5052
! CHECK-NEXT: PolymorphicOpConversion
5153
! CHECK-NEXT: CFGConversion
5254
! CHECK-NEXT: 'omp.declare_reduction' Pipeline
5355
! CHECK-NEXT: CFGConversion
56+
! CHECK-NEXT: 'omp.private' Pipeline
57+
! CHECK-NEXT: CFGConversion
5458

5559
! CHECK-NEXT: SCFToControlFlow
5660
! CHECK-NEXT: Canonicalizer

flang/test/Driver/mlir-debug-pass-pipeline.f90

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,16 @@
3939
! ALL-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
4040
! ALL-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
4141

42-
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction']
42+
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
4343
! ALL-NEXT: 'fir.global' Pipeline
4444
! ALL-NEXT: CharacterConversion
4545
! ALL-NEXT: 'func.func' Pipeline
4646
! ALL-NEXT: ArrayValueCopy
4747
! ALL-NEXT: CharacterConversion
4848
! ALL-NEXT: 'omp.declare_reduction' Pipeline
4949
! ALL-NEXT: CharacterConversion
50+
! ALL-NEXT: 'omp.private' Pipeline
51+
! ALL-NEXT: CharacterConversion
5052

5153
! ALL-NEXT: Canonicalizer
5254
! ALL-NEXT: SimplifyRegionLite
@@ -63,14 +65,16 @@
6365
! ALL-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
6466
! ALL-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
6567

66-
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction']
68+
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
6769
! ALL-NEXT: 'fir.global' Pipeline
6870
! ALL-NEXT: CFGConversion
6971
! ALL-NEXT: 'func.func' Pipeline
7072
! ALL-NEXT: PolymorphicOpConversion
7173
! ALL-NEXT: CFGConversion
7274
! ALL-NEXT: 'omp.declare_reduction' Pipeline
7375
! ALL-NEXT: CFGConversion
76+
! ALL-NEXT: 'omp.private' Pipeline
77+
! ALL-NEXT: CFGConversion
7478
! ALL-NEXT: SCFToControlFlow
7579
! ALL-NEXT: Canonicalizer
7680
! ALL-NEXT: SimplifyRegionLite
@@ -79,13 +83,15 @@
7983
! ALL-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
8084
! ALL-NEXT: BoxedProcedurePass
8185

82-
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction']
86+
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
8387
! ALL-NEXT: 'fir.global' Pipeline
8488
! ALL-NEXT: AbstractResultOpt
8589
! ALL-NEXT: 'func.func' Pipeline
8690
! ALL-NEXT: AbstractResultOpt
8791
! ALL-NEXT: 'omp.declare_reduction' Pipeline
8892
! ALL-NEXT: AbstractResultOpt
93+
! ALL-NEXT: 'omp.private' Pipeline
94+
! ALL-NEXT: AbstractResultOpt
8995

9096
! ALL-NEXT: CodeGenRewrite
9197
! ALL-NEXT: (S) 0 num-dce'd - Number of operations eliminated

flang/test/Driver/mlir-pass-pipeline.f90

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,16 @@
2828
! ALL-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
2929
! ALL-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
3030

31-
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction']
31+
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
3232
! ALL-NEXT: 'fir.global' Pipeline
3333
! ALL-NEXT: CharacterConversion
3434
! ALL-NEXT: 'func.func' Pipeline
3535
! ALL-NEXT: ArrayValueCopy
3636
! ALL-NEXT: CharacterConversion
3737
! ALL-NEXT: 'omp.declare_reduction' Pipeline
3838
! ALL-NEXT: CharacterConversion
39+
! ALL-NEXT: 'omp.private' Pipeline
40+
! ALL-NEXT: CharacterConversion
3941

4042
! ALL-NEXT: Canonicalizer
4143
! ALL-NEXT: SimplifyRegionLite
@@ -57,14 +59,16 @@
5759
! O2-NEXT: 'func.func' Pipeline
5860
! O2-NEXT: PolymorphicOpConversion
5961
! O2-NEXT: AddAliasTags
60-
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction']
62+
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
6163
! ALL-NEXT: 'fir.global' Pipeline
6264
! ALL-NEXT: CFGConversion
6365
! ALL-NEXT: 'func.func' Pipeline
6466
! NOTO2-NEXT: PolymorphicOpConversion
6567
! ALL-NEXT: CFGConversion
6668
! ALL-NEXT: 'omp.declare_reduction' Pipeline
6769
! ALL-NEXT: CFGConversion
70+
! ALL-NEXT: 'omp.private' Pipeline
71+
! ALL-NEXT: CFGConversion
6872

6973
! ALL-NEXT: SCFToControlFlow
7074
! ALL-NEXT: Canonicalizer
@@ -74,13 +78,15 @@
7478
! ALL-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
7579
! ALL-NEXT: BoxedProcedurePass
7680

77-
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction']
81+
! ALL-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
7882
! ALL-NEXT: 'fir.global' Pipeline
7983
! ALL-NEXT: AbstractResultOpt
8084
! ALL-NEXT: 'func.func' Pipeline
8185
! ALL-NEXT: AbstractResultOpt
8286
! ALL-NEXT: 'omp.declare_reduction' Pipeline
8387
! ALL-NEXT: AbstractResultOpt
88+
! ALL-NEXT: 'omp.private' Pipeline
89+
! ALL-NEXT: AbstractResultOpt
8490

8591
! ALL-NEXT: CodeGenRewrite
8692
! ALL-NEXT: (S) 0 num-dce'd - Number of operations eliminated

flang/test/Fir/basic-program.fir

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,16 @@ func.func @_QQmain() {
3434
// PASSES-NEXT: (S) 0 num-cse'd - Number of operations CSE'd
3535
// PASSES-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
3636

37-
// PASSES-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction']
37+
// PASSES-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
3838
// PASSES-NEXT: 'fir.global' Pipeline
3939
// PASSES-NEXT: CharacterConversion
4040
// PASSES-NEXT: 'func.func' Pipeline
4141
// PASSES-NEXT: ArrayValueCopy
4242
// PASSES-NEXT: CharacterConversion
4343
// PASSES-NEXT: 'omp.declare_reduction' Pipeline
4444
// PASSES-NEXT: CharacterConversion
45+
// PASSES-NEXT: 'omp.private' Pipeline
46+
// PASSES-NEXT: CharacterConversion
4547

4648
// PASSES-NEXT: Canonicalizer
4749
// PASSES-NEXT: SimplifyRegionLite
@@ -65,13 +67,15 @@ func.func @_QQmain() {
6567

6668
// PASSES-NEXT: AddAliasTags
6769

68-
// PASSES-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction']
70+
// PASSES-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
6971
// PASSES-NEXT: 'fir.global' Pipeline
7072
// PASSES-NEXT: CFGConversion
7173
// PASSES-NEXT: 'func.func' Pipeline
7274
// PASSES-NEXT: CFGConversion
7375
// PASSES-NEXT: 'omp.declare_reduction' Pipeline
7476
// PASSES-NEXT: CFGConversion
77+
// PASSES-NEXT: 'omp.private' Pipeline
78+
// PASSES-NEXT: CFGConversion
7579

7680
// PASSES-NEXT: SCFToControlFlow
7781
// PASSES-NEXT: Canonicalizer
@@ -81,13 +85,15 @@ func.func @_QQmain() {
8185
// PASSES-NEXT: (S) 0 num-dce'd - Number of operations DCE'd
8286
// PASSES-NEXT: BoxedProcedurePass
8387

84-
// PASSES-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction']
85-
// PASSES-NEXT: 'fir.global' Pipeline
88+
// PASSES-NEXT: Pipeline Collection : ['fir.global', 'func.func', 'omp.declare_reduction', 'omp.private']
89+
// PASSES-NEXT: 'fir.global' Pipeline
8690
// PASSES-NEXT: AbstractResultOpt
8791
// PASSES-NEXT: 'func.func' Pipeline
8892
// PASSES-NEXT: AbstractResultOpt
8993
// PASSES-NEXT: 'omp.declare_reduction' Pipeline
9094
// PASSES-NEXT: AbstractResultOpt
95+
// PASSES-NEXT: 'omp.private' Pipeline
96+
// PASSES-NEXT: AbstractResultOpt
9197

9298
// PASSES-NEXT: CodeGenRewrite
9399
// PASSES-NEXT: (S) 0 num-dce'd - Number of operations eliminated
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
! Tests that CFG & LLVM conversion is applied to `omp.private` ops.
2+
3+
! RUN: split-file %s %t && cd %t
4+
5+
! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --openmp-enable-delayed-privatization \
6+
! RUN: -o - test.f90 2>&1 | \
7+
! RUN: fir-opt --cfg-conversion -o test.cfg-conv.mlir
8+
! RUN: FileCheck --input-file=test.cfg-conv.mlir %s --check-prefix="CFGConv"
9+
10+
! RUN: fir-opt --convert-hlfir-to-fir --cg-rewrite --fir-to-llvm-ir test.cfg-conv.mlir -o - | \
11+
! RUN: FileCheck %s --check-prefix="LLVMDialect"
12+
13+
!--- test.f90
14+
subroutine delayed_privatization_allocatable
15+
implicit none
16+
integer, allocatable :: var1
17+
18+
!$omp parallel private(var1)
19+
var1 = 10
20+
!$omp end parallel
21+
end subroutine
22+
23+
! CFGConv-LABEL: omp.private {type = private}
24+
! CFGConv-SAME: @[[PRIVATIZER_SYM:.*]] : [[TYPE:!fir.ref<!fir.box<!fir.heap<i32>>>]] alloc {
25+
26+
! CFGConv-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[TYPE]]):
27+
28+
! CFGConv-NEXT: %[[PRIV_ALLOC:.*]] = fir.alloca !fir.box<!fir.heap<i32>> {bindc_name = "var1", pinned, uniq_name = "_QFdelayed_privatization_allocatableEvar1"}
29+
30+
! CFGConv-NEXT: %[[PRIV_ARG_VAL:.*]] = fir.load %[[PRIV_ARG]] : !fir.ref<!fir.box<!fir.heap<i32>>>
31+
! CFGConv-NEXT: %[[PRIV_ARG_BOX:.*]] = fir.box_addr %[[PRIV_ARG_VAL]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
32+
! CFGConv-NEXT: %[[PRIV_ARG_ADDR:.*]] = fir.convert %[[PRIV_ARG_BOX]] : (!fir.heap<i32>) -> i64
33+
! CFGConv-NEXT: %[[C0:.*]] = arith.constant 0 : i64
34+
! CFGConv-NEXT: %[[ALLOC_COND:.*]] = arith.cmpi ne, %[[PRIV_ARG_ADDR]], %[[C0]] : i64
35+
! CFGConv-NEXT: cf.cond_br %[[ALLOC_COND]], ^[[ALLOC_MEM_BB:.*]], ^[[ZERO_MEM_BB:.*]]
36+
! CFGConv-NEXT: ^[[ALLOC_MEM_BB]]:
37+
! CFGConv-NEXT: fir.allocmem
38+
! CFGConv: cf.br ^[[DECL_BB:.*]]
39+
! CFGConv: ^[[ZERO_MEM_BB]]:
40+
! CFGConv-NEXT: fir.zero_bits
41+
! CFGConv: cf.br ^[[DECL_BB:.*]]
42+
! CFGConv-NEXT: ^[[DECL_BB]]:
43+
! CFGConv-NEXT: hlfir.declare
44+
! CFGConv-NEXT: omp.yield
45+
46+
47+
! LLVMDialect-LABEL: omp.private {type = private}
48+
! LLVMDialect-SAME: @[[PRIVATIZER_SYM:.*]] : [[TYPE:!llvm.ptr]] alloc {
49+
50+
! LLVMDialect-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[TYPE]]):
51+
! LLVMDialect: llvm.alloca
52+
! LLVMDialect: llvm.call @malloc
53+
54+
! LLVMDialect-NOT: hlfir.declare

0 commit comments

Comments
 (0)