1*700637cbSDimitry Andric //====- LowerToLLVM.h- Lowering from CIR to LLVM --------------------------===// 2*700637cbSDimitry Andric // 3*700637cbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*700637cbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*700637cbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*700637cbSDimitry Andric // 7*700637cbSDimitry Andric //===----------------------------------------------------------------------===// 8*700637cbSDimitry Andric // 9*700637cbSDimitry Andric // This file declares an interface for converting CIR modules to LLVM IR. 10*700637cbSDimitry Andric // 11*700637cbSDimitry Andric //===----------------------------------------------------------------------===// 12*700637cbSDimitry Andric #ifndef CLANG_CIR_LOWERTOLLVM_H 13*700637cbSDimitry Andric #define CLANG_CIR_LOWERTOLLVM_H 14*700637cbSDimitry Andric 15*700637cbSDimitry Andric #include "mlir/Dialect/LLVMIR/LLVMAttrs.h" 16*700637cbSDimitry Andric #include "mlir/Dialect/LLVMIR/LLVMDialect.h" 17*700637cbSDimitry Andric #include "mlir/Transforms/DialectConversion.h" 18*700637cbSDimitry Andric #include "clang/CIR/Dialect/IR/CIRDialect.h" 19*700637cbSDimitry Andric 20*700637cbSDimitry Andric namespace cir { 21*700637cbSDimitry Andric 22*700637cbSDimitry Andric namespace direct { 23*700637cbSDimitry Andric 24*700637cbSDimitry Andric /// Convert a CIR attribute to an LLVM attribute. May use the datalayout for 25*700637cbSDimitry Andric /// lowering attributes to-be-stored in memory. 26*700637cbSDimitry Andric mlir::Value lowerCirAttrAsValue(mlir::Operation *parentOp, mlir::Attribute attr, 27*700637cbSDimitry Andric mlir::ConversionPatternRewriter &rewriter, 28*700637cbSDimitry Andric const mlir::TypeConverter *converter); 29*700637cbSDimitry Andric 30*700637cbSDimitry Andric mlir::LLVM::Linkage convertLinkage(cir::GlobalLinkageKind linkage); 31*700637cbSDimitry Andric 32*700637cbSDimitry Andric void convertSideEffectForCall(mlir::Operation *callOp, bool isNothrow, 33*700637cbSDimitry Andric cir::SideEffect sideEffect, 34*700637cbSDimitry Andric mlir::LLVM::MemoryEffectsAttr &memoryEffect, 35*700637cbSDimitry Andric bool &noUnwind, bool &willReturn); 36*700637cbSDimitry Andric 37*700637cbSDimitry Andric class CIRToLLVMAssumeOpLowering 38*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::AssumeOp> { 39*700637cbSDimitry Andric public: 40*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::AssumeOp>::OpConversionPattern; 41*700637cbSDimitry Andric 42*700637cbSDimitry Andric mlir::LogicalResult 43*700637cbSDimitry Andric matchAndRewrite(cir::AssumeOp op, OpAdaptor, 44*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 45*700637cbSDimitry Andric }; 46*700637cbSDimitry Andric 47*700637cbSDimitry Andric class CIRToLLVMBitClrsbOpLowering 48*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::BitClrsbOp> { 49*700637cbSDimitry Andric public: 50*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::BitClrsbOp>::OpConversionPattern; 51*700637cbSDimitry Andric 52*700637cbSDimitry Andric mlir::LogicalResult 53*700637cbSDimitry Andric matchAndRewrite(cir::BitClrsbOp op, OpAdaptor, 54*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 55*700637cbSDimitry Andric }; 56*700637cbSDimitry Andric 57*700637cbSDimitry Andric class CIRToLLVMBitClzOpLowering 58*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::BitClzOp> { 59*700637cbSDimitry Andric public: 60*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::BitClzOp>::OpConversionPattern; 61*700637cbSDimitry Andric 62*700637cbSDimitry Andric mlir::LogicalResult 63*700637cbSDimitry Andric matchAndRewrite(cir::BitClzOp op, OpAdaptor, 64*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 65*700637cbSDimitry Andric }; 66*700637cbSDimitry Andric 67*700637cbSDimitry Andric class CIRToLLVMBitCtzOpLowering 68*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::BitCtzOp> { 69*700637cbSDimitry Andric public: 70*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::BitCtzOp>::OpConversionPattern; 71*700637cbSDimitry Andric 72*700637cbSDimitry Andric mlir::LogicalResult 73*700637cbSDimitry Andric matchAndRewrite(cir::BitCtzOp op, OpAdaptor, 74*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 75*700637cbSDimitry Andric }; 76*700637cbSDimitry Andric 77*700637cbSDimitry Andric class CIRToLLVMBitParityOpLowering 78*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::BitParityOp> { 79*700637cbSDimitry Andric public: 80*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::BitParityOp>::OpConversionPattern; 81*700637cbSDimitry Andric 82*700637cbSDimitry Andric mlir::LogicalResult 83*700637cbSDimitry Andric matchAndRewrite(cir::BitParityOp op, OpAdaptor, 84*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 85*700637cbSDimitry Andric }; 86*700637cbSDimitry Andric 87*700637cbSDimitry Andric class CIRToLLVMBitPopcountOpLowering 88*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::BitPopcountOp> { 89*700637cbSDimitry Andric public: 90*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::BitPopcountOp>::OpConversionPattern; 91*700637cbSDimitry Andric 92*700637cbSDimitry Andric mlir::LogicalResult 93*700637cbSDimitry Andric matchAndRewrite(cir::BitPopcountOp op, OpAdaptor, 94*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 95*700637cbSDimitry Andric }; 96*700637cbSDimitry Andric 97*700637cbSDimitry Andric class CIRToLLVMBitReverseOpLowering 98*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::BitReverseOp> { 99*700637cbSDimitry Andric public: 100*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::BitReverseOp>::OpConversionPattern; 101*700637cbSDimitry Andric 102*700637cbSDimitry Andric mlir::LogicalResult 103*700637cbSDimitry Andric matchAndRewrite(cir::BitReverseOp op, OpAdaptor, 104*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 105*700637cbSDimitry Andric }; 106*700637cbSDimitry Andric 107*700637cbSDimitry Andric class CIRToLLVMBrCondOpLowering 108*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::BrCondOp> { 109*700637cbSDimitry Andric public: 110*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::BrCondOp>::OpConversionPattern; 111*700637cbSDimitry Andric 112*700637cbSDimitry Andric mlir::LogicalResult 113*700637cbSDimitry Andric matchAndRewrite(cir::BrCondOp op, OpAdaptor, 114*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 115*700637cbSDimitry Andric }; 116*700637cbSDimitry Andric 117*700637cbSDimitry Andric class CIRToLLVMByteSwapOpLowering 118*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::ByteSwapOp> { 119*700637cbSDimitry Andric public: 120*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::ByteSwapOp>::OpConversionPattern; 121*700637cbSDimitry Andric 122*700637cbSDimitry Andric mlir::LogicalResult 123*700637cbSDimitry Andric matchAndRewrite(cir::ByteSwapOp op, OpAdaptor, 124*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 125*700637cbSDimitry Andric }; 126*700637cbSDimitry Andric 127*700637cbSDimitry Andric class CIRToLLVMCastOpLowering : public mlir::OpConversionPattern<cir::CastOp> { 128*700637cbSDimitry Andric mlir::DataLayout const &dataLayout; 129*700637cbSDimitry Andric 130*700637cbSDimitry Andric mlir::Type convertTy(mlir::Type ty) const; 131*700637cbSDimitry Andric 132*700637cbSDimitry Andric public: CIRToLLVMCastOpLowering(const mlir::TypeConverter & typeConverter,mlir::MLIRContext * context,mlir::DataLayout const & dataLayout)133*700637cbSDimitry Andric CIRToLLVMCastOpLowering(const mlir::TypeConverter &typeConverter, 134*700637cbSDimitry Andric mlir::MLIRContext *context, 135*700637cbSDimitry Andric mlir::DataLayout const &dataLayout) 136*700637cbSDimitry Andric : OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {} 137*700637cbSDimitry Andric 138*700637cbSDimitry Andric mlir::LogicalResult 139*700637cbSDimitry Andric matchAndRewrite(cir::CastOp op, OpAdaptor, 140*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 141*700637cbSDimitry Andric }; 142*700637cbSDimitry Andric 143*700637cbSDimitry Andric class CIRToLLVMExpectOpLowering 144*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::ExpectOp> { 145*700637cbSDimitry Andric public: 146*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::ExpectOp>::OpConversionPattern; 147*700637cbSDimitry Andric 148*700637cbSDimitry Andric mlir::LogicalResult 149*700637cbSDimitry Andric matchAndRewrite(cir::ExpectOp op, OpAdaptor, 150*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 151*700637cbSDimitry Andric }; 152*700637cbSDimitry Andric 153*700637cbSDimitry Andric class CIRToLLVMReturnOpLowering 154*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::ReturnOp> { 155*700637cbSDimitry Andric public: 156*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::ReturnOp>::OpConversionPattern; 157*700637cbSDimitry Andric 158*700637cbSDimitry Andric mlir::LogicalResult 159*700637cbSDimitry Andric matchAndRewrite(cir::ReturnOp op, OpAdaptor, 160*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 161*700637cbSDimitry Andric }; 162*700637cbSDimitry Andric 163*700637cbSDimitry Andric class CIRToLLVMCallOpLowering : public mlir::OpConversionPattern<cir::CallOp> { 164*700637cbSDimitry Andric public: 165*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::CallOp>::OpConversionPattern; 166*700637cbSDimitry Andric 167*700637cbSDimitry Andric mlir::LogicalResult 168*700637cbSDimitry Andric matchAndRewrite(cir::CallOp op, OpAdaptor adaptor, 169*700637cbSDimitry Andric mlir::ConversionPatternRewriter &rewriter) const override; 170*700637cbSDimitry Andric }; 171*700637cbSDimitry Andric 172*700637cbSDimitry Andric class CIRToLLVMAllocaOpLowering 173*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::AllocaOp> { 174*700637cbSDimitry Andric mlir::DataLayout const &dataLayout; 175*700637cbSDimitry Andric 176*700637cbSDimitry Andric public: CIRToLLVMAllocaOpLowering(mlir::TypeConverter const & typeConverter,mlir::MLIRContext * context,mlir::DataLayout const & dataLayout)177*700637cbSDimitry Andric CIRToLLVMAllocaOpLowering(mlir::TypeConverter const &typeConverter, 178*700637cbSDimitry Andric mlir::MLIRContext *context, 179*700637cbSDimitry Andric mlir::DataLayout const &dataLayout) 180*700637cbSDimitry Andric : OpConversionPattern<cir::AllocaOp>(typeConverter, context), 181*700637cbSDimitry Andric dataLayout(dataLayout) {} 182*700637cbSDimitry Andric 183*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::AllocaOp>::OpConversionPattern; 184*700637cbSDimitry Andric 185*700637cbSDimitry Andric mlir::LogicalResult 186*700637cbSDimitry Andric matchAndRewrite(cir::AllocaOp op, OpAdaptor, 187*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 188*700637cbSDimitry Andric }; 189*700637cbSDimitry Andric 190*700637cbSDimitry Andric class CIRToLLVMLoadOpLowering : public mlir::OpConversionPattern<cir::LoadOp> { 191*700637cbSDimitry Andric mlir::DataLayout const &dataLayout; 192*700637cbSDimitry Andric 193*700637cbSDimitry Andric public: CIRToLLVMLoadOpLowering(const mlir::TypeConverter & typeConverter,mlir::MLIRContext * context,mlir::DataLayout const & dataLayout)194*700637cbSDimitry Andric CIRToLLVMLoadOpLowering(const mlir::TypeConverter &typeConverter, 195*700637cbSDimitry Andric mlir::MLIRContext *context, 196*700637cbSDimitry Andric mlir::DataLayout const &dataLayout) 197*700637cbSDimitry Andric : OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {} 198*700637cbSDimitry Andric 199*700637cbSDimitry Andric mlir::LogicalResult 200*700637cbSDimitry Andric matchAndRewrite(cir::LoadOp op, OpAdaptor, 201*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 202*700637cbSDimitry Andric }; 203*700637cbSDimitry Andric 204*700637cbSDimitry Andric class CIRToLLVMStoreOpLowering 205*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::StoreOp> { 206*700637cbSDimitry Andric mlir::DataLayout const &dataLayout; 207*700637cbSDimitry Andric 208*700637cbSDimitry Andric public: CIRToLLVMStoreOpLowering(const mlir::TypeConverter & typeConverter,mlir::MLIRContext * context,mlir::DataLayout const & dataLayout)209*700637cbSDimitry Andric CIRToLLVMStoreOpLowering(const mlir::TypeConverter &typeConverter, 210*700637cbSDimitry Andric mlir::MLIRContext *context, 211*700637cbSDimitry Andric mlir::DataLayout const &dataLayout) 212*700637cbSDimitry Andric : OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {} 213*700637cbSDimitry Andric 214*700637cbSDimitry Andric mlir::LogicalResult 215*700637cbSDimitry Andric matchAndRewrite(cir::StoreOp op, OpAdaptor, 216*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 217*700637cbSDimitry Andric }; 218*700637cbSDimitry Andric 219*700637cbSDimitry Andric class CIRToLLVMConstantOpLowering 220*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::ConstantOp> { 221*700637cbSDimitry Andric public: CIRToLLVMConstantOpLowering(const mlir::TypeConverter & typeConverter,mlir::MLIRContext * context)222*700637cbSDimitry Andric CIRToLLVMConstantOpLowering(const mlir::TypeConverter &typeConverter, 223*700637cbSDimitry Andric mlir::MLIRContext *context) 224*700637cbSDimitry Andric : OpConversionPattern(typeConverter, context) { 225*700637cbSDimitry Andric setHasBoundedRewriteRecursion(); 226*700637cbSDimitry Andric } 227*700637cbSDimitry Andric 228*700637cbSDimitry Andric mlir::LogicalResult 229*700637cbSDimitry Andric matchAndRewrite(cir::ConstantOp op, OpAdaptor, 230*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 231*700637cbSDimitry Andric }; 232*700637cbSDimitry Andric 233*700637cbSDimitry Andric class CIRToLLVMFuncOpLowering : public mlir::OpConversionPattern<cir::FuncOp> { getLinkageAttrNameString()234*700637cbSDimitry Andric static mlir::StringRef getLinkageAttrNameString() { return "linkage"; } 235*700637cbSDimitry Andric 236*700637cbSDimitry Andric void lowerFuncAttributes( 237*700637cbSDimitry Andric cir::FuncOp func, bool filterArgAndResAttrs, 238*700637cbSDimitry Andric mlir::SmallVectorImpl<mlir::NamedAttribute> &result) const; 239*700637cbSDimitry Andric 240*700637cbSDimitry Andric public: 241*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::FuncOp>::OpConversionPattern; 242*700637cbSDimitry Andric 243*700637cbSDimitry Andric mlir::LogicalResult 244*700637cbSDimitry Andric matchAndRewrite(cir::FuncOp op, OpAdaptor, 245*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 246*700637cbSDimitry Andric }; 247*700637cbSDimitry Andric 248*700637cbSDimitry Andric class CIRToLLVMSwitchFlatOpLowering 249*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::SwitchFlatOp> { 250*700637cbSDimitry Andric public: 251*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::SwitchFlatOp>::OpConversionPattern; 252*700637cbSDimitry Andric 253*700637cbSDimitry Andric mlir::LogicalResult 254*700637cbSDimitry Andric matchAndRewrite(cir::SwitchFlatOp op, OpAdaptor, 255*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 256*700637cbSDimitry Andric }; 257*700637cbSDimitry Andric 258*700637cbSDimitry Andric class CIRToLLVMGetGlobalOpLowering 259*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::GetGlobalOp> { 260*700637cbSDimitry Andric public: 261*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::GetGlobalOp>::OpConversionPattern; 262*700637cbSDimitry Andric 263*700637cbSDimitry Andric mlir::LogicalResult 264*700637cbSDimitry Andric matchAndRewrite(cir::GetGlobalOp op, OpAdaptor, 265*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 266*700637cbSDimitry Andric }; 267*700637cbSDimitry Andric 268*700637cbSDimitry Andric class CIRToLLVMGlobalOpLowering 269*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::GlobalOp> { 270*700637cbSDimitry Andric const mlir::DataLayout &dataLayout; 271*700637cbSDimitry Andric 272*700637cbSDimitry Andric public: CIRToLLVMGlobalOpLowering(const mlir::TypeConverter & typeConverter,mlir::MLIRContext * context,const mlir::DataLayout & dataLayout)273*700637cbSDimitry Andric CIRToLLVMGlobalOpLowering(const mlir::TypeConverter &typeConverter, 274*700637cbSDimitry Andric mlir::MLIRContext *context, 275*700637cbSDimitry Andric const mlir::DataLayout &dataLayout) 276*700637cbSDimitry Andric : OpConversionPattern(typeConverter, context), dataLayout(dataLayout) { 277*700637cbSDimitry Andric setHasBoundedRewriteRecursion(); 278*700637cbSDimitry Andric } 279*700637cbSDimitry Andric 280*700637cbSDimitry Andric mlir::LogicalResult 281*700637cbSDimitry Andric matchAndRewrite(cir::GlobalOp op, OpAdaptor adaptor, 282*700637cbSDimitry Andric mlir::ConversionPatternRewriter &rewriter) const override; 283*700637cbSDimitry Andric 284*700637cbSDimitry Andric private: 285*700637cbSDimitry Andric mlir::LogicalResult matchAndRewriteRegionInitializedGlobal( 286*700637cbSDimitry Andric cir::GlobalOp op, mlir::Attribute init, 287*700637cbSDimitry Andric mlir::ConversionPatternRewriter &rewriter) const; 288*700637cbSDimitry Andric 289*700637cbSDimitry Andric void setupRegionInitializedLLVMGlobalOp( 290*700637cbSDimitry Andric cir::GlobalOp op, mlir::ConversionPatternRewriter &rewriter) const; 291*700637cbSDimitry Andric 292*700637cbSDimitry Andric mutable mlir::LLVM::ComdatOp comdatOp = nullptr; 293*700637cbSDimitry Andric mlir::SymbolRefAttr getComdatAttr(cir::GlobalOp &op, 294*700637cbSDimitry Andric mlir::OpBuilder &builder) const; 295*700637cbSDimitry Andric }; 296*700637cbSDimitry Andric 297*700637cbSDimitry Andric class CIRToLLVMUnaryOpLowering 298*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::UnaryOp> { 299*700637cbSDimitry Andric public: 300*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::UnaryOp>::OpConversionPattern; 301*700637cbSDimitry Andric 302*700637cbSDimitry Andric mlir::LogicalResult 303*700637cbSDimitry Andric matchAndRewrite(cir::UnaryOp op, OpAdaptor, 304*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 305*700637cbSDimitry Andric }; 306*700637cbSDimitry Andric 307*700637cbSDimitry Andric class CIRToLLVMBinOpLowering : public mlir::OpConversionPattern<cir::BinOp> { 308*700637cbSDimitry Andric mlir::LLVM::IntegerOverflowFlags getIntOverflowFlag(cir::BinOp op) const; 309*700637cbSDimitry Andric 310*700637cbSDimitry Andric public: 311*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::BinOp>::OpConversionPattern; 312*700637cbSDimitry Andric 313*700637cbSDimitry Andric mlir::LogicalResult 314*700637cbSDimitry Andric matchAndRewrite(cir::BinOp op, OpAdaptor, 315*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 316*700637cbSDimitry Andric }; 317*700637cbSDimitry Andric 318*700637cbSDimitry Andric class CIRToLLVMCmpOpLowering : public mlir::OpConversionPattern<cir::CmpOp> { 319*700637cbSDimitry Andric public: CIRToLLVMCmpOpLowering(const mlir::TypeConverter & typeConverter,mlir::MLIRContext * context)320*700637cbSDimitry Andric CIRToLLVMCmpOpLowering(const mlir::TypeConverter &typeConverter, 321*700637cbSDimitry Andric mlir::MLIRContext *context) 322*700637cbSDimitry Andric : OpConversionPattern(typeConverter, context) { 323*700637cbSDimitry Andric setHasBoundedRewriteRecursion(); 324*700637cbSDimitry Andric } 325*700637cbSDimitry Andric 326*700637cbSDimitry Andric mlir::LogicalResult 327*700637cbSDimitry Andric matchAndRewrite(cir::CmpOp op, OpAdaptor, 328*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 329*700637cbSDimitry Andric }; 330*700637cbSDimitry Andric 331*700637cbSDimitry Andric class CIRToLLVMShiftOpLowering 332*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::ShiftOp> { 333*700637cbSDimitry Andric public: 334*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::ShiftOp>::OpConversionPattern; 335*700637cbSDimitry Andric 336*700637cbSDimitry Andric mlir::LogicalResult 337*700637cbSDimitry Andric matchAndRewrite(cir::ShiftOp op, OpAdaptor, 338*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 339*700637cbSDimitry Andric }; 340*700637cbSDimitry Andric 341*700637cbSDimitry Andric class CIRToLLVMSelectOpLowering 342*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::SelectOp> { 343*700637cbSDimitry Andric public: 344*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::SelectOp>::OpConversionPattern; 345*700637cbSDimitry Andric 346*700637cbSDimitry Andric mlir::LogicalResult 347*700637cbSDimitry Andric matchAndRewrite(cir::SelectOp op, OpAdaptor, 348*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 349*700637cbSDimitry Andric }; 350*700637cbSDimitry Andric 351*700637cbSDimitry Andric class CIRToLLVMBrOpLowering : public mlir::OpConversionPattern<cir::BrOp> { 352*700637cbSDimitry Andric public: 353*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::BrOp>::OpConversionPattern; 354*700637cbSDimitry Andric 355*700637cbSDimitry Andric mlir::LogicalResult 356*700637cbSDimitry Andric matchAndRewrite(cir::BrOp op, OpAdaptor, 357*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 358*700637cbSDimitry Andric }; 359*700637cbSDimitry Andric 360*700637cbSDimitry Andric class CIRToLLVMGetMemberOpLowering 361*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::GetMemberOp> { 362*700637cbSDimitry Andric public: 363*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::GetMemberOp>::OpConversionPattern; 364*700637cbSDimitry Andric 365*700637cbSDimitry Andric mlir::LogicalResult 366*700637cbSDimitry Andric matchAndRewrite(cir::GetMemberOp op, OpAdaptor, 367*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 368*700637cbSDimitry Andric }; 369*700637cbSDimitry Andric 370*700637cbSDimitry Andric class CIRToLLVMTrapOpLowering : public mlir::OpConversionPattern<cir::TrapOp> { 371*700637cbSDimitry Andric public: 372*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::TrapOp>::OpConversionPattern; 373*700637cbSDimitry Andric 374*700637cbSDimitry Andric mlir::LogicalResult 375*700637cbSDimitry Andric matchAndRewrite(cir::TrapOp op, OpAdaptor, 376*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 377*700637cbSDimitry Andric }; 378*700637cbSDimitry Andric 379*700637cbSDimitry Andric class CIRToLLVMPtrStrideOpLowering 380*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::PtrStrideOp> { 381*700637cbSDimitry Andric mlir::DataLayout const &dataLayout; 382*700637cbSDimitry Andric 383*700637cbSDimitry Andric public: CIRToLLVMPtrStrideOpLowering(const mlir::TypeConverter & typeConverter,mlir::MLIRContext * context,mlir::DataLayout const & dataLayout)384*700637cbSDimitry Andric CIRToLLVMPtrStrideOpLowering(const mlir::TypeConverter &typeConverter, 385*700637cbSDimitry Andric mlir::MLIRContext *context, 386*700637cbSDimitry Andric mlir::DataLayout const &dataLayout) 387*700637cbSDimitry Andric : OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {} 388*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::PtrStrideOp>::OpConversionPattern; 389*700637cbSDimitry Andric 390*700637cbSDimitry Andric mlir::LogicalResult 391*700637cbSDimitry Andric matchAndRewrite(cir::PtrStrideOp op, OpAdaptor, 392*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 393*700637cbSDimitry Andric }; 394*700637cbSDimitry Andric 395*700637cbSDimitry Andric class CIRToLLVMBaseClassAddrOpLowering 396*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::BaseClassAddrOp> { 397*700637cbSDimitry Andric public: 398*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::BaseClassAddrOp>::OpConversionPattern; 399*700637cbSDimitry Andric 400*700637cbSDimitry Andric mlir::LogicalResult 401*700637cbSDimitry Andric matchAndRewrite(cir::BaseClassAddrOp op, OpAdaptor, 402*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 403*700637cbSDimitry Andric }; 404*700637cbSDimitry Andric 405*700637cbSDimitry Andric class CIRToLLVMStackSaveOpLowering 406*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::StackSaveOp> { 407*700637cbSDimitry Andric public: 408*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::StackSaveOp>::OpConversionPattern; 409*700637cbSDimitry Andric 410*700637cbSDimitry Andric mlir::LogicalResult 411*700637cbSDimitry Andric matchAndRewrite(cir::StackSaveOp op, OpAdaptor, 412*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 413*700637cbSDimitry Andric }; 414*700637cbSDimitry Andric 415*700637cbSDimitry Andric class CIRToLLVMStackRestoreOpLowering 416*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::StackRestoreOp> { 417*700637cbSDimitry Andric public: 418*700637cbSDimitry Andric using OpConversionPattern<cir::StackRestoreOp>::OpConversionPattern; 419*700637cbSDimitry Andric 420*700637cbSDimitry Andric mlir::LogicalResult 421*700637cbSDimitry Andric matchAndRewrite(cir::StackRestoreOp op, OpAdaptor adaptor, 422*700637cbSDimitry Andric mlir::ConversionPatternRewriter &rewriter) const override; 423*700637cbSDimitry Andric }; 424*700637cbSDimitry Andric 425*700637cbSDimitry Andric class CIRToLLVMVecCreateOpLowering 426*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::VecCreateOp> { 427*700637cbSDimitry Andric public: 428*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::VecCreateOp>::OpConversionPattern; 429*700637cbSDimitry Andric 430*700637cbSDimitry Andric mlir::LogicalResult 431*700637cbSDimitry Andric matchAndRewrite(cir::VecCreateOp op, OpAdaptor, 432*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 433*700637cbSDimitry Andric }; 434*700637cbSDimitry Andric 435*700637cbSDimitry Andric class CIRToLLVMVecExtractOpLowering 436*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::VecExtractOp> { 437*700637cbSDimitry Andric public: 438*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::VecExtractOp>::OpConversionPattern; 439*700637cbSDimitry Andric 440*700637cbSDimitry Andric mlir::LogicalResult 441*700637cbSDimitry Andric matchAndRewrite(cir::VecExtractOp op, OpAdaptor, 442*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 443*700637cbSDimitry Andric }; 444*700637cbSDimitry Andric 445*700637cbSDimitry Andric class CIRToLLVMVecInsertOpLowering 446*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::VecInsertOp> { 447*700637cbSDimitry Andric public: 448*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::VecInsertOp>::OpConversionPattern; 449*700637cbSDimitry Andric 450*700637cbSDimitry Andric mlir::LogicalResult 451*700637cbSDimitry Andric matchAndRewrite(cir::VecInsertOp op, OpAdaptor, 452*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 453*700637cbSDimitry Andric }; 454*700637cbSDimitry Andric 455*700637cbSDimitry Andric class CIRToLLVMVecCmpOpLowering 456*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::VecCmpOp> { 457*700637cbSDimitry Andric public: 458*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::VecCmpOp>::OpConversionPattern; 459*700637cbSDimitry Andric 460*700637cbSDimitry Andric mlir::LogicalResult 461*700637cbSDimitry Andric matchAndRewrite(cir::VecCmpOp op, OpAdaptor, 462*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 463*700637cbSDimitry Andric }; 464*700637cbSDimitry Andric 465*700637cbSDimitry Andric class CIRToLLVMVecSplatOpLowering 466*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::VecSplatOp> { 467*700637cbSDimitry Andric public: 468*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::VecSplatOp>::OpConversionPattern; 469*700637cbSDimitry Andric 470*700637cbSDimitry Andric mlir::LogicalResult 471*700637cbSDimitry Andric matchAndRewrite(cir::VecSplatOp op, OpAdaptor, 472*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 473*700637cbSDimitry Andric }; 474*700637cbSDimitry Andric 475*700637cbSDimitry Andric class CIRToLLVMVecShuffleOpLowering 476*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::VecShuffleOp> { 477*700637cbSDimitry Andric public: 478*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::VecShuffleOp>::OpConversionPattern; 479*700637cbSDimitry Andric 480*700637cbSDimitry Andric mlir::LogicalResult 481*700637cbSDimitry Andric matchAndRewrite(cir::VecShuffleOp op, OpAdaptor, 482*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 483*700637cbSDimitry Andric }; 484*700637cbSDimitry Andric 485*700637cbSDimitry Andric class CIRToLLVMVecShuffleDynamicOpLowering 486*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::VecShuffleDynamicOp> { 487*700637cbSDimitry Andric public: 488*700637cbSDimitry Andric using mlir::OpConversionPattern< 489*700637cbSDimitry Andric cir::VecShuffleDynamicOp>::OpConversionPattern; 490*700637cbSDimitry Andric 491*700637cbSDimitry Andric mlir::LogicalResult 492*700637cbSDimitry Andric matchAndRewrite(cir::VecShuffleDynamicOp op, OpAdaptor, 493*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 494*700637cbSDimitry Andric }; 495*700637cbSDimitry Andric 496*700637cbSDimitry Andric class CIRToLLVMVecTernaryOpLowering 497*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::VecTernaryOp> { 498*700637cbSDimitry Andric public: 499*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::VecTernaryOp>::OpConversionPattern; 500*700637cbSDimitry Andric 501*700637cbSDimitry Andric mlir::LogicalResult 502*700637cbSDimitry Andric matchAndRewrite(cir::VecTernaryOp op, OpAdaptor, 503*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 504*700637cbSDimitry Andric }; 505*700637cbSDimitry Andric 506*700637cbSDimitry Andric class CIRToLLVMComplexCreateOpLowering 507*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::ComplexCreateOp> { 508*700637cbSDimitry Andric public: 509*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::ComplexCreateOp>::OpConversionPattern; 510*700637cbSDimitry Andric 511*700637cbSDimitry Andric mlir::LogicalResult 512*700637cbSDimitry Andric matchAndRewrite(cir::ComplexCreateOp op, OpAdaptor, 513*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 514*700637cbSDimitry Andric }; 515*700637cbSDimitry Andric 516*700637cbSDimitry Andric class CIRToLLVMComplexRealOpLowering 517*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::ComplexRealOp> { 518*700637cbSDimitry Andric public: 519*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::ComplexRealOp>::OpConversionPattern; 520*700637cbSDimitry Andric 521*700637cbSDimitry Andric mlir::LogicalResult 522*700637cbSDimitry Andric matchAndRewrite(cir::ComplexRealOp op, OpAdaptor, 523*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 524*700637cbSDimitry Andric }; 525*700637cbSDimitry Andric 526*700637cbSDimitry Andric class CIRToLLVMComplexImagOpLowering 527*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::ComplexImagOp> { 528*700637cbSDimitry Andric public: 529*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::ComplexImagOp>::OpConversionPattern; 530*700637cbSDimitry Andric 531*700637cbSDimitry Andric mlir::LogicalResult 532*700637cbSDimitry Andric matchAndRewrite(cir::ComplexImagOp op, OpAdaptor, 533*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 534*700637cbSDimitry Andric }; 535*700637cbSDimitry Andric 536*700637cbSDimitry Andric class CIRToLLVMComplexImagPtrOpLowering 537*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::ComplexImagPtrOp> { 538*700637cbSDimitry Andric public: 539*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::ComplexImagPtrOp>::OpConversionPattern; 540*700637cbSDimitry Andric 541*700637cbSDimitry Andric mlir::LogicalResult 542*700637cbSDimitry Andric matchAndRewrite(cir::ComplexImagPtrOp op, OpAdaptor, 543*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 544*700637cbSDimitry Andric }; 545*700637cbSDimitry Andric 546*700637cbSDimitry Andric class CIRToLLVMComplexRealPtrOpLowering 547*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::ComplexRealPtrOp> { 548*700637cbSDimitry Andric public: 549*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::ComplexRealPtrOp>::OpConversionPattern; 550*700637cbSDimitry Andric 551*700637cbSDimitry Andric mlir::LogicalResult 552*700637cbSDimitry Andric matchAndRewrite(cir::ComplexRealPtrOp op, OpAdaptor, 553*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 554*700637cbSDimitry Andric }; 555*700637cbSDimitry Andric 556*700637cbSDimitry Andric class CIRToLLVMComplexAddOpLowering 557*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::ComplexAddOp> { 558*700637cbSDimitry Andric public: 559*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::ComplexAddOp>::OpConversionPattern; 560*700637cbSDimitry Andric 561*700637cbSDimitry Andric mlir::LogicalResult 562*700637cbSDimitry Andric matchAndRewrite(cir::ComplexAddOp op, OpAdaptor, 563*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 564*700637cbSDimitry Andric }; 565*700637cbSDimitry Andric 566*700637cbSDimitry Andric class CIRToLLVMComplexSubOpLowering 567*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::ComplexSubOp> { 568*700637cbSDimitry Andric public: 569*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::ComplexSubOp>::OpConversionPattern; 570*700637cbSDimitry Andric 571*700637cbSDimitry Andric mlir::LogicalResult 572*700637cbSDimitry Andric matchAndRewrite(cir::ComplexSubOp op, OpAdaptor, 573*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 574*700637cbSDimitry Andric }; 575*700637cbSDimitry Andric 576*700637cbSDimitry Andric class CIRToLLVMSetBitfieldOpLowering 577*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::SetBitfieldOp> { 578*700637cbSDimitry Andric public: 579*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::SetBitfieldOp>::OpConversionPattern; 580*700637cbSDimitry Andric 581*700637cbSDimitry Andric mlir::LogicalResult 582*700637cbSDimitry Andric matchAndRewrite(cir::SetBitfieldOp op, OpAdaptor, 583*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 584*700637cbSDimitry Andric }; 585*700637cbSDimitry Andric 586*700637cbSDimitry Andric class CIRToLLVMGetBitfieldOpLowering 587*700637cbSDimitry Andric : public mlir::OpConversionPattern<cir::GetBitfieldOp> { 588*700637cbSDimitry Andric public: 589*700637cbSDimitry Andric using mlir::OpConversionPattern<cir::GetBitfieldOp>::OpConversionPattern; 590*700637cbSDimitry Andric 591*700637cbSDimitry Andric mlir::LogicalResult 592*700637cbSDimitry Andric matchAndRewrite(cir::GetBitfieldOp op, OpAdaptor, 593*700637cbSDimitry Andric mlir::ConversionPatternRewriter &) const override; 594*700637cbSDimitry Andric }; 595*700637cbSDimitry Andric 596*700637cbSDimitry Andric } // namespace direct 597*700637cbSDimitry Andric } // namespace cir 598*700637cbSDimitry Andric 599*700637cbSDimitry Andric #endif // CLANG_CIR_LOWERTOLLVM_H 600