1*97d8972cSEric Schweitz //===-- CGOps.cpp -- FIR codegen operations -------------------------------===//
2*97d8972cSEric Schweitz //
3*97d8972cSEric Schweitz // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*97d8972cSEric Schweitz // See https://llvm.org/LICENSE.txt for license information.
5*97d8972cSEric Schweitz // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*97d8972cSEric Schweitz //
7*97d8972cSEric Schweitz //===----------------------------------------------------------------------===//
8*97d8972cSEric Schweitz //
9*97d8972cSEric Schweitz // Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/
10*97d8972cSEric Schweitz //
11*97d8972cSEric Schweitz //===----------------------------------------------------------------------===//
12*97d8972cSEric Schweitz 
13*97d8972cSEric Schweitz #include "CGOps.h"
14*97d8972cSEric Schweitz #include "flang/Optimizer/Dialect/FIRDialect.h"
15*97d8972cSEric Schweitz #include "flang/Optimizer/Dialect/FIROps.h"
16*97d8972cSEric Schweitz #include "flang/Optimizer/Dialect/FIRType.h"
17*97d8972cSEric Schweitz 
18*97d8972cSEric Schweitz /// FIR codegen dialect constructor.
FIRCodeGenDialect(mlir::MLIRContext * ctx)19*97d8972cSEric Schweitz fir::FIRCodeGenDialect::FIRCodeGenDialect(mlir::MLIRContext *ctx)
20*97d8972cSEric Schweitz     : mlir::Dialect("fircg", ctx, mlir::TypeID::get<FIRCodeGenDialect>()) {
21*97d8972cSEric Schweitz   addOperations<
22*97d8972cSEric Schweitz #define GET_OP_LIST
23*97d8972cSEric Schweitz #include "flang/Optimizer/CodeGen/CGOps.cpp.inc"
24*97d8972cSEric Schweitz       >();
25*97d8972cSEric Schweitz }
26*97d8972cSEric Schweitz 
27*97d8972cSEric Schweitz // anchor the class vtable to this compilation unit
~FIRCodeGenDialect()28*97d8972cSEric Schweitz fir::FIRCodeGenDialect::~FIRCodeGenDialect() {
29*97d8972cSEric Schweitz   // do nothing
30*97d8972cSEric Schweitz }
31*97d8972cSEric Schweitz 
32*97d8972cSEric Schweitz #define GET_OP_CLASSES
33*97d8972cSEric Schweitz #include "flang/Optimizer/CodeGen/CGOps.cpp.inc"
34*97d8972cSEric Schweitz 
getOutRank()35*97d8972cSEric Schweitz unsigned fir::cg::XEmboxOp::getOutRank() {
36*97d8972cSEric Schweitz   if (slice().empty())
37*97d8972cSEric Schweitz     return getRank();
38*97d8972cSEric Schweitz   auto outRank = fir::SliceOp::getOutputRank(slice());
39*97d8972cSEric Schweitz   assert(outRank >= 1);
40*97d8972cSEric Schweitz   return outRank;
41*97d8972cSEric Schweitz }
42*97d8972cSEric Schweitz 
getOutRank()43*97d8972cSEric Schweitz unsigned fir::cg::XReboxOp::getOutRank() {
44*97d8972cSEric Schweitz   if (auto seqTy =
45*97d8972cSEric Schweitz           fir::dyn_cast_ptrOrBoxEleTy(getType()).dyn_cast<fir::SequenceType>())
46*97d8972cSEric Schweitz     return seqTy.getDimension();
47*97d8972cSEric Schweitz   return 0;
48*97d8972cSEric Schweitz }
49*97d8972cSEric Schweitz 
getRank()50*97d8972cSEric Schweitz unsigned fir::cg::XReboxOp::getRank() {
51*97d8972cSEric Schweitz   if (auto seqTy = fir::dyn_cast_ptrOrBoxEleTy(box().getType())
52*97d8972cSEric Schweitz                        .dyn_cast<fir::SequenceType>())
53*97d8972cSEric Schweitz     return seqTy.getDimension();
54*97d8972cSEric Schweitz   return 0;
55*97d8972cSEric Schweitz }
56*97d8972cSEric Schweitz 
getRank()57*97d8972cSEric Schweitz unsigned fir::cg::XArrayCoorOp::getRank() {
58*97d8972cSEric Schweitz   auto memrefTy = memref().getType();
59*97d8972cSEric Schweitz   if (memrefTy.isa<fir::BoxType>())
60*97d8972cSEric Schweitz     if (auto seqty =
61*97d8972cSEric Schweitz             fir::dyn_cast_ptrOrBoxEleTy(memrefTy).dyn_cast<fir::SequenceType>())
62*97d8972cSEric Schweitz       return seqty.getDimension();
63*97d8972cSEric Schweitz   return shape().size();
64*97d8972cSEric Schweitz }
65