6#ifndef JLM_LLVM_IR_OPERATORS_INTEGEROPERATIONS_HPP
7#define JLM_LLVM_IR_OPERATORS_INTEGEROPERATIONS_HPP
34 std::unique_ptr<Operation>
35 copy()
const override;
41 operator==(
const Operation & other)
const noexcept override;
58 return Create(region, { numBits, value });
74 const std::
size_t numArgumentBits,
75 const std::
size_t numResultBits) noexcept
84 return *util::assertedCast<const rvsdg::BitType>(
argument(0).get());
103 operator==(
const Operation & other)
const noexcept override;
108 [[nodiscard]] std::unique_ptr<Operation>
109 copy()
const override;
113 const noexcept override;
120 flags() const noexcept override;
123 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
138 static std::optional<std::vector<rvsdg::Output *>>
141 const std::vector<rvsdg::Output *> & operands);
159 operator==(
const Operation & other)
const noexcept override;
164 [[nodiscard]] std::unique_ptr<Operation>
165 copy()
const override;
169 const noexcept override;
176 flags() const noexcept override;
179 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
196 static std::optional<std::vector<rvsdg::Output *>>
199 const std::vector<rvsdg::Output *> & operands);
211 static std::optional<std::vector<rvsdg::Output *>>
214 const std::vector<rvsdg::Output *> & operands);
232 operator==(
const Operation & other)
const noexcept override;
237 [[nodiscard]] std::unique_ptr<Operation>
238 copy()
const override;
242 const noexcept override;
249 flags() const noexcept override;
252 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
267 static std::optional<std::vector<rvsdg::Output *>>
270 const std::vector<rvsdg::Output *> & operands);
288 operator==(
const Operation & other)
const noexcept override;
293 [[nodiscard]] std::unique_ptr<Operation>
294 copy()
const override;
298 const noexcept override;
305 flags() const noexcept override;
308 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
323 static std::optional<std::vector<rvsdg::Output *>>
326 const std::vector<rvsdg::Output *> & operands);
344 operator==(
const Operation & other)
const noexcept override;
349 [[nodiscard]] std::unique_ptr<Operation>
350 copy()
const override;
354 const noexcept override;
361 flags() const noexcept override;
364 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
379 static std::optional<std::vector<rvsdg::Output *>>
382 const std::vector<rvsdg::Output *> & operands);
400 operator==(
const Operation & other)
const noexcept override;
405 [[nodiscard]] std::unique_ptr<Operation>
406 copy()
const override;
410 const noexcept override;
417 flags() const noexcept override;
420 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
435 static std::optional<std::vector<rvsdg::Output *>>
438 const std::vector<rvsdg::Output *> & operands);
456 operator==(
const Operation & other)
const noexcept override;
461 [[nodiscard]] std::unique_ptr<Operation>
462 copy()
const override;
466 const noexcept override;
473 flags() const noexcept override;
476 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
491 static std::optional<std::vector<rvsdg::Output *>>
494 const std::vector<rvsdg::Output *> & operands);
512 operator==(
const Operation & other)
const noexcept override;
517 [[nodiscard]] std::unique_ptr<Operation>
518 copy()
const override;
522 const noexcept override;
529 flags() const noexcept override;
532 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
547 static std::optional<std::vector<rvsdg::Output *>>
550 const std::vector<rvsdg::Output *> & operands);
568 operator==(
const Operation & other)
const noexcept override;
573 [[nodiscard]] std::unique_ptr<Operation>
574 copy()
const override;
578 const noexcept override;
585 flags() const noexcept override;
588 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
603 static std::optional<std::vector<rvsdg::Output *>>
606 const std::vector<rvsdg::Output *> & operands);
624 operator==(
const Operation & other)
const noexcept override;
629 [[nodiscard]] std::unique_ptr<Operation>
630 copy()
const override;
634 const noexcept override;
641 flags() const noexcept override;
644 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
659 static std::optional<std::vector<rvsdg::Output *>>
662 const std::vector<rvsdg::Output *> & operands);
680 operator==(
const Operation & other)
const noexcept override;
685 [[nodiscard]] std::unique_ptr<Operation>
686 copy()
const override;
690 const noexcept override;
697 flags() const noexcept override;
700 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
715 static std::optional<std::vector<rvsdg::Output *>>
718 const std::vector<rvsdg::Output *> & operands);
736 operator==(
const Operation & other)
const noexcept override;
741 [[nodiscard]] std::unique_ptr<Operation>
742 copy()
const override;
746 const noexcept override;
753 flags() const noexcept override;
756 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
771 static std::optional<std::vector<rvsdg::Output *>>
774 const std::vector<rvsdg::Output *> & operands);
789 static std::optional<std::vector<rvsdg::Output *>>
792 const std::vector<rvsdg::Output *> & operands);
810 operator==(
const Operation & other)
const noexcept override;
815 [[nodiscard]] std::unique_ptr<Operation>
816 copy()
const override;
820 const noexcept override;
827 flags() const noexcept override;
830 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
845 static std::optional<std::vector<rvsdg::Output *>>
848 const std::vector<rvsdg::Output *> & operands);
866 operator==(
const Operation & other)
const noexcept override;
871 [[nodiscard]] std::unique_ptr<Operation>
872 copy()
const override;
876 const noexcept override;
883 flags() const noexcept override;
886 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
901 static std::optional<std::vector<rvsdg::Output *>>
904 const std::vector<rvsdg::Output *> & operands);
918 static std::optional<std::vector<rvsdg::Output *>>
921 const std::vector<rvsdg::Output *> & operands);
939 operator==(
const Operation & other)
const noexcept override;
944 [[nodiscard]] std::unique_ptr<Operation>
945 copy()
const override;
949 const noexcept override;
956 flags() const noexcept override;
959 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
974 static std::optional<std::vector<rvsdg::Output *>>
977 const std::vector<rvsdg::Output *> & operands);
991 static std::optional<std::vector<rvsdg::Output *>>
994 const std::vector<rvsdg::Output *> & operands);
1012 operator==(
const Operation & other)
const noexcept override;
1017 [[nodiscard]] std::unique_ptr<Operation>
1018 copy()
const override;
1022 const noexcept override;
1029 flags() const noexcept override;
1031 static rvsdg::Node &
1032 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
1047 static std::optional<std::vector<rvsdg::Output *>>
1050 const std::vector<rvsdg::Output *> & operands);
1064 static std::optional<std::vector<rvsdg::Output *>>
1067 const std::vector<rvsdg::Output *> & operands);
1085 operator==(
const Operation & other)
const noexcept override;
1090 [[nodiscard]] std::unique_ptr<Operation>
1091 copy()
const override;
1095 const noexcept override;
1102 flags() const noexcept override;
1104 static rvsdg::Node &
1105 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
1120 static std::optional<std::vector<rvsdg::Output *>>
1123 const std::vector<rvsdg::Output *> & operands);
1137 static std::optional<std::vector<rvsdg::Output *>>
1140 const std::vector<rvsdg::Output *> & operands);
1158 operator==(
const Operation & other)
const noexcept override;
1163 [[nodiscard]] std::unique_ptr<Operation>
1164 copy()
const override;
1168 const noexcept override;
1175 flags() const noexcept override;
1177 static rvsdg::Node &
1178 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
1193 static std::optional<std::vector<rvsdg::Output *>>
1196 const std::vector<rvsdg::Output *> & operands);
1210 static std::optional<std::vector<rvsdg::Output *>>
1213 const std::vector<rvsdg::Output *> & operands);
1231 operator==(
const Operation & other)
const noexcept override;
1236 [[nodiscard]] std::unique_ptr<Operation>
1237 copy()
const override;
1241 const noexcept override;
1248 flags() const noexcept override;
1250 static rvsdg::Node &
1251 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
1266 static std::optional<std::vector<rvsdg::Output *>>
1269 const std::vector<rvsdg::Output *> & operands);
1283 static std::optional<std::vector<rvsdg::Output *>>
1286 const std::vector<rvsdg::Output *> & operands);
1304 operator==(
const Operation & other)
const noexcept override;
1309 [[nodiscard]] std::unique_ptr<Operation>
1310 copy()
const override;
1314 const noexcept override;
1321 flags() const noexcept override;
1323 static rvsdg::Node &
1324 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
1339 static std::optional<std::vector<rvsdg::Output *>>
1342 const std::vector<rvsdg::Output *> & operands);
1356 static std::optional<std::vector<rvsdg::Output *>>
1359 const std::vector<rvsdg::Output *> & operands);
1377 operator==(
const Operation & other)
const noexcept override;
1382 [[nodiscard]] std::unique_ptr<Operation>
1383 copy()
const override;
1387 const noexcept override;
1394 flags() const noexcept override;
1396 static rvsdg::Node &
1397 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
1412 static std::optional<std::vector<rvsdg::Output *>>
1415 const std::vector<rvsdg::Output *> & operands);
1429 static std::optional<std::vector<rvsdg::Output *>>
1432 const std::vector<rvsdg::Output *> & operands);
1450 operator==(
const Operation & other)
const noexcept override;
1455 [[nodiscard]] std::unique_ptr<Operation>
1456 copy()
const override;
1460 const noexcept override;
1467 flags() const noexcept override;
1469 static rvsdg::Node &
1470 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
1485 static std::optional<std::vector<rvsdg::Output *>>
1488 const std::vector<rvsdg::Output *> & operands);
1502 static std::optional<std::vector<rvsdg::Output *>>
1505 const std::vector<rvsdg::Output *> & operands);
1523 operator==(
const Operation & other)
const noexcept override;
1528 [[nodiscard]] std::unique_ptr<Operation>
1529 copy()
const override;
1533 const noexcept override;
1540 flags() const noexcept override;
1542 static rvsdg::Node &
1543 createNode(const
size_t numBits, rvsdg::Output & operand1, rvsdg::Output & operand2)
1558 static std::optional<std::vector<rvsdg::Output *>>
1561 const std::vector<rvsdg::Output *> & operands);
1575 static std::optional<std::vector<rvsdg::Output *>>
1578 const std::vector<rvsdg::Output *> & operands);
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
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerAShrOperation &operation, const std::vector< rvsdg::Output * > &operands)
bool operator==(const Operation &other) 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
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
bool operator==(const Operation &other) const 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
~IntegerAddOperation() noexcept override
std::string debug_string() const override
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerAddOperation &operation, const std::vector< rvsdg::Output * > &operands)
std::unique_ptr< Operation > copy() const override
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
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
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerAndOperation &operation, const std::vector< rvsdg::Output * > &operands)
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
bool operator==(const Operation &other) const noexcept override
~IntegerAndOperation() noexcept override
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
~IntegerBinaryOperation() noexcept override
const rvsdg::BitType & Type() const noexcept
static rvsdg::Node & Create(rvsdg::Region ®ion, IntegerValueRepresentation representation)
~IntegerConstantOperation() override
bool operator==(const Operation &other) const noexcept override
IntegerValueRepresentation Representation_
static rvsdg::Node & Create(rvsdg::Region ®ion, std::size_t numBits, std::int64_t value)
IntegerConstantOperation(IntegerValueRepresentation representation)
const IntegerValueRepresentation & Representation() const noexcept
std::unique_ptr< Operation > copy() const override
std::string debug_string() const override
enum flags flags() const noexcept override
std::string debug_string() const override
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerEqOperation &operation, const std::vector< rvsdg::Output * > &operands)
static std::optional< std::vector< rvsdg::Output * > > normalizeIdenticalOperands(const IntegerEqOperation &operation, const std::vector< rvsdg::Output * > &operands)
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
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
~IntegerEqOperation() noexcept override
bool operator==(const Operation &other) const noexcept override
~IntegerLShrOperation() noexcept override
bool operator==(const Operation &other) const noexcept override
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerLShrOperation &operation, const std::vector< rvsdg::Output * > &operands)
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
enum flags flags() const noexcept override
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
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
bool operator==(const Operation &other) const noexcept 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
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerMulOperation &operation, const std::vector< rvsdg::Output * > &operands)
std::unique_ptr< Operation > copy() const override
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
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
bool operator==(const Operation &other) const noexcept override
std::string debug_string() const override
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerNeOperation &operation, const std::vector< rvsdg::Output * > &operands)
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
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
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
static std::optional< std::vector< rvsdg::Output * > > normalizeIdenticalOperands(const IntegerNeOperation &operation, const std::vector< rvsdg::Output * > &operands)
bool operator==(const Operation &other) const noexcept override
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerOrOperation &operation, const std::vector< rvsdg::Output * > &operands)
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
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
enum flags flags() const noexcept override
std::string debug_string() const override
static std::optional< std::vector< rvsdg::Output * > > normalizeIdempotent(const IntegerOrOperation &operation, const std::vector< rvsdg::Output * > &operands)
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerSDivOperation &operation, const std::vector< rvsdg::Output * > &operands)
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
bool operator==(const Operation &other) const noexcept override
enum flags flags() const noexcept override
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerSRemOperation &operation, const std::vector< rvsdg::Output * > &operands)
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
bool operator==(const Operation &other) const noexcept 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
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerSgeOperation &operation, const std::vector< rvsdg::Output * > &operands)
enum flags flags() const noexcept override
bool operator==(const Operation &other) const noexcept override
std::unique_ptr< Operation > copy() const override
std::string debug_string() const override
~IntegerSgeOperation() noexcept override
static std::optional< std::vector< rvsdg::Output * > > normalizeIdenticalOperands(const IntegerSgeOperation &operation, const std::vector< rvsdg::Output * > &operands)
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerSgtOperation &operation, const std::vector< rvsdg::Output * > &operands)
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
bool operator==(const Operation &other) const noexcept override
std::string debug_string() const override
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
std::unique_ptr< Operation > copy() const override
enum flags flags() const noexcept override
static std::optional< std::vector< rvsdg::Output * > > normalizeIdenticalOperands(const IntegerSgtOperation &operation, const std::vector< rvsdg::Output * > &operands)
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
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
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
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerShlOperation &operation, const std::vector< rvsdg::Output * > &operands)
bool operator==(const Operation &other) 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
~IntegerSleOperation() noexcept override
std::unique_ptr< Operation > copy() const override
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static std::optional< std::vector< rvsdg::Output * > > normalizeIdenticalOperands(const IntegerSleOperation &operation, const std::vector< rvsdg::Output * > &operands)
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerSleOperation &operation, const std::vector< rvsdg::Output * > &operands)
rvsdg::binop_reduction_path_t can_reduce_operand_pair(const rvsdg::Output *op1, const rvsdg::Output *op2) const noexcept override
bool operator==(const Operation &other) const noexcept override
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
bool operator==(const Operation &other) const noexcept override
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
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
static std::optional< std::vector< rvsdg::Output * > > normalizeIdenticalOperands(const IntegerSltOperation &operation, const std::vector< rvsdg::Output * > &operands)
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerSltOperation &operation, const std::vector< rvsdg::Output * > &operands)
enum flags flags() const noexcept override
~IntegerSltOperation() noexcept override
~IntegerSubOperation() noexcept override
bool operator==(const Operation &other) 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
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
std::string debug_string() const override
enum flags flags() const noexcept override
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerSubOperation &operation, const std::vector< rvsdg::Output * > &operands)
static std::optional< std::vector< rvsdg::Output * > > normalizeAdditiveInverse(const IntegerSubOperation &operation, const std::vector< rvsdg::Output * > &operands)
std::unique_ptr< Operation > copy() const override
bool operator==(const Operation &other) const noexcept override
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerUDivOperation &operation, const std::vector< rvsdg::Output * > &operands)
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
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
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
bool operator==(const Operation &other) const noexcept override
std::unique_ptr< Operation > copy() const override
std::string debug_string() const override
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
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
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerURemOperation &operation, const std::vector< rvsdg::Output * > &operands)
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerUgeOperation &operation, const std::vector< rvsdg::Output * > &operands)
std::string debug_string() const override
static std::optional< std::vector< rvsdg::Output * > > normalizeIdenticalOperands(const IntegerUgeOperation &operation, const std::vector< rvsdg::Output * > &operands)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
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
bool operator==(const Operation &other) const noexcept override
enum flags flags() const noexcept override
bool operator==(const Operation &other) 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
static std::optional< std::vector< rvsdg::Output * > > normalizeIdenticalOperands(const IntegerUgtOperation &operation, const std::vector< rvsdg::Output * > &operands)
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
~IntegerUgtOperation() noexcept override
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerUgtOperation &operation, const std::vector< rvsdg::Output * > &operands)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
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
bool operator==(const Operation &other) const noexcept override
~IntegerUleOperation() noexcept override
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
static std::optional< std::vector< rvsdg::Output * > > normalizeIdenticalOperands(const IntegerUleOperation &operation, const std::vector< rvsdg::Output * > &operands)
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
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerUleOperation &operation, const std::vector< rvsdg::Output * > &operands)
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
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
rvsdg::Output * reduce_operand_pair(rvsdg::binop_reduction_path_t path, rvsdg::Output *op1, rvsdg::Output *op2) const override
bool operator==(const Operation &other) const noexcept override
static std::optional< std::vector< rvsdg::Output * > > normalizeIdenticalOperands(const IntegerUltOperation &operation, const std::vector< rvsdg::Output * > &operands)
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerUltOperation &operation, const std::vector< rvsdg::Output * > &operands)
static rvsdg::Node & createNode(const size_t numBits, rvsdg::Output &operand1, rvsdg::Output &operand2)
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
bool operator==(const Operation &other) const noexcept override
static std::optional< std::vector< rvsdg::Output * > > foldConstants(const IntegerXorOperation &operation, const std::vector< rvsdg::Output * > &operands)
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
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
Nullary operator (operator taking no formal arguments)
NullaryOperation(std::shared_ptr< const Type > resultType)
Represent acyclic RVSDG subgraphs.
const std::shared_ptr< const rvsdg::Type > & argument(size_t index) const noexcept
Global memory state passed between functions.
size_t binop_reduction_path_t
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.