20 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
34std::unique_ptr<rvsdg::Operation>
37 return std::make_unique<BitCastOperation>(*
this);
46 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
55std::unique_ptr<rvsdg::Operation>
58 return std::make_unique<SExtOperation>(*
this);
61std::optional<std::vector<rvsdg::Output *>>
64 const std::vector<rvsdg::Output *> & operands)
67 auto & operand = *operands[0];
70 auto [constantNode, constantOperation] =
72 if (!constantOperation)
75 const auto & resultRepresentation =
76 constantOperation->Representation().sext(operation.
ndstbits() - operation.
nsrcbits());
80 return std::vector<rvsdg::Output *>({
result });
89 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
98std::unique_ptr<rvsdg::Operation>
101 return std::make_unique<ZExtOperation>(*
this);
104std::optional<std::vector<rvsdg::Output *>>
107 const std::vector<rvsdg::Output *> & operands)
110 auto & operand = *operands[0];
113 auto [constantNode, constantOperation] =
115 if (!constantOperation)
118 const auto & resultRepresentation =
119 constantOperation->Representation().zext(operation.
ndstbits() - operation.
nsrcbits());
123 return std::vector<rvsdg::Output *>({
result });
132 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
141std::unique_ptr<rvsdg::Operation>
144 return std::make_unique<TruncOperation>(*
this);
147std::optional<std::vector<rvsdg::Output *>>
150 const std::vector<rvsdg::Output *> & operands)
153 auto & operand = *operands[0];
156 auto [constantNode, constantOperation] =
158 if (!constantOperation)
161 const auto & resultRepresentation =
162 constantOperation->Representation().trunc(operation.
ndstbits());
166 return std::vector<rvsdg::Output *>({
result });
175 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
184std::unique_ptr<rvsdg::Operation>
187 return std::make_unique<PtrToIntOperation>(*
this);
196 return op && op->
srcsize() == srcsize() && op->dstsize() == dstsize();
205std::unique_ptr<rvsdg::Operation>
208 return std::make_unique<FPExtOperation>(*
this);
217 return op && op->
srcsize() == srcsize() && op->dstsize() == dstsize();
226std::unique_ptr<rvsdg::Operation>
229 return std::make_unique<FPTruncOperation>(*
this);
238 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
247std::unique_ptr<rvsdg::Operation>
250 return std::make_unique<UIToFPOperation>(*
this);
259 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
268std::unique_ptr<rvsdg::Operation>
271 return std::make_unique<SIToFPOperation>(*
this);
280 return op && op->
argument(0) == argument(0);
289std::unique_ptr<rvsdg::Operation>
292 return std::make_unique<IntToPtrOperation>(*
this);
301 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
310std::unique_ptr<rvsdg::Operation>
313 return std::make_unique<FPToUIOperation>(*
this);
322 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
331std::unique_ptr<rvsdg::Operation>
334 return std::make_unique<FPToSIOperation>(*
this);
343 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
349 return "ControlToInt";
352std::unique_ptr<rvsdg::Operation>
355 return std::make_unique<ControlToIntOperation>(*
this);
362 std::shared_ptr<const rvsdg::FunctionType> fn)
364 FunctionType_(std::move(fn))
372 return *FunctionType() == *o->FunctionType();
380[[nodiscard]] std::string
383 return "FunPtr(" +
FunctionType()->debug_string() +
")";
386[[nodiscard]] std::unique_ptr<rvsdg::Operation>
392std::unique_ptr<FunctionToPointerOperation>
395 return std::make_unique<FunctionToPointerOperation>(std::move(fn));
398std::optional<std::vector<rvsdg::Output *>>
401 const std::vector<rvsdg::Output *> & operands)
404 const auto & operand = *operands[0];
408 if (
const auto ptrToFnOperation =
411 if (*ptrToFnOperation->FunctionType() == *operation.
FunctionType())
413 return std::vector({ node->input(0)->origin() });
425 std::shared_ptr<const rvsdg::FunctionType> fn)
427 FunctionType_(std::move(fn))
435 return *FunctionType() == *o->FunctionType();
443[[nodiscard]] std::string
446 return "PtrFun(" +
FunctionType()->debug_string() +
")";
449[[nodiscard]] std::unique_ptr<rvsdg::Operation>
455std::optional<std::vector<rvsdg::Output *>>
458 const std::vector<rvsdg::Output *> & operands)
461 const auto & operand = *operands[0];
465 if (
const auto fnToPtrOperation =
468 if (*fnToPtrOperation->FunctionType() == *operation.
FunctionType())
470 return std::vector({ node->input(0)->origin() });
478std::unique_ptr<PointerToFunctionOperation>
481 return std::make_unique<PointerToFunctionOperation>(std::move(fn));
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
~BitCastOperation() noexcept override
std::string debug_string() const override
~ControlToIntOperation() noexcept override
std::unique_ptr< Operation > copy() const override
const fpsize & srcsize() const noexcept
~FPExtOperation() noexcept override
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
~FPToSIOperation() noexcept override
std::unique_ptr< Operation > copy() const override
std::string debug_string() const override
~FPToUIOperation() noexcept override
std::unique_ptr< Operation > copy() const override
std::string debug_string() const override
const fpsize & srcsize() const noexcept
std::unique_ptr< Operation > copy() const override
std::string debug_string() const override
~FPTruncOperation() noexcept override
Get address of compiled function object.
std::unique_ptr< Operation > copy() const override
static std::optional< std::vector< rvsdg::Output * > > invertFunctionToPointer(const FunctionToPointerOperation &operation, const std::vector< rvsdg::Output * > &operands)
std::string debug_string() const override
bool operator==(const Operation &other) const noexcept override
static std::unique_ptr< FunctionToPointerOperation > Create(std::shared_ptr< const rvsdg::FunctionType > fn)
FunctionToPointerOperation(std::shared_ptr< const rvsdg::FunctionType > fn)
~FunctionToPointerOperation() noexcept override
const std::shared_ptr< const rvsdg::FunctionType > & FunctionType() const noexcept
std::string debug_string() const override
~IntToPtrOperation() noexcept override
std::unique_ptr< Operation > copy() const override
static rvsdg::Node & Create(rvsdg::Region ®ion, IntegerValueRepresentation representation)
Interpret pointer as callable function.
static std::optional< std::vector< rvsdg::Output * > > invertPointerToFunction(const PointerToFunctionOperation &operation, const std::vector< rvsdg::Output * > &operands)
std::string debug_string() const override
PointerToFunctionOperation(std::shared_ptr< const rvsdg::FunctionType > fn)
std::unique_ptr< Operation > copy() const override
bool operator==(const Operation &other) const noexcept override
~PointerToFunctionOperation() noexcept override
const std::shared_ptr< const rvsdg::FunctionType > & FunctionType() const noexcept
static std::unique_ptr< PointerToFunctionOperation > Create(std::shared_ptr< const rvsdg::FunctionType > fn)
std::unique_ptr< Operation > copy() const override
std::string debug_string() const override
~PtrToIntOperation() noexcept override
static std::optional< std::vector< rvsdg::Output * > > foldConstant(const SExtOperation &operation, const std::vector< rvsdg::Output * > &operands)
~SExtOperation() noexcept override
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
size_t nsrcbits() const noexcept
size_t ndstbits() const noexcept
~SIToFPOperation() noexcept override
std::unique_ptr< Operation > copy() const override
std::string debug_string() const override
std::string debug_string() const override
~TruncOperation() noexcept override
size_t ndstbits() const noexcept
static std::optional< std::vector< rvsdg::Output * > > foldConstant(const TruncOperation &operation, const std::vector< rvsdg::Output * > &operands)
size_t nsrcbits() const noexcept
std::unique_ptr< Operation > copy() const override
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
~UIToFPOperation() noexcept override
std::string debug_string() const override
size_t nsrcbits() const noexcept
static std::optional< std::vector< rvsdg::Output * > > foldConstant(const ZExtOperation &operation, const std::vector< rvsdg::Output * > &operands)
~ZExtOperation() noexcept override
std::unique_ptr< Operation > copy() const override
size_t ndstbits() const noexcept
NodeOutput * output(size_t index) const noexcept
const std::shared_ptr< const rvsdg::Type > & argument(size_t index) const noexcept
const std::shared_ptr< const rvsdg::Type > & result(size_t index) const noexcept
Global memory state passed between functions.
rvsdg::Output & traceOutput(rvsdg::Output &output, const rvsdg::Region *withinRegion)
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
static std::string strfmt(Args... args)