xref: /freebsd/contrib/llvm-project/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
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