Skip to content

Commit 63d7672

Browse files
Add memory effects
Models memory effects on ops that can take volatile references by adding read and write effects to the default resource.
1 parent c69ce9d commit 63d7672

File tree

3 files changed

+58
-6
lines changed

3 files changed

+58
-6
lines changed

flang/include/flang/Optimizer/Dialect/FIROps.td

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ def fir_FreeMemOp : fir_Op<"freemem", [MemoryEffects<[MemFree]>]> {
286286
let assemblyFormat = "$heapref attr-dict `:` qualified(type($heapref))";
287287
}
288288

289-
def fir_LoadOp : fir_OneResultOp<"load", [FirAliasTagOpInterface]> {
289+
def fir_LoadOp : fir_OneResultOp<"load", [FirAliasTagOpInterface, DeclareOpInterfaceMethods<MemoryEffectsOpInterface>]> {
290290
let summary = "load a value from a memory reference";
291291
let description = [{
292292
Load a value from a memory reference into an ssa-value (virtual register).
@@ -302,7 +302,7 @@ def fir_LoadOp : fir_OneResultOp<"load", [FirAliasTagOpInterface]> {
302302
or null.
303303
}];
304304

305-
let arguments = (ins Arg<AnyReferenceLike, "", [MemRead]>:$memref,
305+
let arguments = (ins Arg<AnyReferenceLike, "">:$memref,
306306
OptionalAttr<LLVM_TBAATagArrayAttr>:$tbaa);
307307

308308
let builders = [OpBuilder<(ins "mlir::Value":$refVal)>,
@@ -315,7 +315,8 @@ def fir_LoadOp : fir_OneResultOp<"load", [FirAliasTagOpInterface]> {
315315
}];
316316
}
317317

318-
def fir_StoreOp : fir_Op<"store", [FirAliasTagOpInterface]> {
318+
def fir_StoreOp : fir_Op<"store", [FirAliasTagOpInterface,
319+
DeclareOpInterfaceMethods<MemoryEffectsOpInterface>]> {
319320
let summary = "store an SSA-value to a memory location";
320321

321322
let description = [{
@@ -335,7 +336,7 @@ def fir_StoreOp : fir_Op<"store", [FirAliasTagOpInterface]> {
335336
}];
336337

337338
let arguments = (ins AnyType:$value,
338-
Arg<AnyReferenceLike, "", [MemWrite]>:$memref,
339+
Arg<AnyReferenceLike, "">:$memref,
339340
OptionalAttr<LLVM_TBAATagArrayAttr>:$tbaa);
340341

341342
let builders = [OpBuilder<(ins "mlir::Value":$value, "mlir::Value":$memref)>];
@@ -1373,7 +1374,7 @@ def fir_BoxTypeDescOp : fir_SimpleOneResultOp<"box_tdesc", [NoMemoryEffect]> {
13731374
// !- Merge the new and old values into the memory for "A"
13741375
// array_merge_store <updated A> to <A's address>
13751376

1376-
def fir_ArrayLoadOp : fir_Op<"array_load", [AttrSizedOperandSegments]> {
1377+
def fir_ArrayLoadOp : fir_Op<"array_load", [AttrSizedOperandSegments, DeclareOpInterfaceMethods<MemoryEffectsOpInterface>]> {
13771378

13781379
let summary = "Load an array as a value.";
13791380

@@ -1412,7 +1413,7 @@ def fir_ArrayLoadOp : fir_Op<"array_load", [AttrSizedOperandSegments]> {
14121413
}];
14131414

14141415
let arguments = (ins
1415-
Arg<AnyRefOrBox, "", [MemRead]>:$memref,
1416+
Arg<AnyRefOrBox, "">:$memref,
14161417
Optional<AnyShapeOrShiftType>:$shape,
14171418
Optional<fir_SliceType>:$slice,
14181419
Variadic<AnyIntegerType>:$typeparams

flang/lib/Optimizer/Dialect/FIROps.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ namespace {
3737
#include "flang/Optimizer/Dialect/CanonicalizationPatterns.inc"
3838
} // namespace
3939

40+
static void addVolatileMemoryEffects(
41+
mlir::Type type, llvm::SmallVectorImpl<mlir::SideEffects::EffectInstance<
42+
mlir::MemoryEffects::Effect>> &effects) {
43+
if (fir::isa_volatile_ref_type(type)) {
44+
effects.emplace_back(mlir::MemoryEffects::Read::get());
45+
effects.emplace_back(mlir::MemoryEffects::Write::get());
46+
}
47+
}
48+
4049
static void propagateAttributes(mlir::Operation *fromOp,
4150
mlir::Operation *toOp) {
4251
if (!fromOp || !toOp)
@@ -853,6 +862,16 @@ std::vector<mlir::Value> fir::ArrayLoadOp::getExtents() {
853862
return {};
854863
}
855864

865+
void fir::ArrayLoadOp::getEffects(
866+
llvm::SmallVectorImpl<
867+
mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>>
868+
&effects) {
869+
effects.emplace_back(mlir::MemoryEffects::Read::get(),
870+
&getOperation()->getOpOperand(0),
871+
mlir::SideEffects::DefaultResource::get());
872+
addVolatileMemoryEffects(getMemref().getType(), effects);
873+
}
874+
856875
llvm::LogicalResult fir::ArrayLoadOp::verify() {
857876
auto eleTy = fir::dyn_cast_ptrOrBoxEleTy(getMemref().getType());
858877
auto arrTy = mlir::dyn_cast<fir::SequenceType>(eleTy);
@@ -2599,6 +2618,16 @@ void fir::LoadOp::print(mlir::OpAsmPrinter &p) {
25992618
p << " : " << getMemref().getType();
26002619
}
26012620

2621+
void fir::LoadOp::getEffects(
2622+
llvm::SmallVectorImpl<
2623+
mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>>
2624+
&effects) {
2625+
effects.emplace_back(mlir::MemoryEffects::Read::get(),
2626+
&getOperation()->getOpOperand(0),
2627+
mlir::SideEffects::DefaultResource::get());
2628+
addVolatileMemoryEffects(getMemref().getType(), effects);
2629+
}
2630+
26022631
//===----------------------------------------------------------------------===//
26032632
// DoLoopOp
26042633
//===----------------------------------------------------------------------===//
@@ -3951,6 +3980,16 @@ void fir::StoreOp::build(mlir::OpBuilder &builder, mlir::OperationState &result,
39513980
build(builder, result, value, memref, {});
39523981
}
39533982

3983+
void fir::StoreOp::getEffects(
3984+
llvm::SmallVectorImpl<
3985+
mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>>
3986+
&effects) {
3987+
effects.emplace_back(mlir::MemoryEffects::Write::get(),
3988+
&getOperation()->getOpOperand(1),
3989+
mlir::SideEffects::DefaultResource::get());
3990+
addVolatileMemoryEffects(getMemref().getType(), effects);
3991+
}
3992+
39543993
//===----------------------------------------------------------------------===//
39553994
// CopyOp
39563995
//===----------------------------------------------------------------------===//

flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ getIntrinsicEffects(mlir::Operation *self,
6161
// }
6262
for (mlir::OpOperand &operand : self->getOpOperands()) {
6363
mlir::Type opTy = operand.get().getType();
64+
if (fir::isa_volatile_ref_type(opTy)) {
65+
effects.emplace_back(mlir::MemoryEffects::Read::get(), &operand,
66+
mlir::SideEffects::DefaultResource::get());
67+
effects.emplace_back(mlir::MemoryEffects::Write::get(), &operand,
68+
mlir::SideEffects::DefaultResource::get());
69+
}
6470
if (fir::isa_ref_type(opTy) || fir::isa_box_type(opTy))
6571
effects.emplace_back(mlir::MemoryEffects::Read::get(), &operand,
6672
mlir::SideEffects::DefaultResource::get());
@@ -164,6 +170,12 @@ void hlfir::AssignOp::getEffects(
164170
}
165171
}
166172

173+
if (fir::isa_volatile_ref_type(lhsType) ||
174+
fir::isa_volatile_ref_type(rhsType)) {
175+
effects.emplace_back(mlir::MemoryEffects::Read::get());
176+
effects.emplace_back(mlir::MemoryEffects::Write::get());
177+
}
178+
167179
if (getRealloc()) {
168180
// Reallocation of the data cannot be precisely described by this API.
169181
effects.emplace_back(mlir::MemoryEffects::Free::get(),

0 commit comments

Comments
 (0)