Skip to content

Commit 2b42abb

Browse files
clean up and add one test
1 parent 1d22d1d commit 2b42abb

File tree

2 files changed

+90
-28
lines changed

2 files changed

+90
-28
lines changed

flang/lib/Optimizer/OpenMP/MapsForPrivatizedSymbols.cpp

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@
1414
#include "mlir/IR/SymbolTable.h"
1515
#include "mlir/Pass/Pass.h"
1616
#include "llvm/Frontend/OpenMP/OMPConstants.h"
17+
#include "llvm/Support/Debug.h"
1718
#include <type_traits>
1819

20+
#define DEBUG_TYPE "omp-maps-for-privatized-symbols"
21+
1922
namespace flangomp {
2023
#define GEN_PASS_DEF_MAPSFORPRIVATIZEDSYMBOLSPASS
2124
#include "flang/Optimizer/OpenMP/Passes.h.inc"
@@ -33,29 +36,12 @@ class MapsForPrivatizedSymbolsPass
3336
return false;
3437
return true;
3538
}
36-
void dumpPrivatizerInfo(omp::PrivateClauseOp &privatizer,
37-
mlir::Value privVar) {
38-
llvm::errs() << "Found a privatizer:\n";
39-
privatizer.dump();
40-
llvm::errs() << "\n";
41-
42-
llvm::errs() << "$type = " << privatizer.getType() << "\n";
43-
llvm::errs() << "privVar = ";
44-
privVar.dump();
45-
llvm::errs() << "\n";
46-
47-
llvm::errs() << "privVar.getDefiningOp() = ";
48-
privVar.getDefiningOp()->dump();
49-
llvm::errs() << "\n";
50-
llvm::errs() << "\n";
51-
}
5239
omp::MapInfoOp createMapInfo(mlir::Location loc, mlir::Value var,
5340
OpBuilder &builder) {
54-
// llvm::omp::OpenMPOffloadMappingFlags mapTypeBits =
55-
// llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO;
5641
uint64_t mapTypeTo = static_cast<
5742
std::underlying_type_t<llvm::omp::OpenMPOffloadMappingFlags>>(
5843
llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO);
44+
5945
return builder.create<omp::MapInfoOp>(
6046
loc, var.getType(), var,
6147
mlir::TypeAttr::get(fir::unwrapRefType(var.getType())),
@@ -80,10 +66,6 @@ class MapsForPrivatizedSymbolsPass
8066
MLIRContext *context = &getContext();
8167
OpBuilder builder(context);
8268
getOperation()->walk([&](omp::TargetOp targetOp) {
83-
llvm::errs() << "MapsForPrivatizedSymbolsPass::TargetOp is \n";
84-
targetOp.dump();
85-
llvm::errs() << "\n";
86-
8769
if (targetOp.getPrivateVars().empty())
8870
return;
8971

@@ -102,16 +84,12 @@ class MapsForPrivatizedSymbolsPass
10284
if (!privatizerNeedsMap(privatizer)) {
10385
return;
10486
}
105-
llvm::errs() << "Privatizer NEEDS a map\n";
10687
builder.setInsertionPoint(targetOp);
107-
dumpPrivatizerInfo(privatizer, privVar);
108-
10988
mlir::Location loc = targetOp.getLoc();
11089
omp::MapInfoOp mapInfoOp = createMapInfo(loc, privVar, builder);
11190
addMapInfoOp(targetOp, mapInfoOp);
112-
llvm::errs() << __FUNCTION__ << "MapInfoOp is \n";
113-
mapInfoOp.dump();
114-
llvm::errs() << "\n";
91+
LLVM_DEBUG(llvm::dbgs() << "MapsForPrivatizedSymbolsPass created ->\n");
92+
LLVM_DEBUG(mapInfoOp.dump());
11593
}
11694
});
11795
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// RUN: fir-opt --split-input-file --omp-maps-for-privatized-symbols %s | FileCheck %s
2+
module attributes {omp.is_target_device = false} {
3+
omp.private {type = private} @_QFtarget_simpleEsimple_var_private_ref_box_heap_i32 : !fir.ref<!fir.box<!fir.heap<i32>>> alloc {
4+
^bb0(%arg0: !fir.ref<!fir.box<!fir.heap<i32>>>):
5+
%0 = fir.alloca !fir.box<!fir.heap<i32>> {bindc_name = "simple_var", pinned, uniq_name = "_QFtarget_simpleEsimple_var"}
6+
%1 = fir.load %arg0 : !fir.ref<!fir.box<!fir.heap<i32>>>
7+
%2 = fir.box_addr %1 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
8+
%3 = fir.convert %2 : (!fir.heap<i32>) -> i64
9+
%c0_i64 = arith.constant 0 : i64
10+
%4 = arith.cmpi ne, %3, %c0_i64 : i64
11+
fir.if %4 {
12+
%6 = fir.load %arg0 : !fir.ref<!fir.box<!fir.heap<i32>>>
13+
%7 = fir.box_addr %6 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
14+
%8 = fir.allocmem i32 {fir.must_be_heap = true, uniq_name = "_QFtarget_simpleEsimple_var.alloc"}
15+
%9 = fir.embox %8 : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
16+
fir.store %9 to %0 : !fir.ref<!fir.box<!fir.heap<i32>>>
17+
} else {
18+
%6 = fir.zero_bits !fir.heap<i32>
19+
%7 = fir.embox %6 : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
20+
fir.store %7 to %0 : !fir.ref<!fir.box<!fir.heap<i32>>>
21+
}
22+
%5:2 = hlfir.declare %0 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtarget_simpleEsimple_var"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)
23+
omp.yield(%5#0 : !fir.ref<!fir.box<!fir.heap<i32>>>)
24+
} dealloc {
25+
^bb0(%arg0: !fir.ref<!fir.box<!fir.heap<i32>>>):
26+
%0 = fir.load %arg0 : !fir.ref<!fir.box<!fir.heap<i32>>>
27+
%1 = fir.box_addr %0 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
28+
%2 = fir.convert %1 : (!fir.heap<i32>) -> i64
29+
%c0_i64 = arith.constant 0 : i64
30+
%3 = arith.cmpi ne, %2, %c0_i64 : i64
31+
fir.if %3 {
32+
%false = arith.constant false
33+
%4 = fir.absent !fir.box<none>
34+
%c70 = arith.constant 70 : index
35+
%c10_i32 = arith.constant 10 : i32
36+
%6 = fir.load %arg0 : !fir.ref<!fir.box<!fir.heap<i32>>>
37+
%7 = fir.box_addr %6 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
38+
fir.freemem %7 : !fir.heap<i32>
39+
%8 = fir.zero_bits !fir.heap<i32>
40+
%9 = fir.embox %8 : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
41+
fir.store %9 to %arg0 : !fir.ref<!fir.box<!fir.heap<i32>>>
42+
}
43+
omp.yield
44+
}
45+
func.func @_QPtarget_simple() {
46+
%0 = fir.alloca i32 {bindc_name = "a", uniq_name = "_QFtarget_simpleEa"}
47+
%1:2 = hlfir.declare %0 {uniq_name = "_QFtarget_simpleEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
48+
%2 = fir.alloca !fir.box<!fir.heap<i32>> {bindc_name = "simple_var", uniq_name = "_QFtarget_simpleEsimple_var"}
49+
%3 = fir.zero_bits !fir.heap<i32>
50+
%4 = fir.embox %3 : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
51+
fir.store %4 to %2 : !fir.ref<!fir.box<!fir.heap<i32>>>
52+
%5:2 = hlfir.declare %2 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtarget_simpleEsimple_var"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)
53+
%c2_i32 = arith.constant 2 : i32
54+
hlfir.assign %c2_i32 to %1#0 : i32, !fir.ref<i32>
55+
%6 = omp.map.info var_ptr(%1#1 : !fir.ref<i32>, i32) map_clauses(to) capture(ByRef) -> !fir.ref<i32> {name = "a"}
56+
omp.target map_entries(%6 -> %arg0 : !fir.ref<i32>) private(@_QFtarget_simpleEsimple_var_private_ref_box_heap_i32 %5#0 -> %arg1 : !fir.ref<!fir.box<!fir.heap<i32>>>) {
57+
^bb0(%arg0: !fir.ref<i32>, %arg1: !fir.ref<!fir.box<!fir.heap<i32>>>):
58+
%11:2 = hlfir.declare %arg0 {uniq_name = "_QFtarget_simpleEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
59+
%12:2 = hlfir.declare %arg1 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtarget_simpleEsimple_var"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)
60+
%c10_i32 = arith.constant 10 : i32
61+
%13 = fir.load %11#0 : !fir.ref<i32>
62+
%14 = arith.addi %c10_i32, %13 : i32
63+
hlfir.assign %14 to %12#0 realloc : i32, !fir.ref<!fir.box<!fir.heap<i32>>>
64+
omp.terminator
65+
}
66+
%7 = fir.load %5#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
67+
%8 = fir.box_addr %7 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
68+
%9 = fir.convert %8 : (!fir.heap<i32>) -> i64
69+
%c0_i64 = arith.constant 0 : i64
70+
%10 = arith.cmpi ne, %9, %c0_i64 : i64
71+
fir.if %10 {
72+
%11 = fir.load %5#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
73+
%12 = fir.box_addr %11 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
74+
fir.freemem %12 : !fir.heap<i32>
75+
%13 = fir.zero_bits !fir.heap<i32>
76+
%14 = fir.embox %13 : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
77+
fir.store %14 to %5#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
78+
}
79+
return
80+
}
81+
}
82+
// CHECK: %[[MAP0:.*]] = omp.map.info var_ptr({{.*}} : !fir.ref<i32>, i32) map_clauses(to) capture(ByRef) -> !fir.ref<i32> {name = "a"}
83+
// CHECK: %[[MAP1:.*]] = omp.map.info var_ptr({{.*}} : !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.box<!fir.heap<i32>>) map_clauses(to) capture(ByRef) -> !fir.ref<!fir.box<!fir.heap<i32>>>
84+
// CHECK: omp.target map_entries(%[[MAP0]] -> %arg0, %[[MAP1]] -> %arg1 : !fir.ref<i32>, !fir.ref<!fir.box<!fir.heap<i32>>>)

0 commit comments

Comments
 (0)