9#ifndef FORTRAN_OPTIMIZER_CODEGEN_FIROPPATTERNS_H
10#define FORTRAN_OPTIMIZER_CODEGEN_FIROPPATTERNS_H
12#include "flang/Optimizer/CodeGen/TypeConverter.h"
13#include "mlir/Conversion/LLVMCommon/Pattern.h"
14#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
15#include "mlir/IR/SymbolTable.h"
22static constexpr unsigned defaultAddressSpace = 0u;
70template <
typename OpTy,
typename NameT>
72 mlir::SymbolTableCollection *symbolTables) {
74 return mlir::dyn_cast_or_null<OpTy>(
75 mlir::SymbolTable::lookupSymbolIn(symbolTableOp, name));
77 if constexpr (std::is_same_v<NameT, mlir::SymbolRefAttr>)
78 op = symbolTables->lookupSymbolIn<OpTy>(symbolTableOp, name);
80 op = symbolTables->getSymbolTable(symbolTableOp).lookup<OpTy>(name);
81#ifdef EXPENSIVE_CHECKS
85 op == mlir::dyn_cast_or_null<OpTy>(
86 mlir::SymbolTable::lookupSymbolIn(symbolTableOp, name))) &&
87 "symbol tables and module out of sync");
95 mlir::Operation *symbolTableOp, mlir::Operation *symbol);
101 mlir::Operation *symbolTableOp, mlir::Operation *oldSymbol,
102 mlir::Operation *newSymbol);
106 mlir::Operation *symbolTableOp, mlir::Operation *symbol);
114 mlir::Operation *root);
116class ConvertFIRToLLVMPattern :
public mlir::ConvertToLLVMPattern {
118 ConvertFIRToLLVMPattern(llvm::StringRef rootOpName,
119 mlir::MLIRContext *context,
123 mlir::PatternBenefit benefit = 1);
126 mlir::Type convertType(mlir::Type ty)
const {
127 return lowerTy().convertType(ty);
132 mlir::Type convertObjectType(mlir::Type firType)
const;
134 mlir::LLVM::ConstantOp
135 genI32Constant(mlir::Location loc, mlir::ConversionPatternRewriter &rewriter,
138 mlir::LLVM::ConstantOp
139 genConstantOffset(mlir::Location loc,
140 mlir::ConversionPatternRewriter &rewriter,
148 mlir::ConversionPatternRewriter &rewriter,
149 mlir::Type ty, mlir::Value val,
150 bool fold =
false)
const;
157 TypePair getBoxTypePair(mlir::Type firBoxTy)
const;
161 mlir::Value box, mlir::Type resultTy,
162 mlir::ConversionPatternRewriter &rewriter,
169 TypePair boxTy, mlir::Value box, mlir::Value dim,
170 mlir::ConversionPatternRewriter &rewriter)
const;
174 TypePair boxTy, mlir::Value box,
int dim,
175 mlir::ConversionPatternRewriter &rewriter)
const;
178 loadDimFieldFromBox(mlir::Location loc,
TypePair boxTy, mlir::Value box,
179 mlir::Value dim,
int off, mlir::Type ty,
180 mlir::ConversionPatternRewriter &rewriter)
const;
183 getDimFieldFromBox(mlir::Location loc,
TypePair boxTy, mlir::Value box,
184 int dim,
int off, mlir::Type ty,
185 mlir::ConversionPatternRewriter &rewriter)
const;
187 mlir::Value getStrideFromBox(mlir::Location loc,
TypePair boxTy,
188 mlir::Value box,
unsigned dim,
189 mlir::ConversionPatternRewriter &rewriter)
const;
194 mlir::ConversionPatternRewriter &rewriter)
const;
197 getElementSizeFromBox(mlir::Location loc, mlir::Type resultTy,
TypePair boxTy,
199 mlir::ConversionPatternRewriter &rewriter)
const;
203 mlir::ConversionPatternRewriter &rewriter)
const;
207 mlir::ConversionPatternRewriter &rewriter)
const;
211 mlir::Type getBoxEleTy(mlir::Type type,
215 mlir::Type getLlvmObjectTypeFromBoxType(mlir::Type boxType)
const;
220 mlir::ConversionPatternRewriter &rewriter)
const;
224 mlir::Value genBoxAttributeCheck(mlir::Location loc,
TypePair boxTy,
226 mlir::ConversionPatternRewriter &rewriter,
227 unsigned maskValue)
const;
233 mlir::ConversionPatternRewriter &rewriter)
const;
235 template <
typename... ARGS>
236 mlir::LLVM::GEPOp genGEP(mlir::Location loc, mlir::Type ty,
237 mlir::ConversionPatternRewriter &rewriter,
238 mlir::Value base, ARGS... args)
const {
241 mlir::LLVM::LLVMPointerType::get(ty.getContext(), 0);
242 return mlir::LLVM::GEPOp::create(rewriter, loc, llvmPtrTy, ty, base, cv);
252 mlir::Block *getBlockForAllocaInsert(mlir::Operation *op,
253 mlir::Region *parentRegion)
const;
262 genAllocaAndAddrCastWithType(mlir::Location loc, mlir::Type llvmObjectTy,
264 mlir::ConversionPatternRewriter &rewriter)
const;
268 this->getTypeConverter());
271 const mlir::DataLayout &getDataLayout()
const {
272 return lowerTy().getDataLayout();
275 void attachTBAATag(mlir::LLVM::AliasAnalysisOpInterface op,
276 mlir::Type baseFIRType, mlir::Type accessFIRType,
277 mlir::LLVM::GEPOp gep)
const {
278 lowerTy().attachTBAATag(op, baseFIRType, accessFIRType, gep);
282 getAllocaAddressSpace(mlir::ConversionPatternRewriter &rewriter)
const;
285 getProgramAddressSpace(mlir::ConversionPatternRewriter &rewriter)
const;
288 getGlobalAddressSpace(mlir::ConversionPatternRewriter &rewriter)
const;
290 const fir::FIRToLLVMPassOptions &options;
297 using ConvertToLLVMPattern::matchAndRewrite;
300template <
typename SourceOp>
301class FIROpConversion :
public ConvertFIRToLLVMPattern {
303 using OpAdaptor =
typename SourceOp::Adaptor;
304 using OneToNOpAdaptor =
typename SourceOp::template GenericAdaptor<
305 mlir::ArrayRef<mlir::ValueRange>>;
310 mlir::PatternBenefit benefit = 1)
311 : ConvertFIRToLLVMPattern(SourceOp::getOperationName(),
312 &typeConverter.getContext(), typeConverter,
318 mlir::ConversionPatternRewriter &rewriter)
const final {
320 OpAdaptor(operands, mlir::cast<SourceOp>(op)),
325 mlir::ArrayRef<mlir::ValueRange> operands,
326 mlir::ConversionPatternRewriter &rewriter)
const final {
327 auto sourceOp = mlir::cast<SourceOp>(op);
333 virtual llvm::LogicalResult
335 mlir::ConversionPatternRewriter &rewriter)
const {
336 llvm_unreachable(
"matchAndRewrite is not implemented");
338 virtual llvm::LogicalResult
340 mlir::ConversionPatternRewriter &rewriter)
const {
341 return dispatchTo1To1(*
this, op, adaptor, rewriter);
345 using ConvertFIRToLLVMPattern::matchAndRewrite;
349template <
typename FromOp>
352 using FIROpConversion<FromOp>::FIROpConversion;
353 using OpAdaptor =
typename FromOp::Adaptor;
356 matchAndRewrite(FromOp op, OpAdaptor adaptor,
357 mlir::ConversionPatternRewriter &rewriter)
const final {
358 mlir::Type ty = this->convertType(op.getType());
359 return doRewrite(op, ty, adaptor, rewriter);
362 virtual llvm::LogicalResult
363 doRewrite(FromOp addr, mlir::Type ty, OpAdaptor adaptor,
364 mlir::ConversionPatternRewriter &rewriter)
const = 0;
llvm::SmallVector< mlir::Value, 3 > getDimsFromBox(mlir::Location loc, llvm::ArrayRef< mlir::Type > retTys, TypePair boxTy, mlir::Value box, mlir::Value dim, mlir::ConversionPatternRewriter &rewriter) const
Definition FIROpPatterns.cpp:155
mlir::Value computeBoxSize(mlir::Location, TypePair boxTy, mlir::Value box, mlir::ConversionPatternRewriter &rewriter) const
Definition FIROpPatterns.cpp:299
mlir::SymbolTableCollection * symbolTables
Definition FIROpPatterns.h:295
mlir::Value getRankFromBox(mlir::Location loc, TypePair boxTy, mlir::Value box, mlir::ConversionPatternRewriter &rewriter) const
Read base address from a fir.box. Returned address has type ty.
Definition FIROpPatterns.cpp:231
mlir::Value getBaseAddrFromBox(mlir::Location loc, TypePair boxTy, mlir::Value box, mlir::ConversionPatternRewriter &rewriter) const
Read base address from a fir.box. Returned address has type ty.
Definition FIROpPatterns.cpp:217
mlir::Value integerCast(mlir::Location loc, mlir::ConversionPatternRewriter &rewriter, mlir::Type ty, mlir::Value val, bool fold=false) const
Definition FIROpPatterns.cpp:104
mlir::Value getExtraFromBox(mlir::Location loc, TypePair boxTy, mlir::Value box, mlir::ConversionPatternRewriter &rewriter) const
Read the extra field from a fir.box.
Definition FIROpPatterns.cpp:239
mlir::Value loadTypeDescAddress(mlir::Location loc, TypePair boxTy, mlir::Value box, mlir::ConversionPatternRewriter &rewriter) const
Read the address of the type descriptor from a box.
Definition FIROpPatterns.cpp:275
mlir::Value getValueFromBox(mlir::Location loc, TypePair boxTy, mlir::Value box, mlir::Type resultTy, mlir::ConversionPatternRewriter &rewriter, int boxValue) const
Construct code sequence to extract the specific value from a fir.box.
Definition FIROpPatterns.cpp:136
FIR conversion pattern template.
Definition FIROpPatterns.h:350
virtual llvm::LogicalResult matchAndRewrite(SourceOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const
Definition FIROpPatterns.h:334
llvm::LogicalResult matchAndRewrite(mlir::Operation *op, mlir::ArrayRef< mlir::Value > operands, mlir::ConversionPatternRewriter &rewriter) const final
Wrappers around the RewritePattern methods that pass the derived op type.
Definition FIROpPatterns.h:317
Definition TypeConverter.h:49
Definition AbstractConverter.h:37
void buildSymbolTables(mlir::SymbolTableCollection &symbolTables, mlir::Operation *root)
Definition FIROpPatterns.cpp:67
void replaceSymbol(mlir::SymbolTableCollection *symbolTables, mlir::Operation *symbolTableOp, mlir::Operation *oldSymbol, mlir::Operation *newSymbol)
Definition FIROpPatterns.cpp:52
OpTy lookupSymbolIn(mlir::Operation *symbolTableOp, NameT name, mlir::SymbolTableCollection *symbolTables)
Definition FIROpPatterns.h:71
void registerSymbol(mlir::SymbolTableCollection *symbolTables, mlir::Operation *symbolTableOp, mlir::Operation *symbol)
Definition FIROpPatterns.cpp:37
void unregisterSymbol(mlir::SymbolTableCollection *symbolTables, mlir::Operation *symbolTableOp, mlir::Operation *symbol)
Forget symbol, which is about to be erased. No-op without a collection.
Definition FIROpPatterns.cpp:61
Definition FIROpPatterns.h:152
FIR to LLVM translation pass options.
Definition CodeGen.h:40