clang 22.0.0git
LowerToLLVM.h
Go to the documentation of this file.
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"
19
20namespace cir {
21
22namespace direct {
23
24/// Convert a CIR attribute to an LLVM attribute. May use the datalayout for
25/// lowering attributes to-be-stored in memory.
26mlir::Value lowerCirAttrAsValue(mlir::Operation *parentOp, mlir::Attribute attr,
27 mlir::ConversionPatternRewriter &rewriter,
28 const mlir::TypeConverter *converter);
29
30mlir::LLVM::Linkage convertLinkage(cir::GlobalLinkageKind linkage);
31
32void convertSideEffectForCall(mlir::Operation *callOp, bool isNothrow,
33 cir::SideEffect sideEffect,
34 mlir::LLVM::MemoryEffectsAttr &memoryEffect,
35 bool &noUnwind, bool &willReturn);
36
38 : public mlir::OpConversionPattern<cir::AssumeOp> {
39public:
40 using mlir::OpConversionPattern<cir::AssumeOp>::OpConversionPattern;
41
42 mlir::LogicalResult
43 matchAndRewrite(cir::AssumeOp op, OpAdaptor,
44 mlir::ConversionPatternRewriter &) const override;
45};
46
48 : public mlir::OpConversionPattern<cir::AssumeAlignedOp> {
49public:
50 using mlir::OpConversionPattern<cir::AssumeAlignedOp>::OpConversionPattern;
51
52 mlir::LogicalResult
53 matchAndRewrite(cir::AssumeAlignedOp op, OpAdaptor,
54 mlir::ConversionPatternRewriter &) const override;
55};
56
58 : public mlir::OpConversionPattern<cir::AssumeSepStorageOp> {
59public:
60 using mlir::OpConversionPattern<cir::AssumeSepStorageOp>::OpConversionPattern;
61
62 mlir::LogicalResult
63 matchAndRewrite(cir::AssumeSepStorageOp op, OpAdaptor,
64 mlir::ConversionPatternRewriter &) const override;
65};
66
68 : public mlir::OpConversionPattern<cir::BitClrsbOp> {
69public:
70 using mlir::OpConversionPattern<cir::BitClrsbOp>::OpConversionPattern;
71
72 mlir::LogicalResult
73 matchAndRewrite(cir::BitClrsbOp op, OpAdaptor,
74 mlir::ConversionPatternRewriter &) const override;
75};
76
78 : public mlir::OpConversionPattern<cir::BitClzOp> {
79public:
80 using mlir::OpConversionPattern<cir::BitClzOp>::OpConversionPattern;
81
82 mlir::LogicalResult
83 matchAndRewrite(cir::BitClzOp op, OpAdaptor,
84 mlir::ConversionPatternRewriter &) const override;
85};
86
88 : public mlir::OpConversionPattern<cir::BitCtzOp> {
89public:
90 using mlir::OpConversionPattern<cir::BitCtzOp>::OpConversionPattern;
91
92 mlir::LogicalResult
93 matchAndRewrite(cir::BitCtzOp op, OpAdaptor,
94 mlir::ConversionPatternRewriter &) const override;
95};
96
98 : public mlir::OpConversionPattern<cir::BitFfsOp> {
99public:
100 using mlir::OpConversionPattern<cir::BitFfsOp>::OpConversionPattern;
101
102 mlir::LogicalResult
103 matchAndRewrite(cir::BitFfsOp op, OpAdaptor,
104 mlir::ConversionPatternRewriter &) const override;
105};
106
108 : public mlir::OpConversionPattern<cir::BitParityOp> {
109public:
110 using mlir::OpConversionPattern<cir::BitParityOp>::OpConversionPattern;
111
112 mlir::LogicalResult
113 matchAndRewrite(cir::BitParityOp op, OpAdaptor,
114 mlir::ConversionPatternRewriter &) const override;
115};
116
118 : public mlir::OpConversionPattern<cir::BitPopcountOp> {
119public:
120 using mlir::OpConversionPattern<cir::BitPopcountOp>::OpConversionPattern;
121
122 mlir::LogicalResult
123 matchAndRewrite(cir::BitPopcountOp op, OpAdaptor,
124 mlir::ConversionPatternRewriter &) const override;
125};
126
128 : public mlir::OpConversionPattern<cir::BitReverseOp> {
129public:
130 using mlir::OpConversionPattern<cir::BitReverseOp>::OpConversionPattern;
131
132 mlir::LogicalResult
133 matchAndRewrite(cir::BitReverseOp op, OpAdaptor,
134 mlir::ConversionPatternRewriter &) const override;
135};
136
138 : public mlir::OpConversionPattern<cir::BrCondOp> {
139public:
140 using mlir::OpConversionPattern<cir::BrCondOp>::OpConversionPattern;
141
142 mlir::LogicalResult
143 matchAndRewrite(cir::BrCondOp op, OpAdaptor,
144 mlir::ConversionPatternRewriter &) const override;
145};
146
148 : public mlir::OpConversionPattern<cir::ByteSwapOp> {
149public:
150 using mlir::OpConversionPattern<cir::ByteSwapOp>::OpConversionPattern;
151
152 mlir::LogicalResult
153 matchAndRewrite(cir::ByteSwapOp op, OpAdaptor,
154 mlir::ConversionPatternRewriter &) const override;
155};
156
157class CIRToLLVMCastOpLowering : public mlir::OpConversionPattern<cir::CastOp> {
158 mlir::DataLayout const &dataLayout;
159
160 mlir::Type convertTy(mlir::Type ty) const;
161
162public:
163 CIRToLLVMCastOpLowering(const mlir::TypeConverter &typeConverter,
164 mlir::MLIRContext *context,
165 mlir::DataLayout const &dataLayout)
166 : OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {}
167
168 mlir::LogicalResult
169 matchAndRewrite(cir::CastOp op, OpAdaptor,
170 mlir::ConversionPatternRewriter &) const override;
171};
172
174 : public mlir::OpConversionPattern<cir::ExpectOp> {
175public:
176 using mlir::OpConversionPattern<cir::ExpectOp>::OpConversionPattern;
177
178 mlir::LogicalResult
179 matchAndRewrite(cir::ExpectOp op, OpAdaptor,
180 mlir::ConversionPatternRewriter &) const override;
181};
182
184 : public mlir::OpConversionPattern<cir::ReturnOp> {
185public:
186 using mlir::OpConversionPattern<cir::ReturnOp>::OpConversionPattern;
187
188 mlir::LogicalResult
189 matchAndRewrite(cir::ReturnOp op, OpAdaptor,
190 mlir::ConversionPatternRewriter &) const override;
191};
192
194 : public mlir::OpConversionPattern<cir::RotateOp> {
195public:
196 using mlir::OpConversionPattern<cir::RotateOp>::OpConversionPattern;
197
198 mlir::LogicalResult
199 matchAndRewrite(cir::RotateOp op, OpAdaptor,
200 mlir::ConversionPatternRewriter &) const override;
201};
202
203class CIRToLLVMCallOpLowering : public mlir::OpConversionPattern<cir::CallOp> {
204public:
205 using mlir::OpConversionPattern<cir::CallOp>::OpConversionPattern;
206
207 mlir::LogicalResult
208 matchAndRewrite(cir::CallOp op, OpAdaptor adaptor,
209 mlir::ConversionPatternRewriter &rewriter) const override;
210};
211
213 : public mlir::OpConversionPattern<cir::ReturnAddrOp> {
214public:
215 using mlir::OpConversionPattern<cir::ReturnAddrOp>::OpConversionPattern;
216
217 mlir::LogicalResult
218 matchAndRewrite(cir::ReturnAddrOp op, OpAdaptor,
219 mlir::ConversionPatternRewriter &) const override;
220};
221
223 : public mlir::OpConversionPattern<cir::FrameAddrOp> {
224public:
225 using mlir::OpConversionPattern<cir::FrameAddrOp>::OpConversionPattern;
226
227 mlir::LogicalResult
228 matchAndRewrite(cir::FrameAddrOp op, OpAdaptor,
229 mlir::ConversionPatternRewriter &) const override;
230};
231
233 : public mlir::OpConversionPattern<cir::AllocaOp> {
234 mlir::DataLayout const &dataLayout;
235
236public:
237 CIRToLLVMAllocaOpLowering(mlir::TypeConverter const &typeConverter,
238 mlir::MLIRContext *context,
239 mlir::DataLayout const &dataLayout)
240 : OpConversionPattern<cir::AllocaOp>(typeConverter, context),
241 dataLayout(dataLayout) {}
242
243 using mlir::OpConversionPattern<cir::AllocaOp>::OpConversionPattern;
244
245 mlir::LogicalResult
246 matchAndRewrite(cir::AllocaOp op, OpAdaptor,
247 mlir::ConversionPatternRewriter &) const override;
248};
249
250class CIRToLLVMLoadOpLowering : public mlir::OpConversionPattern<cir::LoadOp> {
251 mlir::DataLayout const &dataLayout;
252
253public:
254 CIRToLLVMLoadOpLowering(const mlir::TypeConverter &typeConverter,
255 mlir::MLIRContext *context,
256 mlir::DataLayout const &dataLayout)
257 : OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {}
258
259 mlir::LogicalResult
260 matchAndRewrite(cir::LoadOp op, OpAdaptor,
261 mlir::ConversionPatternRewriter &) const override;
262};
263
265 : public mlir::OpConversionPattern<cir::StoreOp> {
266 mlir::DataLayout const &dataLayout;
267
268public:
269 CIRToLLVMStoreOpLowering(const mlir::TypeConverter &typeConverter,
270 mlir::MLIRContext *context,
271 mlir::DataLayout const &dataLayout)
272 : OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {}
273
274 mlir::LogicalResult
275 matchAndRewrite(cir::StoreOp op, OpAdaptor,
276 mlir::ConversionPatternRewriter &) const override;
277};
278
280 : public mlir::OpConversionPattern<cir::ConstantOp> {
281public:
282 CIRToLLVMConstantOpLowering(const mlir::TypeConverter &typeConverter,
283 mlir::MLIRContext *context)
284 : OpConversionPattern(typeConverter, context) {
285 setHasBoundedRewriteRecursion();
286 }
287
288 mlir::LogicalResult
289 matchAndRewrite(cir::ConstantOp op, OpAdaptor,
290 mlir::ConversionPatternRewriter &) const override;
291};
292
293class CIRToLLVMFuncOpLowering : public mlir::OpConversionPattern<cir::FuncOp> {
294 static mlir::StringRef getLinkageAttrNameString() { return "linkage"; }
295
296 void lowerFuncAttributes(
297 cir::FuncOp func, bool filterArgAndResAttrs,
298 mlir::SmallVectorImpl<mlir::NamedAttribute> &result) const;
299
300 mlir::LogicalResult
301 matchAndRewriteAlias(cir::FuncOp op, llvm::StringRef aliasee, mlir::Type ty,
302 OpAdaptor adaptor,
303 mlir::ConversionPatternRewriter &rewriter) const;
304
305public:
306 using mlir::OpConversionPattern<cir::FuncOp>::OpConversionPattern;
307
308 mlir::LogicalResult
309 matchAndRewrite(cir::FuncOp op, OpAdaptor,
310 mlir::ConversionPatternRewriter &) const override;
311};
312
314 : public mlir::OpConversionPattern<cir::SwitchFlatOp> {
315public:
316 using mlir::OpConversionPattern<cir::SwitchFlatOp>::OpConversionPattern;
317
318 mlir::LogicalResult
319 matchAndRewrite(cir::SwitchFlatOp op, OpAdaptor,
320 mlir::ConversionPatternRewriter &) const override;
321};
322
324 : public mlir::OpConversionPattern<cir::GetGlobalOp> {
325public:
326 using mlir::OpConversionPattern<cir::GetGlobalOp>::OpConversionPattern;
327
328 mlir::LogicalResult
329 matchAndRewrite(cir::GetGlobalOp op, OpAdaptor,
330 mlir::ConversionPatternRewriter &) const override;
331};
332
334 : public mlir::OpConversionPattern<cir::GlobalOp> {
335 const mlir::DataLayout &dataLayout;
336
337public:
338 CIRToLLVMGlobalOpLowering(const mlir::TypeConverter &typeConverter,
339 mlir::MLIRContext *context,
340 const mlir::DataLayout &dataLayout)
341 : OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {
342 setHasBoundedRewriteRecursion();
343 }
344
345 mlir::LogicalResult
346 matchAndRewrite(cir::GlobalOp op, OpAdaptor adaptor,
347 mlir::ConversionPatternRewriter &rewriter) const override;
348
349private:
350 mlir::LogicalResult matchAndRewriteRegionInitializedGlobal(
351 cir::GlobalOp op, mlir::Attribute init,
352 mlir::ConversionPatternRewriter &rewriter) const;
353
354 void setupRegionInitializedLLVMGlobalOp(
355 cir::GlobalOp op, mlir::ConversionPatternRewriter &rewriter) const;
356
357 mutable mlir::LLVM::ComdatOp comdatOp = nullptr;
358 mlir::SymbolRefAttr getComdatAttr(cir::GlobalOp &op,
359 mlir::OpBuilder &builder) const;
360};
361
363 : public mlir::OpConversionPattern<cir::UnaryOp> {
364public:
365 using mlir::OpConversionPattern<cir::UnaryOp>::OpConversionPattern;
366
367 mlir::LogicalResult
368 matchAndRewrite(cir::UnaryOp op, OpAdaptor,
369 mlir::ConversionPatternRewriter &) const override;
370};
371
372class CIRToLLVMBinOpLowering : public mlir::OpConversionPattern<cir::BinOp> {
373 mlir::LLVM::IntegerOverflowFlags getIntOverflowFlag(cir::BinOp op) const;
374
375public:
376 using mlir::OpConversionPattern<cir::BinOp>::OpConversionPattern;
377
378 mlir::LogicalResult
379 matchAndRewrite(cir::BinOp op, OpAdaptor,
380 mlir::ConversionPatternRewriter &) const override;
381};
382
383class CIRToLLVMCmpOpLowering : public mlir::OpConversionPattern<cir::CmpOp> {
384public:
385 CIRToLLVMCmpOpLowering(const mlir::TypeConverter &typeConverter,
386 mlir::MLIRContext *context)
387 : OpConversionPattern(typeConverter, context) {
388 setHasBoundedRewriteRecursion();
389 }
390
391 mlir::LogicalResult
392 matchAndRewrite(cir::CmpOp op, OpAdaptor,
393 mlir::ConversionPatternRewriter &) const override;
394};
395
397 : public mlir::OpConversionPattern<cir::ShiftOp> {
398public:
399 using mlir::OpConversionPattern<cir::ShiftOp>::OpConversionPattern;
400
401 mlir::LogicalResult
402 matchAndRewrite(cir::ShiftOp op, OpAdaptor,
403 mlir::ConversionPatternRewriter &) const override;
404};
405
407 : public mlir::OpConversionPattern<cir::SelectOp> {
408public:
409 using mlir::OpConversionPattern<cir::SelectOp>::OpConversionPattern;
410
411 mlir::LogicalResult
412 matchAndRewrite(cir::SelectOp op, OpAdaptor,
413 mlir::ConversionPatternRewriter &) const override;
414};
415
416class CIRToLLVMBrOpLowering : public mlir::OpConversionPattern<cir::BrOp> {
417public:
418 using mlir::OpConversionPattern<cir::BrOp>::OpConversionPattern;
419
420 mlir::LogicalResult
421 matchAndRewrite(cir::BrOp op, OpAdaptor,
422 mlir::ConversionPatternRewriter &) const override;
423};
424
426 : public mlir::OpConversionPattern<cir::GetMemberOp> {
427public:
428 using mlir::OpConversionPattern<cir::GetMemberOp>::OpConversionPattern;
429
430 mlir::LogicalResult
431 matchAndRewrite(cir::GetMemberOp op, OpAdaptor,
432 mlir::ConversionPatternRewriter &) const override;
433};
434
436 : public mlir::OpConversionPattern<cir::UnreachableOp> {
437public:
438 using mlir::OpConversionPattern<cir::UnreachableOp>::OpConversionPattern;
439
440 mlir::LogicalResult
441 matchAndRewrite(cir::UnreachableOp op, OpAdaptor,
442 mlir::ConversionPatternRewriter &) const override;
443};
444
445class CIRToLLVMTrapOpLowering : public mlir::OpConversionPattern<cir::TrapOp> {
446public:
447 using mlir::OpConversionPattern<cir::TrapOp>::OpConversionPattern;
448
449 mlir::LogicalResult
450 matchAndRewrite(cir::TrapOp op, OpAdaptor,
451 mlir::ConversionPatternRewriter &) const override;
452};
453
455 : public mlir::OpConversionPattern<cir::PtrStrideOp> {
456 mlir::DataLayout const &dataLayout;
457
458public:
459 CIRToLLVMPtrStrideOpLowering(const mlir::TypeConverter &typeConverter,
460 mlir::MLIRContext *context,
461 mlir::DataLayout const &dataLayout)
462 : OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {}
463 using mlir::OpConversionPattern<cir::PtrStrideOp>::OpConversionPattern;
464
465 mlir::LogicalResult
466 matchAndRewrite(cir::PtrStrideOp op, OpAdaptor,
467 mlir::ConversionPatternRewriter &) const override;
468};
469
471 : public mlir::OpConversionPattern<cir::BaseClassAddrOp> {
472public:
473 using mlir::OpConversionPattern<cir::BaseClassAddrOp>::OpConversionPattern;
474
475 mlir::LogicalResult
476 matchAndRewrite(cir::BaseClassAddrOp op, OpAdaptor,
477 mlir::ConversionPatternRewriter &) const override;
478};
479
481 : public mlir::OpConversionPattern<cir::VTableAddrPointOp> {
482public:
483 using mlir::OpConversionPattern<cir::VTableAddrPointOp>::OpConversionPattern;
484
485 mlir::LogicalResult
486 matchAndRewrite(cir::VTableAddrPointOp op, OpAdaptor,
487 mlir::ConversionPatternRewriter &) const override;
488};
489
491 : public mlir::OpConversionPattern<cir::VTableGetVPtrOp> {
492public:
493 using mlir::OpConversionPattern<cir::VTableGetVPtrOp>::OpConversionPattern;
494
495 mlir::LogicalResult
496 matchAndRewrite(cir::VTableGetVPtrOp op, OpAdaptor,
497 mlir::ConversionPatternRewriter &) const override;
498};
499
501 : public mlir::OpConversionPattern<cir::VTableGetVirtualFnAddrOp> {
502public:
503 using mlir::OpConversionPattern<
504 cir::VTableGetVirtualFnAddrOp>::OpConversionPattern;
505
506 mlir::LogicalResult
507 matchAndRewrite(cir::VTableGetVirtualFnAddrOp op, OpAdaptor,
508 mlir::ConversionPatternRewriter &) const override;
509};
510
512 : public mlir::OpConversionPattern<cir::VTTAddrPointOp> {
513public:
514 using mlir::OpConversionPattern<cir::VTTAddrPointOp>::OpConversionPattern;
515
516 mlir::LogicalResult
517 matchAndRewrite(cir::VTTAddrPointOp op, OpAdaptor,
518 mlir::ConversionPatternRewriter &) const override;
519};
520
522 : public mlir::OpConversionPattern<cir::StackSaveOp> {
523public:
524 using mlir::OpConversionPattern<cir::StackSaveOp>::OpConversionPattern;
525
526 mlir::LogicalResult
527 matchAndRewrite(cir::StackSaveOp op, OpAdaptor,
528 mlir::ConversionPatternRewriter &) const override;
529};
530
532 : public mlir::OpConversionPattern<cir::StackRestoreOp> {
533public:
534 using OpConversionPattern<cir::StackRestoreOp>::OpConversionPattern;
535
536 mlir::LogicalResult
537 matchAndRewrite(cir::StackRestoreOp op, OpAdaptor adaptor,
538 mlir::ConversionPatternRewriter &rewriter) const override;
539};
540
542 : public mlir::OpConversionPattern<cir::VecCreateOp> {
543public:
544 using mlir::OpConversionPattern<cir::VecCreateOp>::OpConversionPattern;
545
546 mlir::LogicalResult
547 matchAndRewrite(cir::VecCreateOp op, OpAdaptor,
548 mlir::ConversionPatternRewriter &) const override;
549};
550
552 : public mlir::OpConversionPattern<cir::VecExtractOp> {
553public:
554 using mlir::OpConversionPattern<cir::VecExtractOp>::OpConversionPattern;
555
556 mlir::LogicalResult
557 matchAndRewrite(cir::VecExtractOp op, OpAdaptor,
558 mlir::ConversionPatternRewriter &) const override;
559};
560
562 : public mlir::OpConversionPattern<cir::VecInsertOp> {
563public:
564 using mlir::OpConversionPattern<cir::VecInsertOp>::OpConversionPattern;
565
566 mlir::LogicalResult
567 matchAndRewrite(cir::VecInsertOp op, OpAdaptor,
568 mlir::ConversionPatternRewriter &) const override;
569};
570
572 : public mlir::OpConversionPattern<cir::VecCmpOp> {
573public:
574 using mlir::OpConversionPattern<cir::VecCmpOp>::OpConversionPattern;
575
576 mlir::LogicalResult
577 matchAndRewrite(cir::VecCmpOp op, OpAdaptor,
578 mlir::ConversionPatternRewriter &) const override;
579};
580
582 : public mlir::OpConversionPattern<cir::VecSplatOp> {
583public:
584 using mlir::OpConversionPattern<cir::VecSplatOp>::OpConversionPattern;
585
586 mlir::LogicalResult
587 matchAndRewrite(cir::VecSplatOp op, OpAdaptor,
588 mlir::ConversionPatternRewriter &) const override;
589};
590
592 : public mlir::OpConversionPattern<cir::VecShuffleOp> {
593public:
594 using mlir::OpConversionPattern<cir::VecShuffleOp>::OpConversionPattern;
595
596 mlir::LogicalResult
597 matchAndRewrite(cir::VecShuffleOp op, OpAdaptor,
598 mlir::ConversionPatternRewriter &) const override;
599};
600
602 : public mlir::OpConversionPattern<cir::VecShuffleDynamicOp> {
603public:
604 using mlir::OpConversionPattern<
605 cir::VecShuffleDynamicOp>::OpConversionPattern;
606
607 mlir::LogicalResult
608 matchAndRewrite(cir::VecShuffleDynamicOp op, OpAdaptor,
609 mlir::ConversionPatternRewriter &) const override;
610};
611
613 : public mlir::OpConversionPattern<cir::VecTernaryOp> {
614public:
615 using mlir::OpConversionPattern<cir::VecTernaryOp>::OpConversionPattern;
616
617 mlir::LogicalResult
618 matchAndRewrite(cir::VecTernaryOp op, OpAdaptor,
619 mlir::ConversionPatternRewriter &) const override;
620};
621
623 : public mlir::OpConversionPattern<cir::ComplexCreateOp> {
624public:
625 using mlir::OpConversionPattern<cir::ComplexCreateOp>::OpConversionPattern;
626
627 mlir::LogicalResult
628 matchAndRewrite(cir::ComplexCreateOp op, OpAdaptor,
629 mlir::ConversionPatternRewriter &) const override;
630};
631
633 : public mlir::OpConversionPattern<cir::ComplexRealOp> {
634public:
635 using mlir::OpConversionPattern<cir::ComplexRealOp>::OpConversionPattern;
636
637 mlir::LogicalResult
638 matchAndRewrite(cir::ComplexRealOp op, OpAdaptor,
639 mlir::ConversionPatternRewriter &) const override;
640};
641
643 : public mlir::OpConversionPattern<cir::ComplexImagOp> {
644public:
645 using mlir::OpConversionPattern<cir::ComplexImagOp>::OpConversionPattern;
646
647 mlir::LogicalResult
648 matchAndRewrite(cir::ComplexImagOp op, OpAdaptor,
649 mlir::ConversionPatternRewriter &) const override;
650};
651
653 : public mlir::OpConversionPattern<cir::ComplexImagPtrOp> {
654public:
655 using mlir::OpConversionPattern<cir::ComplexImagPtrOp>::OpConversionPattern;
656
657 mlir::LogicalResult
658 matchAndRewrite(cir::ComplexImagPtrOp op, OpAdaptor,
659 mlir::ConversionPatternRewriter &) const override;
660};
661
663 : public mlir::OpConversionPattern<cir::ComplexRealPtrOp> {
664public:
665 using mlir::OpConversionPattern<cir::ComplexRealPtrOp>::OpConversionPattern;
666
667 mlir::LogicalResult
668 matchAndRewrite(cir::ComplexRealPtrOp op, OpAdaptor,
669 mlir::ConversionPatternRewriter &) const override;
670};
671
673 : public mlir::OpConversionPattern<cir::ComplexAddOp> {
674public:
675 using mlir::OpConversionPattern<cir::ComplexAddOp>::OpConversionPattern;
676
677 mlir::LogicalResult
678 matchAndRewrite(cir::ComplexAddOp op, OpAdaptor,
679 mlir::ConversionPatternRewriter &) const override;
680};
681
683 : public mlir::OpConversionPattern<cir::ComplexSubOp> {
684public:
685 using mlir::OpConversionPattern<cir::ComplexSubOp>::OpConversionPattern;
686
687 mlir::LogicalResult
688 matchAndRewrite(cir::ComplexSubOp op, OpAdaptor,
689 mlir::ConversionPatternRewriter &) const override;
690};
691
693 : public mlir::OpConversionPattern<cir::SetBitfieldOp> {
694public:
695 using mlir::OpConversionPattern<cir::SetBitfieldOp>::OpConversionPattern;
696
697 mlir::LogicalResult
698 matchAndRewrite(cir::SetBitfieldOp op, OpAdaptor,
699 mlir::ConversionPatternRewriter &) const override;
700};
701
703 : public mlir::OpConversionPattern<cir::GetBitfieldOp> {
704public:
705 using mlir::OpConversionPattern<cir::GetBitfieldOp>::OpConversionPattern;
706
707 mlir::LogicalResult
708 matchAndRewrite(cir::GetBitfieldOp op, OpAdaptor,
709 mlir::ConversionPatternRewriter &) const override;
710};
711
712class CIRToLLVMFAbsOpLowering : public mlir::OpConversionPattern<cir::FAbsOp> {
713public:
714 using mlir::OpConversionPattern<cir::FAbsOp>::OpConversionPattern;
715
716 mlir::LogicalResult
717 matchAndRewrite(cir::FAbsOp op, OpAdaptor,
718 mlir::ConversionPatternRewriter &) const override;
719};
720
722 : public mlir::OpConversionPattern<cir::InlineAsmOp> {
723 mlir::DataLayout const &dataLayout;
724
725public:
726 CIRToLLVMInlineAsmOpLowering(const mlir::TypeConverter &typeConverter,
727 mlir::MLIRContext *context,
728 mlir::DataLayout const &dataLayout)
729 : OpConversionPattern(typeConverter, context), dataLayout(dataLayout) {}
730
731 using mlir::OpConversionPattern<cir::InlineAsmOp>::OpConversionPattern;
732
733 mlir::LogicalResult
734 matchAndRewrite(cir::InlineAsmOp op, OpAdaptor,
735 mlir::ConversionPatternRewriter &) const override;
736};
737
739 : public mlir::OpConversionPattern<cir::ThrowOp> {
740public:
741 using mlir::OpConversionPattern<cir::ThrowOp>::OpConversionPattern;
742
743 mlir::LogicalResult
744 matchAndRewrite(cir::ThrowOp op, OpAdaptor,
745 mlir::ConversionPatternRewriter &) const override;
746};
747
749 : public mlir::OpConversionPattern<cir::VAStartOp> {
750public:
751 using mlir::OpConversionPattern<cir::VAStartOp>::OpConversionPattern;
752
753 mlir::LogicalResult
754 matchAndRewrite(cir::VAStartOp op, OpAdaptor,
755 mlir::ConversionPatternRewriter &) const override;
756};
757
759 : public mlir::OpConversionPattern<cir::VAEndOp> {
760public:
761 using mlir::OpConversionPattern<cir::VAEndOp>::OpConversionPattern;
762
763 mlir::LogicalResult
764 matchAndRewrite(cir::VAEndOp op, OpAdaptor,
765 mlir::ConversionPatternRewriter &) const override;
766};
767
769 : public mlir::OpConversionPattern<cir::VAArgOp> {
770public:
771 using mlir::OpConversionPattern<cir::VAArgOp>::OpConversionPattern;
772
773 mlir::LogicalResult
774 matchAndRewrite(cir::VAArgOp op, OpAdaptor,
775 mlir::ConversionPatternRewriter &) const override;
776};
777
778} // namespace direct
779} // namespace cir
780
781#endif // CLANG_CIR_LOWERTOLLVM_H
CIRToLLVMAllocaOpLowering(mlir::TypeConverter const &typeConverter, mlir::MLIRContext *context, mlir::DataLayout const &dataLayout)
Definition: LowerToLLVM.h:237
mlir::LogicalResult matchAndRewrite(cir::AllocaOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::AssumeAlignedOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::AssumeOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::AssumeSepStorageOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::BaseClassAddrOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::BinOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::BitClrsbOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::BitClzOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::BitCtzOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::BitFfsOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::BitParityOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::BitPopcountOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::BitReverseOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::BrCondOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::BrOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ByteSwapOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::CallOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const override
CIRToLLVMCastOpLowering(const mlir::TypeConverter &typeConverter, mlir::MLIRContext *context, mlir::DataLayout const &dataLayout)
Definition: LowerToLLVM.h:163
mlir::LogicalResult matchAndRewrite(cir::CastOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
CIRToLLVMCmpOpLowering(const mlir::TypeConverter &typeConverter, mlir::MLIRContext *context)
Definition: LowerToLLVM.h:385
mlir::LogicalResult matchAndRewrite(cir::CmpOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ComplexAddOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ComplexCreateOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ComplexImagOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ComplexImagPtrOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ComplexRealOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ComplexRealPtrOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ComplexSubOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ConstantOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
CIRToLLVMConstantOpLowering(const mlir::TypeConverter &typeConverter, mlir::MLIRContext *context)
Definition: LowerToLLVM.h:282
mlir::LogicalResult matchAndRewrite(cir::ExpectOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::FAbsOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::FrameAddrOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::FuncOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::GetBitfieldOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::GetGlobalOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::GetMemberOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::GlobalOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const override
CIRToLLVMGlobalOpLowering(const mlir::TypeConverter &typeConverter, mlir::MLIRContext *context, const mlir::DataLayout &dataLayout)
Definition: LowerToLLVM.h:338
CIRToLLVMInlineAsmOpLowering(const mlir::TypeConverter &typeConverter, mlir::MLIRContext *context, mlir::DataLayout const &dataLayout)
Definition: LowerToLLVM.h:726
mlir::LogicalResult matchAndRewrite(cir::InlineAsmOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
CIRToLLVMLoadOpLowering(const mlir::TypeConverter &typeConverter, mlir::MLIRContext *context, mlir::DataLayout const &dataLayout)
Definition: LowerToLLVM.h:254
mlir::LogicalResult matchAndRewrite(cir::LoadOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
CIRToLLVMPtrStrideOpLowering(const mlir::TypeConverter &typeConverter, mlir::MLIRContext *context, mlir::DataLayout const &dataLayout)
Definition: LowerToLLVM.h:459
mlir::LogicalResult matchAndRewrite(cir::PtrStrideOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ReturnAddrOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ReturnOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::RotateOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::SelectOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::SetBitfieldOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ShiftOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::StackRestoreOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const override
mlir::LogicalResult matchAndRewrite(cir::StackSaveOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
CIRToLLVMStoreOpLowering(const mlir::TypeConverter &typeConverter, mlir::MLIRContext *context, mlir::DataLayout const &dataLayout)
Definition: LowerToLLVM.h:269
mlir::LogicalResult matchAndRewrite(cir::StoreOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::SwitchFlatOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::ThrowOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::TrapOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::UnaryOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::UnreachableOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VAArgOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VAEndOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VAStartOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VTTAddrPointOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VTableAddrPointOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VTableGetVPtrOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VTableGetVirtualFnAddrOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VecCmpOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VecCreateOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VecExtractOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VecInsertOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VecShuffleDynamicOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VecShuffleOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VecSplatOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
mlir::LogicalResult matchAndRewrite(cir::VecTernaryOp op, OpAdaptor, mlir::ConversionPatternRewriter &) const override
void convertSideEffectForCall(mlir::Operation *callOp, bool isNothrow, cir::SideEffect sideEffect, mlir::LLVM::MemoryEffectsAttr &memoryEffect, bool &noUnwind, bool &willReturn)
mlir::Value lowerCirAttrAsValue(mlir::Operation *parentOp, const mlir::Attribute attr, mlir::ConversionPatternRewriter &rewriter, const mlir::TypeConverter *converter)
Switches on the type of attribute and calls the appropriate conversion.
mlir::LLVM::Linkage convertLinkage(cir::GlobalLinkageKind linkage)
Definition: ABIArgInfo.h:22