3030#include " mlir/IR/Matchers.h"
3131#include " mlir/IR/OpDefinition.h"
3232#include " mlir/IR/PatternMatch.h"
33+ #include " mlir/IR/TypeRange.h"
3334#include " llvm/ADT/STLExtras.h"
3435#include " llvm/ADT/SmallVector.h"
3536#include " llvm/ADT/TypeSwitch.h"
@@ -38,24 +39,6 @@ namespace {
3839#include " flang/Optimizer/Dialect/CanonicalizationPatterns.inc"
3940} // namespace
4041
41- // / Volatile references are currently modeled as read and write effects
42- // / to an unknown memory location. This is how the LLVM dialect models
43- // / volatile memory accesses, but may be overly conservative. LLVM
44- // / Language Reference only specifies that volatile memory accesses
45- // / must not be reordered relative to other volatile memory accesses,
46- // / so it would be more precise to use a separate memory resource for
47- // / volatile memory accesses. Be conservative for now.
48- static void addVolatileMemoryEffects (
49- mlir::Type type, llvm::SmallVectorImpl<mlir::SideEffects::EffectInstance<
50- mlir::MemoryEffects::Effect>> &effects) {
51- if (fir::isa_volatile_type (type)) {
52- effects.emplace_back (mlir::MemoryEffects::Read::get (),
53- fir::VolatileMemoryResource::get ());
54- effects.emplace_back (mlir::MemoryEffects::Write::get (),
55- fir::VolatileMemoryResource::get ());
56- }
57- }
58-
5942static void propagateAttributes (mlir::Operation *fromOp,
6043 mlir::Operation *toOp) {
6144 if (!fromOp || !toOp)
@@ -879,7 +862,7 @@ void fir::ArrayLoadOp::getEffects(
879862 effects.emplace_back (mlir::MemoryEffects::Read::get (),
880863 &getOperation ()->getOpOperand (0 ),
881864 mlir::SideEffects::DefaultResource::get ());
882- addVolatileMemoryEffects (getMemref ().getType (), effects);
865+ addVolatileMemoryEffects ({ getMemref ().getType ()} , effects);
883866}
884867
885868llvm::LogicalResult fir::ArrayLoadOp::verify () {
@@ -971,7 +954,7 @@ void fir::ArrayMergeStoreOp::getEffects(
971954 effects.emplace_back (mlir::MemoryEffects::Write::get (),
972955 &getOperation ()->getOpOperand (0 ),
973956 mlir::SideEffects::DefaultResource::get ());
974- addVolatileMemoryEffects (getMemref ().getType (), effects);
957+ addVolatileMemoryEffects ({ getMemref ().getType ()} , effects);
975958}
976959
977960// ===----------------------------------------------------------------------===//
@@ -1855,6 +1838,9 @@ llvm::LogicalResult fir::EmboxOp::verify() {
18551838 return emitOpError (" slice must not be provided for a scalar" );
18561839 if (getSourceBox () && !mlir::isa<fir::ClassType>(getResult ().getType ()))
18571840 return emitOpError (" source_box must be used with fir.class result type" );
1841+ if (fir::isa_volatile_type (getMemref ().getType ()) !=
1842+ fir::isa_volatile_type (getResult ().getType ()))
1843+ return emitOpError (" input and output types must have the same volatility" );
18581844 return mlir::success ();
18591845}
18601846
@@ -2674,7 +2660,7 @@ void fir::LoadOp::getEffects(
26742660 effects.emplace_back (mlir::MemoryEffects::Read::get (),
26752661 &getOperation ()->getOpOperand (0 ),
26762662 mlir::SideEffects::DefaultResource::get ());
2677- addVolatileMemoryEffects (getMemref ().getType (), effects);
2663+ addVolatileMemoryEffects ({ getMemref ().getType ()} , effects);
26782664}
26792665
26802666// ===----------------------------------------------------------------------===//
@@ -4036,7 +4022,7 @@ void fir::StoreOp::getEffects(
40364022 effects.emplace_back (mlir::MemoryEffects::Write::get (),
40374023 &getOperation ()->getOpOperand (1 ),
40384024 mlir::SideEffects::DefaultResource::get ());
4039- addVolatileMemoryEffects (getMemref ().getType (), effects);
4025+ addVolatileMemoryEffects ({ getMemref ().getType ()} , effects);
40404026}
40414027
40424028// ===----------------------------------------------------------------------===//
@@ -4069,8 +4055,8 @@ void fir::CopyOp::getEffects(
40694055 effects.emplace_back (mlir::MemoryEffects::Write::get (),
40704056 &getOperation ()->getOpOperand (1 ),
40714057 mlir::SideEffects::DefaultResource::get ());
4072- addVolatileMemoryEffects (getDestination ().getType (), effects);
4073- addVolatileMemoryEffects ( getSource (). getType (), effects);
4058+ addVolatileMemoryEffects ({ getDestination ().getType (), getSource (). getType ()},
4059+ effects);
40744060}
40754061
40764062// ===----------------------------------------------------------------------===//
0 commit comments