aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
diff options
context:
space:
mode:
authorValentin Clement <clementval@gmail.com>2022-11-28 17:32:26 +0100
committerValentin Clement <clementval@gmail.com>2022-11-28 17:36:03 +0100
commit1ea66eefec8dcb1c7edbc47489489250dd0f1996 (patch)
tree6044748eb8452e646e31a5f6af80118d6b68b896 /flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
parentc65d5d4aecc3600bad963c5bf24f2c192b9a1c1a (diff)
downloadllvm-1ea66eefec8dcb1c7edbc47489489250dd0f1996.zip
llvm-1ea66eefec8dcb1c7edbc47489489250dd0f1996.tar.gz
llvm-1ea66eefec8dcb1c7edbc47489489250dd0f1996.tar.bz2
[flang] Adapt target rewrite for fir.dispatch operation
Handle rewriting dispatch operation with complex arguments or return. sret will be done in a separate patch. Reviewed By: jeanPerier, PeteSteinfeld Differential Revision: https://reviews.llvm.org/D138820
Diffstat (limited to 'flang/lib/Optimizer/CodeGen/TargetRewrite.cpp')
-rw-r--r--flang/lib/Optimizer/CodeGen/TargetRewrite.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
index 9bf51cc..1ad2526 100644
--- a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
+++ b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp
@@ -209,6 +209,8 @@ public:
newOpers.push_back(callOp.getOperand(0));
dropFront = 1;
}
+ } else {
+ dropFront = 1; // First operand is the polymorphic object.
}
// Determine the rewrite function, `wrap`, for the result value.
@@ -231,6 +233,7 @@ public:
llvm::SmallVector<mlir::Type> trailingInTys;
llvm::SmallVector<mlir::Value> trailingOpers;
+ unsigned passArgShift = 0;
for (auto e : llvm::enumerate(
llvm::zip(fnTy.getInputs().drop_front(dropFront),
callOp.getOperands().drop_front(dropFront)))) {
@@ -314,6 +317,10 @@ public:
}
})
.Default([&](mlir::Type ty) {
+ if constexpr (std::is_same_v<std::decay_t<A>, fir::DispatchOp>) {
+ if (callOp.getPassArgPos() && *callOp.getPassArgPos() == index)
+ passArgShift = newOpers.size() - *callOp.getPassArgPos();
+ }
newInTys.push_back(ty);
newOpers.push_back(oper);
});
@@ -338,8 +345,14 @@ public:
else
replaceOp(callOp, newCall.getResults());
} else {
- // A is fir::DispatchOp
- TODO(loc, "dispatch not implemented");
+ fir::DispatchOp dispatchOp = rewriter->create<A>(
+ loc, newResTys, rewriter->getStringAttr(callOp.getMethod()),
+ callOp.getOperands()[0], newOpers,
+ rewriter->getI32IntegerAttr(*callOp.getPassArgPos() + passArgShift));
+ if (wrap)
+ replaceOp(callOp, (*wrap)(dispatchOp.getOperation()));
+ else
+ replaceOp(callOp, dispatchOp.getResults());
}
}