Skip to content

Commit 2c1ae80

Browse files
authored
[mlir][side effect] refactor(*): Include more precise side effects (llvm#94213)
This patch adds more precise side effects to the current ops with memory effects, allowing us to determine which OpOperand/OpResult/BlockArgument the operation reads or writes, rather than just recording the reading and writing of values. This allows for convenient use of precise side effects to achieve analysis and optimization. Related discussions: https://discourse.llvm.org/t/rfc-add-operandindex-to-sideeffect-instance/79243
1 parent e5b0c21 commit 2c1ae80

File tree

40 files changed

+687
-397
lines changed

40 files changed

+687
-397
lines changed

flang/lib/Optimizer/Dialect/FIROps.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,9 +1058,9 @@ void fir::BoxRankOp::getEffects(
10581058
llvm::SmallVectorImpl<
10591059
mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>>
10601060
&effects) {
1061-
mlir::Value inputBox = getBox();
1062-
if (fir::isBoxAddress(inputBox.getType()))
1063-
effects.emplace_back(mlir::MemoryEffects::Read::get(), inputBox,
1061+
mlir::OpOperand &inputBox = getBoxMutable();
1062+
if (fir::isBoxAddress(inputBox.get().getType()))
1063+
effects.emplace_back(mlir::MemoryEffects::Read::get(), &inputBox,
10641064
mlir::SideEffects::DefaultResource::get());
10651065
}
10661066

@@ -2901,9 +2901,9 @@ void fir::ReboxAssumedRankOp::getEffects(
29012901
llvm::SmallVectorImpl<
29022902
mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>>
29032903
&effects) {
2904-
mlir::Value inputBox = getBox();
2905-
if (fir::isBoxAddress(inputBox.getType()))
2906-
effects.emplace_back(mlir::MemoryEffects::Read::get(), inputBox,
2904+
mlir::OpOperand &inputBox = getBoxMutable();
2905+
if (fir::isBoxAddress(inputBox.get().getType()))
2906+
effects.emplace_back(mlir::MemoryEffects::Read::get(), &inputBox,
29072907
mlir::SideEffects::DefaultResource::get());
29082908
}
29092909

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ getIntrinsicEffects(mlir::Operation *self,
4545
"hlfir intrinsic ops only produce 1 result");
4646
if (mlir::isa<hlfir::ExprType>(self->getResult(0).getType()))
4747
effects.emplace_back(mlir::MemoryEffects::Allocate::get(),
48-
self->getResult(0),
48+
self->getOpResult(0),
4949
mlir::SideEffects::DefaultResource::get());
5050

5151
// read effect if we read from a pointer or refference type
@@ -59,10 +59,10 @@ getIntrinsicEffects(mlir::Operation *self,
5959
// } to {
6060
// hlfir.yield %0#0 : !fir.box<!fir.array<?x?xf32>>
6161
// }
62-
for (mlir::Value operand : self->getOperands()) {
63-
mlir::Type opTy = operand.getType();
62+
for (mlir::OpOperand &operand : self->getOpOperands()) {
63+
mlir::Type opTy = operand.get().getType();
6464
if (fir::isa_ref_type(opTy) || fir::isa_box_type(opTy))
65-
effects.emplace_back(mlir::MemoryEffects::Read::get(), operand,
65+
effects.emplace_back(mlir::MemoryEffects::Read::get(), &operand,
6666
mlir::SideEffects::DefaultResource::get());
6767
}
6868
}

flang/lib/Optimizer/HLFIR/Transforms/ScheduleOrderedAssignments.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -225,14 +225,14 @@ static void gatherMemoryEffects(
225225

226226
/// Return the entity yielded by a region, or a null value if the region
227227
/// is not terminated by a yield.
228-
static mlir::Value getYieldedEntity(mlir::Region &region) {
228+
static mlir::OpOperand *getYieldedEntity(mlir::Region &region) {
229229
if (region.empty() || region.back().empty())
230230
return nullptr;
231231
if (auto yield = mlir::dyn_cast<hlfir::YieldOp>(region.back().back()))
232-
return yield.getEntity();
232+
return &yield.getEntityMutable();
233233
if (auto elementalAddr =
234234
mlir::dyn_cast<hlfir::ElementalAddrOp>(region.back().back()))
235-
return elementalAddr.getYieldOp().getEntity();
235+
return &elementalAddr.getYieldOp().getEntityMutable();
236236
return nullptr;
237237
}
238238

@@ -244,7 +244,7 @@ static void gatherAssignEffects(
244244
hlfir::RegionAssignOp regionAssign,
245245
bool userDefAssignmentMayOnlyWriteToAssignedVariable,
246246
llvm::SmallVectorImpl<mlir::MemoryEffects::EffectInstance> &assignEffects) {
247-
mlir::Value assignedVar = getYieldedEntity(regionAssign.getLhsRegion());
247+
mlir::OpOperand *assignedVar = getYieldedEntity(regionAssign.getLhsRegion());
248248
assert(assignedVar && "lhs cannot be an empty region");
249249
assignEffects.emplace_back(mlir::MemoryEffects::Write::get(), assignedVar);
250250

@@ -389,8 +389,8 @@ void Scheduler::saveEvaluationIfConflict(mlir::Region &yieldRegion,
389389
// with a finalizer, or a user defined assignment where the LHS is
390390
// intent(inout)).
391391
if (yieldIsImplicitRead) {
392-
mlir::Value entity = getYieldedEntity(yieldRegion);
393-
if (entity && hlfir::isFortranVariableType(entity.getType()))
392+
mlir::OpOperand *entity = getYieldedEntity(yieldRegion);
393+
if (entity && hlfir::isFortranVariableType(entity->get().getType()))
394394
effects.emplace_back(mlir::MemoryEffects::Read::get(), entity);
395395
}
396396
if (!leafRegionsMayOnlyRead && anyWrite(effects)) {
@@ -600,9 +600,9 @@ hlfir::buildEvaluationSchedule(hlfir::OrderedAssignmentTreeOpInterface root,
600600
}
601601

602602
mlir::Value hlfir::SaveEntity::getSavedValue() {
603-
mlir::Value saved = getYieldedEntity(*yieldRegion);
603+
mlir::OpOperand *saved = getYieldedEntity(*yieldRegion);
604604
assert(saved && "SaveEntity must contain region terminated by YieldOp");
605-
return saved;
605+
return saved->get();
606606
}
607607

608608
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)