@@ -522,13 +522,17 @@ static void genPrivateLikeInitRegion(mlir::OpBuilder &builder, RecipeOp recipe,
522522 mlir::Type ty, mlir::Location loc) {
523523 mlir::Value retVal = recipe.getInitRegion ().front ().getArgument (0 );
524524 ty = fir::unwrapRefType (ty);
525- if (fir::isa_trivial (ty)) {
525+
526+ auto getDeclareOpForType = [&](mlir::Type ty) -> hlfir::DeclareOp {
526527 auto alloca = builder.create <fir::AllocaOp>(loc, ty);
527- auto declareOp = builder.create <hlfir::DeclareOp>(
528+ return builder.create <hlfir::DeclareOp>(
528529 loc, alloca, accPrivateInitName, /* shape=*/ nullptr ,
529530 llvm::ArrayRef<mlir::Value>{}, /* dummy_scope=*/ nullptr ,
530531 fir::FortranVariableFlagsAttr{});
531- retVal = declareOp.getBase ();
532+ };
533+
534+ if (fir::isa_trivial (ty)) {
535+ retVal = getDeclareOpForType (ty).getBase ();
532536 } else if (auto seqTy = mlir::dyn_cast_or_null<fir::SequenceType>(ty)) {
533537 if (fir::isa_trivial (seqTy.getEleTy ())) {
534538 mlir::Value shape;
@@ -552,12 +556,16 @@ static void genPrivateLikeInitRegion(mlir::OpBuilder &builder, RecipeOp recipe,
552556 }
553557 } else if (auto boxTy = mlir::dyn_cast_or_null<fir::BaseBoxType>(ty)) {
554558 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 {
556567 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+ }
561569 }
562570 builder.create <mlir::acc::YieldOp>(loc, retVal);
563571}
0 commit comments