@@ -366,6 +366,29 @@ struct SelectOpConversion : public FIROpConversion<fir::SelectOp> {
366
366
}
367
367
};
368
368
369
+ // / `fir.load` --> `llvm.load`
370
+ struct LoadOpConversion : public FIROpConversion <fir::LoadOp> {
371
+ using FIROpConversion::FIROpConversion;
372
+
373
+ mlir::LogicalResult
374
+ matchAndRewrite (fir::LoadOp load, OpAdaptor adaptor,
375
+ mlir::ConversionPatternRewriter &rewriter) const override {
376
+ // fir.box is a special case because it is considered as an ssa values in
377
+ // fir, but it is lowered as a pointer to a descriptor. So fir.ref<fir.box>
378
+ // and fir.box end up being the same llvm types and loading a
379
+ // fir.ref<fir.box> is actually a no op in LLVM.
380
+ if (load.getType ().isa <fir::BoxType>()) {
381
+ rewriter.replaceOp (load, adaptor.getOperands ()[0 ]);
382
+ } else {
383
+ mlir::Type ty = convertType (load.getType ());
384
+ ArrayRef<NamedAttribute> at = load->getAttrs ();
385
+ rewriter.replaceOpWithNewOp <mlir::LLVM::LoadOp>(
386
+ load, ty, adaptor.getOperands (), at);
387
+ }
388
+ return success ();
389
+ }
390
+ };
391
+
369
392
// / conversion of fir::SelectRankOp to an if-then-else ladder
370
393
struct SelectRankOpConversion : public FIROpConversion <fir::SelectRankOp> {
371
394
using FIROpConversion::FIROpConversion;
@@ -378,7 +401,31 @@ struct SelectRankOpConversion : public FIROpConversion<fir::SelectRankOp> {
378
401
}
379
402
};
380
403
381
- // convert to LLVM IR dialect `undef`
404
+ // / `fir.store` --> `llvm.store`
405
+ struct StoreOpConversion : public FIROpConversion <fir::StoreOp> {
406
+ using FIROpConversion::FIROpConversion;
407
+
408
+ mlir::LogicalResult
409
+ matchAndRewrite (fir::StoreOp store, OpAdaptor adaptor,
410
+ mlir::ConversionPatternRewriter &rewriter) const override {
411
+ if (store.value ().getType ().isa <fir::BoxType>()) {
412
+ // fir.box value is actually in memory, load it first before storing it.
413
+ mlir::Location loc = store.getLoc ();
414
+ mlir::Type boxPtrTy = adaptor.getOperands ()[0 ].getType ();
415
+ auto val = rewriter.create <mlir::LLVM::LoadOp>(
416
+ loc, boxPtrTy.cast <mlir::LLVM::LLVMPointerType>().getElementType (),
417
+ adaptor.getOperands ()[0 ]);
418
+ rewriter.replaceOpWithNewOp <mlir::LLVM::StoreOp>(
419
+ store, val, adaptor.getOperands ()[1 ]);
420
+ } else {
421
+ rewriter.replaceOpWithNewOp <mlir::LLVM::StoreOp>(
422
+ store, adaptor.getOperands ()[0 ], adaptor.getOperands ()[1 ]);
423
+ }
424
+ return success ();
425
+ }
426
+ };
427
+
428
+ // / convert to LLVM IR dialect `undef`
382
429
struct UndefOpConversion : public FIROpConversion <fir::UndefOp> {
383
430
using FIROpConversion::FIROpConversion;
384
431
@@ -391,7 +438,7 @@ struct UndefOpConversion : public FIROpConversion<fir::UndefOp> {
391
438
}
392
439
};
393
440
394
- // convert to LLVM IR dialect ` unreachable`
441
+ // / `fir.unreachable` --> `llvm. unreachable`
395
442
struct UnreachableOpConversion : public FIROpConversion <fir::UnreachableOp> {
396
443
using FIROpConversion::FIROpConversion;
397
444
@@ -788,14 +835,14 @@ class FIRToLLVMLowering : public fir::FIRToLLVMLoweringBase<FIRToLLVMLowering> {
788
835
auto *context = getModule ().getContext ();
789
836
fir::LLVMTypeConverter typeConverter{getModule ()};
790
837
mlir::OwningRewritePatternList pattern (context);
791
- pattern
792
- . insert <AddcOpConversion, AddrOfOpConversion, CallOpConversion ,
793
- ConvertOpConversion, DivcOpConversion, ExtractValueOpConversion,
794
- HasValueOpConversion, GlobalOpConversion,
795
- InsertOnRangeOpConversion, InsertValueOpConversion,
796
- NegcOpConversion, MulcOpConversion, SelectOpConversion,
797
- SelectRankOpConversion , SubcOpConversion, UndefOpConversion,
798
- UnreachableOpConversion, ZeroOpConversion>(typeConverter);
838
+ pattern. insert <AddcOpConversion, AddrOfOpConversion, CallOpConversion,
839
+ ConvertOpConversion, DivcOpConversion ,
840
+ ExtractValueOpConversion, HasValueOpConversion ,
841
+ GlobalOpConversion, InsertOnRangeOpConversion ,
842
+ InsertValueOpConversion, LoadOpConversion, NegcOpConversion ,
843
+ MulcOpConversion, SelectOpConversion, SelectRankOpConversion ,
844
+ StoreOpConversion , SubcOpConversion, UndefOpConversion,
845
+ UnreachableOpConversion, ZeroOpConversion>(typeConverter);
799
846
mlir::populateStdToLLVMConversionPatterns (typeConverter, pattern);
800
847
mlir::arith::populateArithmeticToLLVMConversionPatterns (typeConverter,
801
848
pattern);
0 commit comments