@@ -331,24 +331,25 @@ struct AssociateOpConversion
331331 }
332332};
333333
334- static void genFreeIfMustFree (mlir::Location loc,
335- mlir::ConversionPatternRewriter &rewriter,
334+ static void genFreeIfMustFree (mlir::Location loc, fir::FirOpBuilder &builder,
336335 mlir::Value var, mlir::Value mustFree) {
337336 auto genFree = [&]() {
338- if (var.getType ().isa <fir::BaseBoxType>())
339- TODO (loc, " unbox" );
340- if (!var.getType ().isa <fir::HeapType>())
341- var = rewriter.create <fir::ConvertOp>(
342- loc, fir::HeapType::get (fir::unwrapRefType (var.getType ())), var);
343- rewriter.create <fir::FreeMemOp>(loc, var);
337+ // fir::FreeMemOp operand type must be a fir::HeapType.
338+ mlir::Type heapType = fir::HeapType::get (
339+ hlfir::getFortranElementOrSequenceType (var.getType ()));
340+ if (var.getType ().isa <fir::BaseBoxType, fir::BoxCharType>())
341+ var = builder.create <fir::BoxAddrOp>(loc, heapType, var);
342+ else if (!var.getType ().isa <fir::HeapType>())
343+ var = builder.create <fir::ConvertOp>(loc, heapType, var);
344+ builder.create <fir::FreeMemOp>(loc, var);
344345 };
345346 if (auto cstMustFree = fir::getIntIfConstant (mustFree)) {
346347 if (*cstMustFree != 0 )
347348 genFree ();
348- // else, nothing to do.
349+ // else, mustFree is false, nothing to do.
349350 return ;
350351 }
351- TODO (loc, " conditional free " );
352+ builder. genIfThen (loc, mustFree). genThen (genFree). end ( );
352353}
353354
354355struct EndAssociateOpConversion
@@ -360,7 +361,9 @@ struct EndAssociateOpConversion
360361 matchAndRewrite (hlfir::EndAssociateOp endAssociate, OpAdaptor adaptor,
361362 mlir::ConversionPatternRewriter &rewriter) const override {
362363 mlir::Location loc = endAssociate->getLoc ();
363- genFreeIfMustFree (loc, rewriter, adaptor.getVar (), adaptor.getMustFree ());
364+ auto module = endAssociate->getParentOfType <mlir::ModuleOp>();
365+ fir::FirOpBuilder builder (rewriter, fir::getKindMapping (module ));
366+ genFreeIfMustFree (loc, builder, adaptor.getVar (), adaptor.getMustFree ());
364367 rewriter.eraseOp (endAssociate);
365368 return mlir::success ();
366369 }
@@ -378,9 +381,11 @@ struct DestroyOpConversion
378381 mlir::Location loc = destroy->getLoc ();
379382 mlir::Value bufferizedExpr = getBufferizedExprStorage (adaptor.getExpr ());
380383 if (!fir::isa_trivial (bufferizedExpr.getType ())) {
384+ auto module = destroy->getParentOfType <mlir::ModuleOp>();
385+ fir::FirOpBuilder builder (rewriter, fir::getKindMapping (module ));
381386 mlir::Value mustFree = getBufferizedExprMustFreeFlag (adaptor.getExpr ());
382387 mlir::Value firBase = hlfir::Entity (bufferizedExpr).getFirBase ();
383- genFreeIfMustFree (loc, rewriter , firBase, mustFree);
388+ genFreeIfMustFree (loc, builder , firBase, mustFree);
384389 }
385390 rewriter.eraseOp (destroy);
386391 return mlir::success ();
0 commit comments