aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Optimizer/CodeGen/CGOps.cpp')
-rw-r--r--flang/lib/Optimizer/CodeGen/CGOps.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/flang/lib/Optimizer/CodeGen/CGOps.cpp b/flang/lib/Optimizer/CodeGen/CGOps.cpp
new file mode 100644
index 000000000000..527066ec5ccd
--- /dev/null
+++ b/flang/lib/Optimizer/CodeGen/CGOps.cpp
@@ -0,0 +1,64 @@
+//===-- CGOps.cpp -- FIR codegen operations -------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/
+//
+//===----------------------------------------------------------------------===//
+
+#include "CGOps.h"
+#include "flang/Optimizer/Dialect/FIRDialect.h"
+#include "flang/Optimizer/Dialect/FIROps.h"
+#include "flang/Optimizer/Dialect/FIRType.h"
+
+/// FIR codegen dialect constructor.
+fir::FIRCodeGenDialect::FIRCodeGenDialect(mlir::MLIRContext *ctx)
+ : mlir::Dialect("fircg", ctx, mlir::TypeID::get<FIRCodeGenDialect>()) {
+ addOperations<
+#define GET_OP_LIST
+#include "flang/Optimizer/CodeGen/CGOps.cpp.inc"
+ >();
+}
+
+// anchor the class vtable to this compilation unit
+fir::FIRCodeGenDialect::~FIRCodeGenDialect() {
+ // do nothing
+}
+
+#define GET_OP_CLASSES
+#include "flang/Optimizer/CodeGen/CGOps.cpp.inc"
+
+unsigned fir::cg::XEmboxOp::getOutRank() {
+ if (slice().empty())
+ return getRank();
+ auto outRank = fir::SliceOp::getOutputRank(slice());
+ assert(outRank >= 1);
+ return outRank;
+}
+
+unsigned fir::cg::XReboxOp::getOutRank() {
+ if (auto seqTy =
+ fir::dyn_cast_ptrOrBoxEleTy(getType()).dyn_cast<fir::SequenceType>())
+ return seqTy.getDimension();
+ return 0;
+}
+
+unsigned fir::cg::XReboxOp::getRank() {
+ if (auto seqTy = fir::dyn_cast_ptrOrBoxEleTy(box().getType())
+ .dyn_cast<fir::SequenceType>())
+ return seqTy.getDimension();
+ return 0;
+}
+
+unsigned fir::cg::XArrayCoorOp::getRank() {
+ auto memrefTy = memref().getType();
+ if (memrefTy.isa<fir::BoxType>())
+ if (auto seqty =
+ fir::dyn_cast_ptrOrBoxEleTy(memrefTy).dyn_cast<fir::SequenceType>())
+ return seqty.getDimension();
+ return shape().size();
+}