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