@@ -689,6 +689,20 @@ struct CmpcOpConversion : public fir::FIROpConversion<fir::CmpcOp> {
689689 }
690690};
691691
692+ // / fir.volatile_cast is only useful at the fir level. Once we lower to LLVM,
693+ // / volatility is described by setting volatile attributes on the LLVM ops.
694+ struct VolatileCastOpConversion
695+ : public fir::FIROpConversion<fir::VolatileCastOp> {
696+ using FIROpConversion::FIROpConversion;
697+
698+ llvm::LogicalResult
699+ matchAndRewrite (fir::VolatileCastOp volatileCast, OpAdaptor adaptor,
700+ mlir::ConversionPatternRewriter &rewriter) const override {
701+ rewriter.replaceOp (volatileCast, adaptor.getOperands ()[0 ]);
702+ return mlir::success ();
703+ }
704+ };
705+
692706// / convert value of from-type to value of to-type
693707struct ConvertOpConversion : public fir ::FIROpConversion<fir::ConvertOp> {
694708 using FIROpConversion::FIROpConversion;
@@ -3224,8 +3238,7 @@ struct LoadOpConversion : public fir::FIROpConversion<fir::LoadOp> {
32243238 mlir::ConversionPatternRewriter &rewriter) const override {
32253239
32263240 mlir::Type llvmLoadTy = convertObjectType (load.getType ());
3227- const bool isVolatile =
3228- fir::isa_volatile_ref_type (load.getMemref ().getType ());
3241+ const bool isVolatile = fir::isa_volatile_type (load.getMemref ().getType ());
32293242 if (auto boxTy = mlir::dyn_cast<fir::BaseBoxType>(load.getType ())) {
32303243 // fir.box is a special case because it is considered an ssa value in
32313244 // fir, but it is lowered as a pointer to a descriptor. So
@@ -3263,10 +3276,10 @@ struct LoadOpConversion : public fir::FIROpConversion<fir::LoadOp> {
32633276 attachTBAATag (memcpy, boxTy, boxTy, nullptr );
32643277 rewriter.replaceOp (load, newBoxStorage);
32653278 } else {
3266- // TODO: are we losing any attributes from the load op?
3267- auto memref = adaptor.getOperands ()[ 0 ] ;
3268- auto loadOp = rewriter. create <mlir::LLVM::LoadOp>(
3269- load. getLoc (), llvmLoadTy, memref, /* alignment= */ 0 , isVolatile );
3279+ mlir::LLVM::LoadOp loadOp = rewriter. create <mlir::LLVM::LoadOp>(
3280+ load. getLoc (), llvmLoadTy, adaptor.getOperands (), load-> getAttrs ()) ;
3281+ if (isVolatile)
3282+ loadOp. setVolatile_Attr (rewriter. getUnitAttr () );
32703283 if (std::optional<mlir::ArrayAttr> optionalTag = load.getTbaa ())
32713284 loadOp.setTBAATags (*optionalTag);
32723285 else
@@ -3544,8 +3557,7 @@ struct StoreOpConversion : public fir::FIROpConversion<fir::StoreOp> {
35443557 mlir::Value llvmValue = adaptor.getValue ();
35453558 mlir::Value llvmMemref = adaptor.getMemref ();
35463559 mlir::LLVM::AliasAnalysisOpInterface newOp;
3547- const bool isVolatile =
3548- fir::isa_volatile_ref_type (store.getMemref ().getType ());
3560+ const bool isVolatile = fir::isa_volatile_type (store.getMemref ().getType ());
35493561 if (auto boxTy = mlir::dyn_cast<fir::BaseBoxType>(storeTy)) {
35503562 mlir::Type llvmBoxTy = lowerTy ().convertBoxTypeAsStruct (boxTy);
35513563 // Always use memcpy because LLVM is not as effective at optimizing
@@ -4200,21 +4212,22 @@ void fir::populateFIRToLLVMConversionPatterns(
42004212 BoxIsAllocOpConversion, BoxIsArrayOpConversion, BoxIsPtrOpConversion,
42014213 BoxOffsetOpConversion, BoxProcHostOpConversion, BoxRankOpConversion,
42024214 BoxTypeCodeOpConversion, BoxTypeDescOpConversion, CallOpConversion,
4203- CmpcOpConversion, ConvertOpConversion, CoordinateOpConversion,
4204- CopyOpConversion, DTEntryOpConversion, DeclareOpConversion,
4205- DivcOpConversion, EmboxOpConversion, EmboxCharOpConversion,
4206- EmboxProcOpConversion, ExtractValueOpConversion, FieldIndexOpConversion,
4207- FirEndOpConversion, FreeMemOpConversion, GlobalLenOpConversion,
4208- GlobalOpConversion, InsertOnRangeOpConversion, IsPresentOpConversion,
4209- LenParamIndexOpConversion, LoadOpConversion, MulcOpConversion,
4210- NegcOpConversion, NoReassocOpConversion, SelectCaseOpConversion,
4211- SelectOpConversion, SelectRankOpConversion, SelectTypeOpConversion,
4212- ShapeOpConversion, ShapeShiftOpConversion, ShiftOpConversion,
4213- SliceOpConversion, StoreOpConversion, StringLitOpConversion,
4214- SubcOpConversion, TypeDescOpConversion, TypeInfoOpConversion,
4215- UnboxCharOpConversion, UnboxProcOpConversion, UndefOpConversion,
4216- UnreachableOpConversion, XArrayCoorOpConversion, XEmboxOpConversion,
4217- XReboxOpConversion, ZeroOpConversion>(converter, options);
4215+ CmpcOpConversion, VolatileCastOpConversion, ConvertOpConversion,
4216+ CoordinateOpConversion, CopyOpConversion, DTEntryOpConversion,
4217+ DeclareOpConversion, DivcOpConversion, EmboxOpConversion,
4218+ EmboxCharOpConversion, EmboxProcOpConversion, ExtractValueOpConversion,
4219+ FieldIndexOpConversion, FirEndOpConversion, FreeMemOpConversion,
4220+ GlobalLenOpConversion, GlobalOpConversion, InsertOnRangeOpConversion,
4221+ IsPresentOpConversion, LenParamIndexOpConversion, LoadOpConversion,
4222+ MulcOpConversion, NegcOpConversion, NoReassocOpConversion,
4223+ SelectCaseOpConversion, SelectOpConversion, SelectRankOpConversion,
4224+ SelectTypeOpConversion, ShapeOpConversion, ShapeShiftOpConversion,
4225+ ShiftOpConversion, SliceOpConversion, StoreOpConversion,
4226+ StringLitOpConversion, SubcOpConversion, TypeDescOpConversion,
4227+ TypeInfoOpConversion, UnboxCharOpConversion, UnboxProcOpConversion,
4228+ UndefOpConversion, UnreachableOpConversion, XArrayCoorOpConversion,
4229+ XEmboxOpConversion, XReboxOpConversion, ZeroOpConversion>(converter,
4230+ options);
42184231
42194232 // Patterns that are populated without a type converter do not trigger
42204233 // target materializations for the operands of the root op.
0 commit comments