Skip to content

Commit 3b0a426

Browse files
authored
[flang][NFC] move extractSequenceType helper out of OpenACC to share code (#84957)
Moving extractSequenceType to FIRType.h so that this can also be used from OpenMP. OpenMP array reductions 5/6 Previous PR: #84955 Next PR: #84958
1 parent eefef90 commit 3b0a426

File tree

3 files changed

+19
-17
lines changed

3 files changed

+19
-17
lines changed

flang/include/flang/Optimizer/Dialect/FIRType.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,9 @@ inline mlir::Type unwrapSequenceType(mlir::Type t) {
237237
return t;
238238
}
239239

240+
/// Return the nested sequence type if any.
241+
mlir::Type extractSequenceType(mlir::Type ty);
242+
240243
inline mlir::Type unwrapRefType(mlir::Type t) {
241244
if (auto eleTy = dyn_cast_ptrEleTy(t))
242245
return eleTy;

flang/lib/Lower/OpenACC.cpp

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -406,19 +406,6 @@ fir::ShapeOp genShapeOp(mlir::OpBuilder &builder, fir::SequenceType seqTy,
406406
return builder.create<fir::ShapeOp>(loc, extents);
407407
}
408408

409-
/// Return the nested sequence type if any.
410-
static mlir::Type extractSequenceType(mlir::Type ty) {
411-
if (mlir::isa<fir::SequenceType>(ty))
412-
return ty;
413-
if (auto boxTy = mlir::dyn_cast<fir::BaseBoxType>(ty))
414-
return extractSequenceType(boxTy.getEleTy());
415-
if (auto heapTy = mlir::dyn_cast<fir::HeapType>(ty))
416-
return extractSequenceType(heapTy.getEleTy());
417-
if (auto ptrTy = mlir::dyn_cast<fir::PointerType>(ty))
418-
return extractSequenceType(ptrTy.getEleTy());
419-
return mlir::Type{};
420-
}
421-
422409
template <typename RecipeOp>
423410
static void genPrivateLikeInitRegion(mlir::OpBuilder &builder, RecipeOp recipe,
424411
mlir::Type ty, mlir::Location loc) {
@@ -454,7 +441,7 @@ static void genPrivateLikeInitRegion(mlir::OpBuilder &builder, RecipeOp recipe,
454441
}
455442
}
456443
} else if (auto boxTy = mlir::dyn_cast_or_null<fir::BaseBoxType>(ty)) {
457-
mlir::Type innerTy = extractSequenceType(boxTy);
444+
mlir::Type innerTy = fir::extractSequenceType(boxTy);
458445
if (!innerTy)
459446
TODO(loc, "Unsupported boxed type in OpenACC privatization");
460447
fir::FirOpBuilder firBuilder{builder, recipe.getOperation()};
@@ -688,7 +675,7 @@ mlir::acc::FirstprivateRecipeOp Fortran::lower::createOrGetFirstprivateRecipe(
688675
} else if (auto boxTy = mlir::dyn_cast_or_null<fir::BaseBoxType>(ty)) {
689676
fir::FirOpBuilder firBuilder{builder, recipe.getOperation()};
690677
llvm::SmallVector<mlir::Value> tripletArgs;
691-
mlir::Type innerTy = extractSequenceType(boxTy);
678+
mlir::Type innerTy = fir::extractSequenceType(boxTy);
692679
fir::SequenceType seqTy =
693680
mlir::dyn_cast_or_null<fir::SequenceType>(innerTy);
694681
if (!seqTy)
@@ -1018,7 +1005,7 @@ static mlir::Value genReductionInitRegion(fir::FirOpBuilder &builder,
10181005
return declareOp.getBase();
10191006
}
10201007
} else if (auto boxTy = mlir::dyn_cast_or_null<fir::BaseBoxType>(ty)) {
1021-
mlir::Type innerTy = extractSequenceType(boxTy);
1008+
mlir::Type innerTy = fir::extractSequenceType(boxTy);
10221009
if (!mlir::isa<fir::SequenceType>(innerTy))
10231010
TODO(loc, "Unsupported boxed type for reduction");
10241011
// Create the private copy from the initial fir.box.
@@ -1230,7 +1217,7 @@ static void genCombiner(fir::FirOpBuilder &builder, mlir::Location loc,
12301217
builder.create<fir::StoreOp>(loc, res, addr1);
12311218
builder.setInsertionPointAfter(loops[0]);
12321219
} else if (auto boxTy = mlir::dyn_cast<fir::BaseBoxType>(ty)) {
1233-
mlir::Type innerTy = extractSequenceType(boxTy);
1220+
mlir::Type innerTy = fir::extractSequenceType(boxTy);
12341221
fir::SequenceType seqTy =
12351222
mlir::dyn_cast_or_null<fir::SequenceType>(innerTy);
12361223
if (!seqTy)

flang/lib/Optimizer/Dialect/FIRType.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,18 @@ bool hasDynamicSize(mlir::Type t) {
254254
return false;
255255
}
256256

257+
mlir::Type extractSequenceType(mlir::Type ty) {
258+
if (mlir::isa<fir::SequenceType>(ty))
259+
return ty;
260+
if (auto boxTy = mlir::dyn_cast<fir::BaseBoxType>(ty))
261+
return extractSequenceType(boxTy.getEleTy());
262+
if (auto heapTy = mlir::dyn_cast<fir::HeapType>(ty))
263+
return extractSequenceType(heapTy.getEleTy());
264+
if (auto ptrTy = mlir::dyn_cast<fir::PointerType>(ty))
265+
return extractSequenceType(ptrTy.getEleTy());
266+
return mlir::Type{};
267+
}
268+
257269
bool isPointerType(mlir::Type ty) {
258270
if (auto refTy = fir::dyn_cast_ptrEleTy(ty))
259271
ty = refTy;

0 commit comments

Comments
 (0)