Before the conversion to LLVM-IR dialect and ultimately LLVM IR, FIR is partially rewritten into a codegen form. This patch adds that pass, the fircg dialect, and the small set of Ops in the fircg (sub) dialect. Fircg is not part of the FIR dialect and should never be used outside of the (closed) conversion to LLVM IR. Authors: Eric Schweitz, Jean Perier, Rajan Walia, et.al. Differential Revision: https://reviews.llvm.org/D98063
65 lines
2.0 KiB
C++
65 lines
2.0 KiB
C++
//===-- 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();
|
|
}
|