diff options
author | Valentin Clement <clementval@gmail.com> | 2022-11-28 17:32:26 +0100 |
---|---|---|
committer | Valentin Clement <clementval@gmail.com> | 2022-11-28 17:36:03 +0100 |
commit | 1ea66eefec8dcb1c7edbc47489489250dd0f1996 (patch) | |
tree | 6044748eb8452e646e31a5f6af80118d6b68b896 /flang/lib/Optimizer/CodeGen/TargetRewrite.cpp | |
parent | c65d5d4aecc3600bad963c5bf24f2c192b9a1c1a (diff) | |
download | llvm-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.cpp | 17 |
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()); } } |