@@ -331,24 +331,25 @@ struct AssociateOpConversion
331
331
}
332
332
};
333
333
334
- static void genFreeIfMustFree (mlir::Location loc,
335
- mlir::ConversionPatternRewriter &rewriter,
334
+ static void genFreeIfMustFree (mlir::Location loc, fir::FirOpBuilder &builder,
336
335
mlir::Value var, mlir::Value mustFree) {
337
336
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);
344
345
};
345
346
if (auto cstMustFree = fir::getIntIfConstant (mustFree)) {
346
347
if (*cstMustFree != 0 )
347
348
genFree ();
348
- // else, nothing to do.
349
+ // else, mustFree is false, nothing to do.
349
350
return ;
350
351
}
351
- TODO (loc, " conditional free " );
352
+ builder. genIfThen (loc, mustFree). genThen (genFree). end ( );
352
353
}
353
354
354
355
struct EndAssociateOpConversion
@@ -360,7 +361,9 @@ struct EndAssociateOpConversion
360
361
matchAndRewrite (hlfir::EndAssociateOp endAssociate, OpAdaptor adaptor,
361
362
mlir::ConversionPatternRewriter &rewriter) const override {
362
363
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 ());
364
367
rewriter.eraseOp (endAssociate);
365
368
return mlir::success ();
366
369
}
@@ -378,9 +381,11 @@ struct DestroyOpConversion
378
381
mlir::Location loc = destroy->getLoc ();
379
382
mlir::Value bufferizedExpr = getBufferizedExprStorage (adaptor.getExpr ());
380
383
if (!fir::isa_trivial (bufferizedExpr.getType ())) {
384
+ auto module = destroy->getParentOfType <mlir::ModuleOp>();
385
+ fir::FirOpBuilder builder (rewriter, fir::getKindMapping (module ));
381
386
mlir::Value mustFree = getBufferizedExprMustFreeFlag (adaptor.getExpr ());
382
387
mlir::Value firBase = hlfir::Entity (bufferizedExpr).getFirBase ();
383
- genFreeIfMustFree (loc, rewriter , firBase, mustFree);
388
+ genFreeIfMustFree (loc, builder , firBase, mustFree);
384
389
}
385
390
rewriter.eraseOp (destroy);
386
391
return mlir::success ();
0 commit comments