@@ -90,6 +90,62 @@ llvm::LogicalResult hlfir::AssignOp::verify() {
9090 return mlir::success ();
9191}
9292
93+ void hlfir::AssignOp::getEffects (
94+ llvm::SmallVectorImpl<
95+ mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>>
96+ &effects) {
97+ mlir::OpOperand &rhs = getRhsMutable ();
98+ mlir::OpOperand &lhs = getLhsMutable ();
99+ mlir::Type rhsType = getRhs ().getType ();
100+ mlir::Type lhsType = getLhs ().getType ();
101+ if (mlir::isa<fir::RecordType>(hlfir::getFortranElementType (lhsType))) {
102+ // For derived type assignments, set unknown read/write effects since it
103+ // is not known here if user defined finalization is needed, and also
104+ // because allocatable components may lead to "deeper" read/write effects
105+ // that cannot be described with this API.
106+ effects.emplace_back (mlir::MemoryEffects::Read::get (),
107+ mlir::SideEffects::DefaultResource::get ());
108+ effects.emplace_back (mlir::MemoryEffects::Write::get (),
109+ mlir::SideEffects::DefaultResource::get ());
110+ } else {
111+ // Read effect when RHS is a variable.
112+ if (hlfir::isFortranVariableType (rhsType)) {
113+ if (hlfir::isBoxAddressType (rhsType)) {
114+ // Unknown read effect if the RHS is a descriptor since the read effect
115+ // on the data cannot be described.
116+ effects.emplace_back (mlir::MemoryEffects::Read::get (),
117+ mlir::SideEffects::DefaultResource::get ());
118+ } else {
119+ effects.emplace_back (mlir::MemoryEffects::Read::get (), &rhs,
120+ mlir::SideEffects::DefaultResource::get ());
121+ }
122+ }
123+
124+ // Write effects on LHS.
125+ if (hlfir::isBoxAddressType (lhsType)) {
126+ // If the LHS is a descriptor, the descriptor will be read and the data
127+ // write cannot be described in this API (and the descriptor may be
128+ // written to in case of realloc, which is covered by the unknown write
129+ // effect.
130+ effects.emplace_back (mlir::MemoryEffects::Read::get (), &lhs,
131+ mlir::SideEffects::DefaultResource::get ());
132+ effects.emplace_back (mlir::MemoryEffects::Write::get (),
133+ mlir::SideEffects::DefaultResource::get ());
134+ } else {
135+ effects.emplace_back (mlir::MemoryEffects::Write::get (), &lhs,
136+ mlir::SideEffects::DefaultResource::get ());
137+ }
138+ }
139+
140+ if (getRealloc ()) {
141+ // Reallocation of the data cannot be precisely described by this API.
142+ effects.emplace_back (mlir::MemoryEffects::Free::get (),
143+ mlir::SideEffects::DefaultResource::get ());
144+ effects.emplace_back (mlir::MemoryEffects::Allocate::get (),
145+ mlir::SideEffects::DefaultResource::get ());
146+ }
147+ }
148+
93149// ===----------------------------------------------------------------------===//
94150// DeclareOp
95151// ===----------------------------------------------------------------------===//
0 commit comments