Jlm
IntegerOperations.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2025 Nico Reißmann <nico.reissmann@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
7 
8 namespace jlm::llvm
9 {
10 
12 
13 std::unique_ptr<rvsdg::Operation>
15 {
16  return std::make_unique<IntegerConstantOperation>(*this);
17 }
18 
19 std::string
21 {
22  if (Representation().is_known() && Representation().nbits() <= 64)
23  return util::strfmt("I", Representation().nbits(), "(", Representation().to_uint(), ")");
24 
25  return Representation().str();
26 }
27 
28 bool
29 IntegerConstantOperation::operator==(const Operation & other) const noexcept
30 {
31  const auto constant = dynamic_cast<const IntegerConstantOperation *>(&other);
32  return constant && constant->Representation() == Representation();
33 }
34 
36 
37 IntegerAddOperation::~IntegerAddOperation() noexcept = default;
38 
39 bool
40 IntegerAddOperation::operator==(const Operation & other) const noexcept
41 {
42  const auto addOperation = dynamic_cast<const IntegerAddOperation *>(&other);
43  return addOperation && addOperation->Type() == Type();
44 }
45 
46 std::string
48 {
49  return "IAdd";
50 }
51 
52 std::unique_ptr<rvsdg::Operation>
54 {
55  return std::make_unique<IntegerAddOperation>(*this);
56 }
57 
60  const noexcept
61 {
63 }
64 
68  rvsdg::Output *,
69  rvsdg::Output *) const
70 {
71  return nullptr;
72 }
73 
75 IntegerAddOperation::flags() const noexcept
76 {
78 }
79 
81 
82 bool
83 IntegerSubOperation::operator==(const Operation & other) const noexcept
84 {
85  const auto subOperation = dynamic_cast<const IntegerSubOperation *>(&other);
86  return subOperation && subOperation->Type() == Type();
87 }
88 
89 std::string
91 {
92  return "ISub";
93 }
94 
95 std::unique_ptr<rvsdg::Operation>
97 {
98  return std::make_unique<IntegerSubOperation>(*this);
99 }
100 
103  const noexcept
104 {
106 }
107 
111  rvsdg::Output *,
112  rvsdg::Output *) const
113 {
114  return nullptr;
115 }
116 
118 IntegerSubOperation::flags() const noexcept
119 {
120  return flags::none;
121 }
122 
123 IntegerMulOperation::~IntegerMulOperation() noexcept = default;
124 
125 bool
126 IntegerMulOperation::operator==(const Operation & other) const noexcept
127 {
128  const auto mulOperation = dynamic_cast<const IntegerMulOperation *>(&other);
129  return mulOperation && mulOperation->Type() == Type();
130 }
131 
132 std::string
134 {
135  return "IMul";
136 }
137 
138 std::unique_ptr<rvsdg::Operation>
140 {
141  return std::make_unique<IntegerMulOperation>(*this);
142 }
143 
146  const noexcept
147 {
149 }
150 
154  rvsdg::Output *,
155  rvsdg::Output *) const
156 {
157  return nullptr;
158 }
159 
161 IntegerMulOperation::flags() const noexcept
162 {
164 }
165 
167 
168 bool
169 IntegerSDivOperation::operator==(const Operation & other) const noexcept
170 {
171  const auto sdivOperation = dynamic_cast<const IntegerSDivOperation *>(&other);
172  return sdivOperation && sdivOperation->Type() == Type();
173 }
174 
175 std::string
177 {
178  return "ISDiv";
179 }
180 
181 std::unique_ptr<rvsdg::Operation>
183 {
184  return std::make_unique<IntegerSDivOperation>(*this);
185 }
186 
189  const noexcept
190 {
192 }
193 
197  rvsdg::Output *,
198  rvsdg::Output *) const
199 {
200  return nullptr;
201 }
202 
204 IntegerSDivOperation::flags() const noexcept
205 {
206  return flags::none;
207 }
208 
210 
211 bool
212 IntegerUDivOperation::operator==(const Operation & other) const noexcept
213 {
214  const auto udivOperation = dynamic_cast<const IntegerUDivOperation *>(&other);
215  return udivOperation && udivOperation->Type() == Type();
216 }
217 
218 std::string
220 {
221  return "IUDiv";
222 }
223 
224 std::unique_ptr<rvsdg::Operation>
226 {
227  return std::make_unique<IntegerUDivOperation>(*this);
228 }
229 
232  const noexcept
233 {
235 }
236 
240  rvsdg::Output *,
241  rvsdg::Output *) const
242 {
243  return nullptr;
244 }
245 
247 IntegerUDivOperation::flags() const noexcept
248 {
249  return flags::none;
250 }
251 
253 
254 bool
255 IntegerSRemOperation::operator==(const Operation & other) const noexcept
256 {
257  const auto smodOperation = dynamic_cast<const IntegerSRemOperation *>(&other);
258  return smodOperation && smodOperation->Type() == Type();
259 }
260 
261 std::string
263 {
264  return "ISMod";
265 }
266 
267 std::unique_ptr<rvsdg::Operation>
269 {
270  return std::make_unique<IntegerSRemOperation>(*this);
271 }
272 
275  const noexcept
276 {
278 }
279 
283  rvsdg::Output *,
284  rvsdg::Output *) const
285 {
286  return nullptr;
287 }
288 
290 IntegerSRemOperation::flags() const noexcept
291 {
292  return flags::none;
293 }
294 
296 
297 bool
298 IntegerURemOperation::operator==(const Operation & other) const noexcept
299 {
300  const auto umodOperation = dynamic_cast<const IntegerURemOperation *>(&other);
301  return umodOperation && umodOperation->Type() == Type();
302 }
303 
304 std::string
306 {
307  return "IUMod";
308 }
309 
310 std::unique_ptr<rvsdg::Operation>
312 {
313  return std::make_unique<IntegerURemOperation>(*this);
314 }
315 
318  const noexcept
319 {
321 }
322 
326  rvsdg::Output *,
327  rvsdg::Output *) const
328 {
329  return nullptr;
330 }
331 
333 IntegerURemOperation::flags() const noexcept
334 {
335  return flags::none;
336 }
337 
339 
340 bool
341 IntegerAShrOperation::operator==(const Operation & other) const noexcept
342 {
343  const auto ashrOperation = dynamic_cast<const IntegerAShrOperation *>(&other);
344  return ashrOperation && ashrOperation->Type() == Type();
345 }
346 
347 std::string
349 {
350  return "IAShr";
351 }
352 
353 std::unique_ptr<rvsdg::Operation>
355 {
356  return std::make_unique<IntegerAShrOperation>(*this);
357 }
358 
361  const noexcept
362 {
364 }
365 
369  rvsdg::Output *,
370  rvsdg::Output *) const
371 {
372  return nullptr;
373 }
374 
376 IntegerAShrOperation::flags() const noexcept
377 {
378  return flags::none;
379 }
380 
381 IntegerShlOperation::~IntegerShlOperation() noexcept = default;
382 
383 bool
384 IntegerShlOperation::operator==(const Operation & other) const noexcept
385 {
386  const auto shlOperation = dynamic_cast<const IntegerShlOperation *>(&other);
387  return shlOperation && shlOperation->Type() == Type();
388 }
389 
390 std::string
392 {
393  return "IShl";
394 }
395 
396 std::unique_ptr<rvsdg::Operation>
398 {
399  return std::make_unique<IntegerShlOperation>(*this);
400 }
401 
404  const noexcept
405 {
407 }
408 
412  rvsdg::Output *,
413  rvsdg::Output *) const
414 {
415  return nullptr;
416 }
417 
419 IntegerShlOperation::flags() const noexcept
420 {
421  return flags::none;
422 }
423 
425 
426 bool
427 IntegerLShrOperation::operator==(const Operation & other) const noexcept
428 {
429  const auto shrOperation = dynamic_cast<const IntegerLShrOperation *>(&other);
430  return shrOperation && shrOperation->Type() == Type();
431 }
432 
433 std::string
435 {
436  return "IShr";
437 }
438 
439 std::unique_ptr<rvsdg::Operation>
441 {
442  return std::make_unique<IntegerLShrOperation>(*this);
443 }
444 
447  const noexcept
448 {
450 }
451 
455  rvsdg::Output *,
456  rvsdg::Output *) const
457 {
458  return nullptr;
459 }
460 
462 IntegerLShrOperation::flags() const noexcept
463 {
464  return flags::none;
465 }
466 
467 IntegerAndOperation::~IntegerAndOperation() noexcept = default;
468 
469 bool
470 IntegerAndOperation::operator==(const Operation & other) const noexcept
471 {
472  const auto andOperation = dynamic_cast<const IntegerAndOperation *>(&other);
473  return andOperation && andOperation->Type() == Type();
474 }
475 
476 std::string
478 {
479  return "IAnd";
480 }
481 
482 std::unique_ptr<rvsdg::Operation>
484 {
485  return std::make_unique<IntegerAndOperation>(*this);
486 }
487 
490  const noexcept
491 {
493 }
494 
498  rvsdg::Output *,
499  rvsdg::Output *) const
500 {
501  return nullptr;
502 }
503 
505 IntegerAndOperation::flags() const noexcept
506 {
508 }
509 
510 IntegerOrOperation::~IntegerOrOperation() noexcept = default;
511 
512 bool
513 IntegerOrOperation::operator==(const Operation & other) const noexcept
514 {
515  const auto orOperation = dynamic_cast<const IntegerOrOperation *>(&other);
516  return orOperation && orOperation->Type() == Type();
517 }
518 
519 std::string
521 {
522  return "IOr";
523 }
524 
525 std::unique_ptr<rvsdg::Operation>
527 {
528  return std::make_unique<IntegerOrOperation>(*this);
529 }
530 
533  const noexcept
534 {
536 }
537 
541  rvsdg::Output *,
542  rvsdg::Output *) const
543 {
544  return nullptr;
545 }
546 
548 IntegerOrOperation::flags() const noexcept
549 {
551 }
552 
553 IntegerXorOperation::~IntegerXorOperation() noexcept = default;
554 
555 bool
556 IntegerXorOperation::operator==(const Operation & other) const noexcept
557 {
558  const auto xorOperation = dynamic_cast<const IntegerXorOperation *>(&other);
559  return xorOperation && xorOperation->Type() == Type();
560 }
561 
562 std::string
564 {
565  return "IXor";
566 }
567 
568 std::unique_ptr<rvsdg::Operation>
570 {
571  return std::make_unique<IntegerXorOperation>(*this);
572 }
573 
576  const noexcept
577 {
579 }
580 
584  rvsdg::Output *,
585  rvsdg::Output *) const
586 {
587  return nullptr;
588 }
589 
591 IntegerXorOperation::flags() const noexcept
592 {
594 }
595 
596 IntegerEqOperation::~IntegerEqOperation() noexcept = default;
597 
598 bool
599 IntegerEqOperation::operator==(const Operation & other) const noexcept
600 {
601  const auto eqOperation = dynamic_cast<const IntegerEqOperation *>(&other);
602  return eqOperation && eqOperation->result(0) == result(0);
603 }
604 
605 std::string
607 {
608  return "IEq";
609 }
610 
611 std::unique_ptr<rvsdg::Operation>
613 {
614  return std::make_unique<IntegerEqOperation>(*this);
615 }
616 
619  const noexcept
620 {
622 }
623 
627  rvsdg::Output *,
628  rvsdg::Output *) const
629 {
630  return nullptr;
631 }
632 
634 IntegerEqOperation::flags() const noexcept
635 {
636  return flags::commutative;
637 }
638 
639 IntegerNeOperation::~IntegerNeOperation() noexcept = default;
640 
641 bool
642 IntegerNeOperation::operator==(const Operation & other) const noexcept
643 {
644  const auto neOperation = dynamic_cast<const IntegerNeOperation *>(&other);
645  return neOperation && neOperation->result(0) == result(0);
646 }
647 
648 std::string
650 {
651  return "INe";
652 }
653 
654 std::unique_ptr<rvsdg::Operation>
656 {
657  return std::make_unique<IntegerNeOperation>(*this);
658 }
659 
662  const noexcept
663 {
665 }
666 
670  rvsdg::Output *,
671  rvsdg::Output *) const
672 {
673  return nullptr;
674 }
675 
677 IntegerNeOperation::flags() const noexcept
678 {
679  return flags::commutative;
680 }
681 
682 IntegerSgeOperation::~IntegerSgeOperation() noexcept = default;
683 
684 bool
685 IntegerSgeOperation::operator==(const Operation & other) const noexcept
686 {
687  const auto sgeOperation = dynamic_cast<const IntegerSgeOperation *>(&other);
688  return sgeOperation && sgeOperation->result(0) == result(0);
689 }
690 
691 std::string
693 {
694  return "ISge";
695 }
696 
697 std::unique_ptr<rvsdg::Operation>
699 {
700  return std::make_unique<IntegerSgeOperation>(*this);
701 }
702 
705  const noexcept
706 {
708 }
709 
713  rvsdg::Output *,
714  rvsdg::Output *) const
715 {
716  return nullptr;
717 }
718 
720 IntegerSgeOperation::flags() const noexcept
721 {
722  return flags::none;
723 }
724 
725 IntegerSgtOperation::~IntegerSgtOperation() noexcept = default;
726 
727 bool
728 IntegerSgtOperation::operator==(const Operation & other) const noexcept
729 {
730  const auto sgtOperation = dynamic_cast<const IntegerSgtOperation *>(&other);
731  return sgtOperation && sgtOperation->result(0) == result(0);
732 }
733 
734 std::string
736 {
737  return "ISgt";
738 }
739 
740 std::unique_ptr<rvsdg::Operation>
742 {
743  return std::make_unique<IntegerSgtOperation>(*this);
744 }
745 
748  const noexcept
749 {
751 }
752 
756  rvsdg::Output *,
757  rvsdg::Output *) const
758 {
759  return nullptr;
760 }
761 
763 IntegerSgtOperation::flags() const noexcept
764 {
765  return flags::none;
766 }
767 
768 IntegerSleOperation::~IntegerSleOperation() noexcept = default;
769 
770 bool
771 IntegerSleOperation::operator==(const Operation & other) const noexcept
772 {
773  const auto sleOperation = dynamic_cast<const IntegerSleOperation *>(&other);
774  return sleOperation && sleOperation->result(0) == result(0);
775 }
776 
777 std::string
779 {
780  return "ISle";
781 }
782 
783 std::unique_ptr<rvsdg::Operation>
785 {
786  return std::make_unique<IntegerSleOperation>(*this);
787 }
788 
791  const noexcept
792 {
794 }
795 
799  rvsdg::Output *,
800  rvsdg::Output *) const
801 {
802  return nullptr;
803 }
804 
806 IntegerSleOperation::flags() const noexcept
807 {
808  return flags::none;
809 }
810 
811 IntegerSltOperation::~IntegerSltOperation() noexcept = default;
812 
813 bool
814 IntegerSltOperation::operator==(const Operation & other) const noexcept
815 {
816  const auto sltOperation = dynamic_cast<const IntegerSltOperation *>(&other);
817  return sltOperation && sltOperation->result(0) == result(0);
818 }
819 
820 std::string
822 {
823  return "ISlt";
824 }
825 
826 std::unique_ptr<rvsdg::Operation>
828 {
829  return std::make_unique<IntegerSltOperation>(*this);
830 }
831 
834  const noexcept
835 {
837 }
838 
842  rvsdg::Output *,
843  rvsdg::Output *) const
844 {
845  return nullptr;
846 }
847 
849 IntegerSltOperation::flags() const noexcept
850 {
851  return flags::none;
852 }
853 
854 IntegerUgeOperation::~IntegerUgeOperation() noexcept = default;
855 
856 bool
857 IntegerUgeOperation::operator==(const Operation & other) const noexcept
858 {
859  const auto ugeOperation = dynamic_cast<const IntegerUgeOperation *>(&other);
860  return ugeOperation && ugeOperation->result(0) == result(0);
861 }
862 
863 std::string
865 {
866  return "IUge";
867 }
868 
869 std::unique_ptr<rvsdg::Operation>
871 {
872  return std::make_unique<IntegerUgeOperation>(*this);
873 }
874 
877  const noexcept
878 {
880 }
881 
885  rvsdg::Output *,
886  rvsdg::Output *) const
887 {
888  return nullptr;
889 }
890 
892 IntegerUgeOperation::flags() const noexcept
893 {
894  return flags::none;
895 }
896 
897 IntegerUgtOperation::~IntegerUgtOperation() noexcept = default;
898 
899 bool
900 IntegerUgtOperation::operator==(const Operation & other) const noexcept
901 {
902  const auto ugtOperation = dynamic_cast<const IntegerUgtOperation *>(&other);
903  return ugtOperation && ugtOperation->result(0) == result(0);
904 }
905 
906 std::string
908 {
909  return "IUgt";
910 }
911 
912 std::unique_ptr<rvsdg::Operation>
914 {
915  return std::make_unique<IntegerUgtOperation>(*this);
916 }
917 
920  const noexcept
921 {
923 }
924 
928  rvsdg::Output *,
929  rvsdg::Output *) const
930 {
931  return nullptr;
932 }
933 
935 IntegerUgtOperation::flags() const noexcept
936 {
937  return flags::none;
938 }
939 
940 IntegerUleOperation::~IntegerUleOperation() noexcept = default;
941 
942 bool
943 IntegerUleOperation::operator==(const Operation & other) const noexcept
944 {
945  const auto uleOperation = dynamic_cast<const IntegerUleOperation *>(&other);
946  return uleOperation && uleOperation->result(0) == result(0);
947 }
948 
949 std::string
951 {
952  return "IUle";
953 }
954 
955 std::unique_ptr<rvsdg::Operation>
957 {
958  return std::make_unique<IntegerUleOperation>(*this);
959 }
960 
963  const noexcept
964 {
966 }
967 
971  rvsdg::Output *,
972  rvsdg::Output *) const
973 {
974  return nullptr;
975 }
976 
978 IntegerUleOperation::flags() const noexcept
979 {
980  return flags::none;
981 }
982 
983 IntegerUltOperation::~IntegerUltOperation() noexcept = default;
984 
985 bool
986 IntegerUltOperation::operator==(const Operation & other) const noexcept
987 {
988  const auto ultOperation = dynamic_cast<const IntegerUltOperation *>(&other);
989  return ultOperation && ultOperation->result(0) == result(0);
990 }
991 
992 std::string
994 {
995  return "IUlt";
996 }
997 
998 std::unique_ptr<rvsdg::Operation>
1000 {
1001  return std::make_unique<IntegerUltOperation>(*this);
1002 }
1003 
1006  const noexcept
1007 {
1009 }
1010 
1011 rvsdg::Output *
1014  rvsdg::Output *,
1015  rvsdg::Output *) const
1016 {
1017  return nullptr;
1018 }
1019 
1021 IntegerUltOperation::flags() const noexcept
1022 {
1023  return flags::none;
1024 }
1025 
1026 }
std::unique_ptr< Operation > copy() const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
std::string debug_string() const override
enum flags flags() const noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
~IntegerAShrOperation() noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
enum flags flags() const noexcept override
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
std::unique_ptr< Operation > copy() const override
enum flags flags() const noexcept override
std::string debug_string() const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
~IntegerAndOperation() noexcept override
const rvsdg::BitType & Type() const noexcept
~IntegerBinaryOperation() noexcept override
bool operator==(const Operation &other) const noexcept override
std::unique_ptr< Operation > copy() const override
const IntegerValueRepresentation & Representation() const noexcept
std::string debug_string() const override
enum flags flags() const noexcept override
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
~IntegerEqOperation() noexcept override
~IntegerLShrOperation() noexcept override
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
enum flags flags() const noexcept override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
~IntegerMulOperation() noexcept override
std::string debug_string() const override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
std::unique_ptr< Operation > copy() const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
enum flags flags() const noexcept override
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
enum flags flags() const noexcept override
~IntegerNeOperation() noexcept override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
std::unique_ptr< Operation > copy() const override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
~IntegerOrOperation() noexcept override
enum flags flags() const noexcept override
std::string debug_string() const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
std::string debug_string() const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
~IntegerSDivOperation() noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
std::unique_ptr< Operation > copy() const override
enum flags flags() const noexcept override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
std::string debug_string() const override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
~IntegerSRemOperation() noexcept override
std::unique_ptr< Operation > copy() const override
enum flags flags() const noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
enum flags flags() const noexcept override
std::unique_ptr< Operation > copy() const override
std::string debug_string() const override
~IntegerSgeOperation() noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
enum flags flags() const noexcept override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
~IntegerSgtOperation() noexcept override
std::unique_ptr< Operation > copy() const override
~IntegerShlOperation() noexcept override
enum flags flags() const noexcept override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
std::string debug_string() const override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
std::string debug_string() const override
enum flags flags() const noexcept override
~IntegerSleOperation() noexcept override
std::unique_ptr< Operation > copy() const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
std::unique_ptr< Operation > copy() const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
std::string debug_string() const override
enum flags flags() const noexcept override
~IntegerSltOperation() noexcept override
~IntegerSubOperation() noexcept override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
std::string debug_string() const override
enum flags flags() const noexcept override
std::unique_ptr< Operation > copy() const override
std::string debug_string() const override
~IntegerUDivOperation() noexcept override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
enum flags flags() const noexcept override
std::unique_ptr< Operation > copy() const override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
std::unique_ptr< Operation > copy() const override
std::string debug_string() const override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
enum flags flags() const noexcept override
~IntegerURemOperation() noexcept override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
~IntegerUgeOperation() noexcept override
enum flags flags() const noexcept override
enum flags flags() const noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
~IntegerUgtOperation() noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
enum flags flags() const noexcept override
std::string debug_string() const override
~IntegerUleOperation() noexcept override
std::unique_ptr< Operation > copy() const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
std::unique_ptr< Operation > copy() const override
enum flags flags() const noexcept override
std::string debug_string() const override
~IntegerUltOperation() noexcept override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
std::string debug_string() const override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
~IntegerXorOperation() noexcept override
enum flags flags() const noexcept override
std::unique_ptr< Operation > copy() const override
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
const std::shared_ptr< const rvsdg::Type > & result(size_t index) const noexcept
Definition: operation.cpp:36
Global memory state passed between functions.
size_t binop_reduction_path_t
Definition: binary.hpp:19
static const binop_reduction_path_t binop_reduction_none
Definition: binary.hpp:203
static std::string strfmt(Args... args)
Definition: strfmt.hpp:35