Skip to content

Commit 7006c75

Browse files
committed
Emit body for copy func
1 parent 681ccc7 commit 7006c75

File tree

2 files changed

+17
-33
lines changed

2 files changed

+17
-33
lines changed

flang/lib/Optimizer/OpenMP/LowerWorkshare.cpp

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,6 @@ struct SingleRegion {
6969
Block::iterator begin, end;
7070
};
7171

72-
static bool isSupportedByFirAlloca(Type ty) {
73-
return !isa<fir::ReferenceType>(ty);
74-
}
75-
7672
static bool mustParallelizeOp(Operation *op) {
7773
// TODO as in shouldUseWorkshareLowering we be careful not to pick up
7874
// workshare_loop_wrapper in nested omp.parallel ops
@@ -98,14 +94,10 @@ static bool isSafeToParallelize(Operation *op) {
9894
static mlir::func::FuncOp createCopyFunc(mlir::Location loc, mlir::Type varType,
9995
fir::FirOpBuilder builder) {
10096
mlir::ModuleOp module = builder.getModule();
101-
std::string copyFuncName;
102-
if (auto rt = dyn_cast<fir::ReferenceType>(varType)) {
103-
mlir::Type eleTy = rt.getEleTy();
104-
copyFuncName =
105-
fir::getTypeAsString(eleTy, builder.getKindMap(), "_workshare_copy");
106-
} else {
107-
copyFuncName = "_workshare_copy_llvm_ptr";
108-
}
97+
auto rt = cast<fir::ReferenceType>(varType);
98+
mlir::Type eleTy = rt.getEleTy();
99+
std::string copyFuncName =
100+
fir::getTypeAsString(eleTy, builder.getKindMap(), "_workshare_copy");
109101

110102
if (auto decl = module.lookupSymbol<mlir::func::FuncOp>(copyFuncName))
111103
return decl;
@@ -120,6 +112,10 @@ static mlir::func::FuncOp createCopyFunc(mlir::Location loc, mlir::Type varType,
120112
builder.createBlock(&funcOp.getRegion(), funcOp.getRegion().end(), argsTy,
121113
{loc, loc});
122114
builder.setInsertionPointToStart(&funcOp.getRegion().back());
115+
116+
Value loaded = builder.create<fir::LoadOp>(loc, funcOp.getArgument(0));
117+
builder.create<fir::StoreOp>(loc, loaded, funcOp.getArgument(1));
118+
123119
builder.create<mlir::func::ReturnOp>(loc);
124120
return funcOp;
125121
}
@@ -168,28 +164,10 @@ static void parallelizeRegion(Region &sourceRegion, Region &targetRegion,
168164
OpBuilder parallelBuilder, IRMapping singleMapping) -> Value {
169165
if (auto reloaded = rootMapping.lookupOrNull(v))
170166
return nullptr;
171-
Type llvmPtrTy = LLVM::LLVMPointerType::get(allocaBuilder.getContext());
172167
Type ty = v.getType();
173-
Value alloc, reloaded;
174-
if (isSupportedByFirAlloca(ty)) {
175-
alloc = allocaBuilder.create<fir::AllocaOp>(loc, ty);
176-
singleBuilder.create<fir::StoreOp>(loc, singleMapping.lookup(v), alloc);
177-
reloaded = parallelBuilder.create<fir::LoadOp>(loc, ty, alloc);
178-
} else {
179-
auto one = allocaBuilder.create<LLVM::ConstantOp>(
180-
loc, allocaBuilder.getI32Type(), 1);
181-
alloc =
182-
allocaBuilder.create<LLVM::AllocaOp>(loc, llvmPtrTy, llvmPtrTy, one);
183-
Value toStore = singleBuilder
184-
.create<UnrealizedConversionCastOp>(
185-
loc, llvmPtrTy, singleMapping.lookup(v))
186-
.getResult(0);
187-
singleBuilder.create<LLVM::StoreOp>(loc, toStore, alloc);
188-
reloaded = parallelBuilder.create<LLVM::LoadOp>(loc, llvmPtrTy, alloc);
189-
reloaded =
190-
parallelBuilder.create<UnrealizedConversionCastOp>(loc, ty, reloaded)
191-
.getResult(0);
192-
}
168+
Value alloc = allocaBuilder.create<fir::AllocaOp>(loc, ty);
169+
singleBuilder.create<fir::StoreOp>(loc, singleMapping.lookup(v), alloc);
170+
Value reloaded = parallelBuilder.create<fir::LoadOp>(loc, ty, alloc);
193171
rootMapping.map(v, reloaded);
194172
return alloc;
195173
};

flang/test/Transforms/OpenMP/lower-workshare.mlir

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ func.func @wsfunc(%arg0: !fir.ref<!fir.array<42xi32>>) {
8080
// CHECK-LABEL: func.func private @_workshare_copy_heap_42xi32(
8181
// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.heap<!fir.array<42xi32>>>,
8282
// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.heap<!fir.array<42xi32>>>) {
83+
// CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.heap<!fir.array<42xi32>>>
84+
// CHECK: fir.store %[[VAL_2]] to %[[VAL_1]] : !fir.ref<!fir.heap<!fir.array<42xi32>>>
8385
// CHECK: return
8486
// CHECK: }
8587

@@ -130,12 +132,16 @@ func.func @wsfunc(%arg0: !fir.ref<!fir.array<42xi32>>) {
130132
// CHECK-LABEL: func.func private @_workshare_copy_heap_42xi32(
131133
// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.heap<!fir.array<42xi32>>>,
132134
// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.heap<!fir.array<42xi32>>>) {
135+
// CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.heap<!fir.array<42xi32>>>
136+
// CHECK: fir.store %[[VAL_2]] to %[[VAL_1]] : !fir.ref<!fir.heap<!fir.array<42xi32>>>
133137
// CHECK: return
134138
// CHECK: }
135139

136140
// CHECK-LABEL: func.func private @_workshare_copy_i32(
137141
// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i32>,
138142
// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32>) {
143+
// CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<i32>
144+
// CHECK: fir.store %[[VAL_2]] to %[[VAL_1]] : !fir.ref<i32>
139145
// CHECK: return
140146
// CHECK: }
141147

0 commit comments

Comments
 (0)