22class ConvertFIRToLLVMPattern :
public mlir::ConvertToLLVMPattern {
24 ConvertFIRToLLVMPattern(llvm::StringRef rootOpName,
25 mlir::MLIRContext *context,
28 mlir::PatternBenefit benefit = 1);
31 mlir::Type convertType(mlir::Type ty)
const {
32 return lowerTy().convertType(ty);
37 mlir::Type convertObjectType(mlir::Type firType)
const;
39 mlir::LLVM::ConstantOp
40 genI32Constant(mlir::Location loc, mlir::ConversionPatternRewriter &rewriter,
43 mlir::LLVM::ConstantOp
44 genConstantOffset(mlir::Location loc,
45 mlir::ConversionPatternRewriter &rewriter,
53 mlir::ConversionPatternRewriter &rewriter,
54 mlir::Type ty, mlir::Value val,
55 bool fold =
false)
const;
62 TypePair getBoxTypePair(mlir::Type firBoxTy)
const;
66 mlir::Value box, mlir::Type resultTy,
67 mlir::ConversionPatternRewriter &rewriter,
74 TypePair boxTy, mlir::Value box, mlir::Value dim,
75 mlir::ConversionPatternRewriter &rewriter)
const;
79 TypePair boxTy, mlir::Value box,
int dim,
80 mlir::ConversionPatternRewriter &rewriter)
const;
83 loadDimFieldFromBox(mlir::Location loc,
TypePair boxTy, mlir::Value box,
84 mlir::Value dim,
int off, mlir::Type ty,
85 mlir::ConversionPatternRewriter &rewriter)
const;
88 getDimFieldFromBox(mlir::Location loc,
TypePair boxTy, mlir::Value box,
89 int dim,
int off, mlir::Type ty,
90 mlir::ConversionPatternRewriter &rewriter)
const;
92 mlir::Value getStrideFromBox(mlir::Location loc,
TypePair boxTy,
93 mlir::Value box,
unsigned dim,
94 mlir::ConversionPatternRewriter &rewriter)
const;
99 mlir::ConversionPatternRewriter &rewriter)
const;
102 getElementSizeFromBox(mlir::Location loc, mlir::Type resultTy,
TypePair boxTy,
104 mlir::ConversionPatternRewriter &rewriter)
const;
108 mlir::ConversionPatternRewriter &rewriter)
const;
112 mlir::ConversionPatternRewriter &rewriter)
const;
116 mlir::Type getBoxEleTy(mlir::Type type,
120 mlir::Type getLlvmObjectTypeFromBoxType(mlir::Type boxType)
const;
125 mlir::ConversionPatternRewriter &rewriter)
const;
129 mlir::Value genBoxAttributeCheck(mlir::Location loc,
TypePair boxTy,
131 mlir::ConversionPatternRewriter &rewriter,
132 unsigned maskValue)
const;
138 mlir::ConversionPatternRewriter &rewriter)
const;
140 template <
typename... ARGS>
141 mlir::LLVM::GEPOp genGEP(mlir::Location loc, mlir::Type ty,
142 mlir::ConversionPatternRewriter &rewriter,
143 mlir::Value base, ARGS... args)
const {
146 mlir::LLVM::LLVMPointerType::get(ty.getContext(), 0);
147 return mlir::LLVM::GEPOp::create(rewriter, loc, llvmPtrTy, ty, base, cv);
157 mlir::Block *getBlockForAllocaInsert(mlir::Operation *op,
158 mlir::Region *parentRegion)
const;
167 genAllocaAndAddrCastWithType(mlir::Location loc, mlir::Type llvmObjectTy,
169 mlir::ConversionPatternRewriter &rewriter)
const;
173 this->getTypeConverter());
176 const mlir::DataLayout &getDataLayout()
const {
177 return lowerTy().getDataLayout();
180 void attachTBAATag(mlir::LLVM::AliasAnalysisOpInterface op,
181 mlir::Type baseFIRType, mlir::Type accessFIRType,
182 mlir::LLVM::GEPOp gep)
const {
183 lowerTy().attachTBAATag(op, baseFIRType, accessFIRType, gep);
187 getAllocaAddressSpace(mlir::ConversionPatternRewriter &rewriter)
const;
190 getProgramAddressSpace(mlir::ConversionPatternRewriter &rewriter)
const;
193 getGlobalAddressSpace(mlir::ConversionPatternRewriter &rewriter)
const;
195 const fir::FIRToLLVMPassOptions &options;
197 using ConvertToLLVMPattern::matchAndRewrite;
201class FIROpConversion :
public ConvertFIRToLLVMPattern {
203 using OpAdaptor =
typename SourceOp::Adaptor;
204 using OneToNOpAdaptor =
typename SourceOp::template GenericAdaptor<
205 mlir::ArrayRef<mlir::ValueRange>>;
209 mlir::PatternBenefit benefit = 1)
210 : ConvertFIRToLLVMPattern(SourceOp::getOperationName(),
211 &typeConverter.getContext(), typeConverter,
217 mlir::ConversionPatternRewriter &rewriter)
const final {
219 OpAdaptor(operands, mlir::cast<SourceOp>(op)),
224 mlir::ArrayRef<mlir::ValueRange> operands,
225 mlir::ConversionPatternRewriter &rewriter)
const final {
226 auto sourceOp = mlir::cast<SourceOp>(op);
232 virtual llvm::LogicalResult
234 mlir::ConversionPatternRewriter &rewriter)
const {
235 llvm_unreachable(
"matchAndRewrite is not implemented");
237 virtual llvm::LogicalResult
239 mlir::ConversionPatternRewriter &rewriter)
const {
240 return dispatchTo1To1(*
this, op, adaptor, rewriter);
244 using ConvertFIRToLLVMPattern::matchAndRewrite;
251 using FIROpConversion<FromOp>::FIROpConversion;
252 using OpAdaptor =
typename FromOp::Adaptor;
255 matchAndRewrite(FromOp op, OpAdaptor adaptor,
256 mlir::ConversionPatternRewriter &rewriter)
const final {
257 mlir::Type ty = this->convertType(op.getType());
258 return doRewrite(op, ty, adaptor, rewriter);
261 virtual llvm::LogicalResult
262 doRewrite(FromOp addr, mlir::Type ty, OpAdaptor adaptor,
263 mlir::ConversionPatternRewriter &rewriter)
const = 0;