18 std::vector<std::shared_ptr<const jlm::rvsdg::BitType>> types;
20 types.push_back(std::dynamic_pointer_cast<const jlm::rvsdg::BitType>(operand->Type()));
22 return CreateOpNode<BitConcatOperation>(
operands, std::move(types)).output(0);
25 std::shared_ptr<const BitType>
27 const std::vector<std::shared_ptr<const BitType>> & types) noexcept
30 for (
const auto & t : types)
43 if (!op || op->narguments() != narguments())
46 for (
size_t n = 0; n < narguments(); n++)
48 if (op->argument(n) != argument(n))
60 auto node1 = TryGetOwnerNode<SimpleNode>(*arg1);
61 auto node2 = TryGetOwnerNode<SimpleNode>(*arg2);
66 auto arg1_constant = is<BitConstantOperation>(node1->GetOperation());
67 auto arg2_constant = is<BitConstantOperation>(node2->GetOperation());
69 if (arg1_constant && arg2_constant)
74 auto arg1_slice =
dynamic_cast<const BitSliceOperation *
>(&node1->GetOperation());
75 auto arg2_slice =
dynamic_cast<const BitSliceOperation *
>(&node2->GetOperation());
77 if (arg1_slice && arg2_slice)
79 auto origin1 = node1->input(0)->origin();
80 auto origin2 = node2->input(0)->origin();
82 if (origin1 == origin2 && arg1_slice->high() == arg2_slice->low())
99 auto & node1 = AssertGetOwnerNode<SimpleNode>(*arg1);
100 auto & node2 = AssertGetOwnerNode<SimpleNode>(*arg2);
108 bits.
Append(arg2_constant.value());
136 std::unique_ptr<Operation>
139 return std::make_unique<BitConcatOperation>(*
this);
142 static std::vector<std::shared_ptr<const BitType>>
145 std::vector<std::shared_ptr<const BitType>> types;
146 for (
const auto arg : args)
148 types.push_back(std::dynamic_pointer_cast<const BitType>(arg->Type()));
153 std::optional<std::vector<rvsdg::Output *>>
164 auto sn = TryGetOwnerNode<SimpleNode>(*arg);
165 return sn && is<BitConcatOperation>(sn->GetOperation());
std::string debug_string() const override
static std::shared_ptr< const BitType > aggregate_arguments(const std::vector< std::shared_ptr< const BitType >> &types) noexcept
enum BinaryOperation::flags flags() const noexcept override
binop_reduction_path_t can_reduce_operand_pair(const jlm::rvsdg::Output *arg1, const jlm::rvsdg::Output *arg2) const noexcept override
std::unique_ptr< Operation > copy() const override
jlm::rvsdg::Output * reduce_operand_pair(binop_reduction_path_t path, jlm::rvsdg::Output *arg1, jlm::rvsdg::Output *arg2) const override
~BitConcatOperation() noexcept override
static Output & create(Region ®ion, BitValueRepresentation value)
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
void Append(const BitValueRepresentation &other)
rvsdg::Region * region() const noexcept
std::vector< jlm::rvsdg::Output * > associative_flatten(std::vector< jlm::rvsdg::Output * > args, const FlattenTester &flatten_tester)
static const binop_reduction_path_t binop_reduction_constants
size_t binop_reduction_path_t
std::optional< std::vector< rvsdg::Output * > > FlattenBitConcatOperation(const BitConcatOperation &, const std::vector< rvsdg::Output * > &operands)
jlm::rvsdg::Output * bitconcat(const std::vector< jlm::rvsdg::Output * > &operands)
static std::vector< std::shared_ptr< const BitType > > GetTypesFromOperands(const std::vector< rvsdg::Output * > &args)
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
static const binop_reduction_path_t binop_reduction_none
jlm::rvsdg::Output * bitslice(jlm::rvsdg::Output *argument, size_t low, size_t high)
Create bitslice.
static const binop_reduction_path_t binop_reduction_merge