30
30
#include " mlir/IR/Matchers.h"
31
31
#include " mlir/IR/OpDefinition.h"
32
32
#include " mlir/IR/PatternMatch.h"
33
+ #include " mlir/IR/TypeRange.h"
33
34
#include " llvm/ADT/STLExtras.h"
34
35
#include " llvm/ADT/SmallVector.h"
35
36
#include " llvm/ADT/TypeSwitch.h"
@@ -38,24 +39,6 @@ namespace {
38
39
#include " flang/Optimizer/Dialect/CanonicalizationPatterns.inc"
39
40
} // namespace
40
41
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
-
59
42
static void propagateAttributes (mlir::Operation *fromOp,
60
43
mlir::Operation *toOp) {
61
44
if (!fromOp || !toOp)
@@ -879,7 +862,7 @@ void fir::ArrayLoadOp::getEffects(
879
862
effects.emplace_back (mlir::MemoryEffects::Read::get (),
880
863
&getOperation ()->getOpOperand (0 ),
881
864
mlir::SideEffects::DefaultResource::get ());
882
- addVolatileMemoryEffects (getMemref ().getType (), effects);
865
+ addVolatileMemoryEffects ({ getMemref ().getType ()} , effects);
883
866
}
884
867
885
868
llvm::LogicalResult fir::ArrayLoadOp::verify () {
@@ -971,7 +954,7 @@ void fir::ArrayMergeStoreOp::getEffects(
971
954
effects.emplace_back (mlir::MemoryEffects::Write::get (),
972
955
&getOperation ()->getOpOperand (0 ),
973
956
mlir::SideEffects::DefaultResource::get ());
974
- addVolatileMemoryEffects (getMemref ().getType (), effects);
957
+ addVolatileMemoryEffects ({ getMemref ().getType ()} , effects);
975
958
}
976
959
977
960
// ===----------------------------------------------------------------------===//
@@ -1855,6 +1838,9 @@ llvm::LogicalResult fir::EmboxOp::verify() {
1855
1838
return emitOpError (" slice must not be provided for a scalar" );
1856
1839
if (getSourceBox () && !mlir::isa<fir::ClassType>(getResult ().getType ()))
1857
1840
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" );
1858
1844
return mlir::success ();
1859
1845
}
1860
1846
@@ -2674,7 +2660,7 @@ void fir::LoadOp::getEffects(
2674
2660
effects.emplace_back (mlir::MemoryEffects::Read::get (),
2675
2661
&getOperation ()->getOpOperand (0 ),
2676
2662
mlir::SideEffects::DefaultResource::get ());
2677
- addVolatileMemoryEffects (getMemref ().getType (), effects);
2663
+ addVolatileMemoryEffects ({ getMemref ().getType ()} , effects);
2678
2664
}
2679
2665
2680
2666
// ===----------------------------------------------------------------------===//
@@ -4036,7 +4022,7 @@ void fir::StoreOp::getEffects(
4036
4022
effects.emplace_back (mlir::MemoryEffects::Write::get (),
4037
4023
&getOperation ()->getOpOperand (1 ),
4038
4024
mlir::SideEffects::DefaultResource::get ());
4039
- addVolatileMemoryEffects (getMemref ().getType (), effects);
4025
+ addVolatileMemoryEffects ({ getMemref ().getType ()} , effects);
4040
4026
}
4041
4027
4042
4028
// ===----------------------------------------------------------------------===//
@@ -4069,8 +4055,8 @@ void fir::CopyOp::getEffects(
4069
4055
effects.emplace_back (mlir::MemoryEffects::Write::get (),
4070
4056
&getOperation ()->getOpOperand (1 ),
4071
4057
mlir::SideEffects::DefaultResource::get ());
4072
- addVolatileMemoryEffects (getDestination ().getType (), effects);
4073
- addVolatileMemoryEffects ( getSource (). getType (), effects);
4058
+ addVolatileMemoryEffects ({ getDestination ().getType (), getSource (). getType ()},
4059
+ effects);
4074
4060
}
4075
4061
4076
4062
// ===----------------------------------------------------------------------===//
0 commit comments