@@ -522,13 +522,17 @@ static void genPrivateLikeInitRegion(mlir::OpBuilder &builder, RecipeOp recipe,
522
522
mlir::Type ty, mlir::Location loc) {
523
523
mlir::Value retVal = recipe.getInitRegion ().front ().getArgument (0 );
524
524
ty = fir::unwrapRefType (ty);
525
- if (fir::isa_trivial (ty)) {
525
+
526
+ auto getDeclareOpForType = [&](mlir::Type ty) -> hlfir::DeclareOp {
526
527
auto alloca = builder.create <fir::AllocaOp>(loc, ty);
527
- auto declareOp = builder.create <hlfir::DeclareOp>(
528
+ return builder.create <hlfir::DeclareOp>(
528
529
loc, alloca, accPrivateInitName, /* shape=*/ nullptr ,
529
530
llvm::ArrayRef<mlir::Value>{}, /* dummy_scope=*/ nullptr ,
530
531
fir::FortranVariableFlagsAttr{});
531
- retVal = declareOp.getBase ();
532
+ };
533
+
534
+ if (fir::isa_trivial (ty)) {
535
+ retVal = getDeclareOpForType (ty).getBase ();
532
536
} else if (auto seqTy = mlir::dyn_cast_or_null<fir::SequenceType>(ty)) {
533
537
if (fir::isa_trivial (seqTy.getEleTy ())) {
534
538
mlir::Value shape;
@@ -552,12 +556,16 @@ static void genPrivateLikeInitRegion(mlir::OpBuilder &builder, RecipeOp recipe,
552
556
}
553
557
} else if (auto boxTy = mlir::dyn_cast_or_null<fir::BaseBoxType>(ty)) {
554
558
mlir::Type innerTy = fir::unwrapRefType (boxTy.getEleTy ());
555
- if (!fir::isa_trivial (innerTy) && !mlir::isa<fir::SequenceType>(innerTy))
559
+ if (fir::isa_trivial (innerTy)) {
560
+ retVal = getDeclareOpForType (ty).getBase ();
561
+ } else if (mlir::isa<fir::SequenceType>(innerTy)) {
562
+ fir::FirOpBuilder firBuilder{builder, recipe.getOperation ()};
563
+ hlfir::Entity source = hlfir::Entity{retVal};
564
+ auto [temp, cleanup] = hlfir::createTempFromMold (loc, firBuilder, source);
565
+ retVal = temp;
566
+ } else {
556
567
TODO (loc, " Unsupported boxed type in OpenACC privatization" );
557
- fir::FirOpBuilder firBuilder{builder, recipe.getOperation ()};
558
- hlfir::Entity source = hlfir::Entity{retVal};
559
- auto [temp, cleanup] = hlfir::createTempFromMold (loc, firBuilder, source);
560
- retVal = temp;
568
+ }
561
569
}
562
570
builder.create <mlir::acc::YieldOp>(loc, retVal);
563
571
}
0 commit comments