21 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
35std::unique_ptr<rvsdg::Operation>
38 return std::make_unique<BitCastOperation>(*
this);
47 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
56std::unique_ptr<rvsdg::Operation>
59 return std::make_unique<SExtOperation>(*
this);
62std::optional<std::vector<rvsdg::Output *>>
65 const std::vector<rvsdg::Output *> & operands)
68 auto & operand = *operands[0];
71 auto [constantNode, constantOperation] =
73 if (!constantOperation)
76 const auto & resultRepresentation =
77 constantOperation->Representation().sext(operation.
ndstbits() - operation.
nsrcbits());
81 return std::vector<rvsdg::Output *>({
result });
90 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
99std::unique_ptr<rvsdg::Operation>
102 return std::make_unique<ZExtOperation>(*
this);
105std::optional<std::vector<rvsdg::Output *>>
108 const std::vector<rvsdg::Output *> & operands)
111 auto & operand = *operands[0];
114 auto [constantNode, constantOperation] =
116 if (!constantOperation)
119 const auto & resultRepresentation =
120 constantOperation->Representation().zext(operation.
ndstbits() - operation.
nsrcbits());
124 return std::vector<rvsdg::Output *>({
result });
133 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
142std::unique_ptr<rvsdg::Operation>
145 return std::make_unique<TruncOperation>(*
this);
148std::optional<std::vector<rvsdg::Output *>>
151 const std::vector<rvsdg::Output *> & operands)
154 auto & operand = *operands[0];
157 auto [constantNode, constantOperation] =
159 if (!constantOperation)
162 const auto & resultRepresentation =
163 constantOperation->Representation().trunc(operation.
ndstbits());
167 return std::vector<rvsdg::Output *>({
result });
176 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
185std::unique_ptr<rvsdg::Operation>
188 return std::make_unique<PtrToIntOperation>(*
this);
197 return op && op->
srcsize() == srcsize() && op->dstsize() == dstsize();
206std::unique_ptr<rvsdg::Operation>
209 return std::make_unique<FPExtOperation>(*
this);
212static const ::llvm::fltSemantics &
218 return ::llvm::APFloat::IEEEhalf();
220 return ::llvm::APFloat::IEEEsingle();
222 return ::llvm::APFloat::IEEEdouble();
224 return ::llvm::APFloat::x87DoubleExtended();
226 return ::llvm::APFloat::IEEEquad();
232std::optional<std::vector<rvsdg::Output *>>
235 const std::vector<rvsdg::Output *> & operands)
238 auto & operand = *operands[0];
241 auto [constantNode, constantOperation] =
243 if (!constantOperation)
246 bool ignored =
false;
247 ::llvm::APFloat resultRepresentation = constantOperation->constant();
248 resultRepresentation.convert(
250 ::llvm::APFloat::rmNearestTiesToEven,
256 return std::vector<rvsdg::Output *>({ resultNode.output(0) });
265 return op && op->
srcsize() == srcsize() && op->dstsize() == dstsize();
274std::unique_ptr<rvsdg::Operation>
277 return std::make_unique<FPTruncOperation>(*
this);
280std::optional<std::vector<rvsdg::Output *>>
283 const std::vector<rvsdg::Output *> & operands)
286 auto & operand = *operands[0];
289 auto [constantNode, constantOperation] =
291 if (!constantOperation)
294 bool ignored =
false;
295 ::llvm::APFloat resultRepresentation = constantOperation->constant();
296 resultRepresentation.convert(
298 ::llvm::APFloat::rmNearestTiesToEven,
304 return std::vector<rvsdg::Output *>({ resultNode.output(0) });
313 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
322std::unique_ptr<rvsdg::Operation>
325 return std::make_unique<UIToFPOperation>(*
this);
334 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
343std::unique_ptr<rvsdg::Operation>
346 return std::make_unique<SIToFPOperation>(*
this);
355 return op && op->
argument(0) == argument(0);
364std::unique_ptr<rvsdg::Operation>
367 return std::make_unique<IntToPtrOperation>(*
this);
376 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
385std::unique_ptr<rvsdg::Operation>
388 return std::make_unique<FPToUIOperation>(*
this);
397 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
406std::unique_ptr<rvsdg::Operation>
409 return std::make_unique<FPToSIOperation>(*
this);
418 return op && op->
argument(0) == argument(0) && op->result(0) == result(0);
424 return "ControlToInt";
427std::unique_ptr<rvsdg::Operation>
430 return std::make_unique<ControlToIntOperation>(*
this);
437 std::shared_ptr<const rvsdg::FunctionType> fn)
439 FunctionType_(std::move(fn))
447 return *FunctionType() == *o->FunctionType();
455[[nodiscard]] std::string
458 return "FunPtr(" +
FunctionType()->debug_string() +
")";
461[[nodiscard]] std::unique_ptr<rvsdg::Operation>
467std::unique_ptr<FunctionToPointerOperation>
470 return std::make_unique<FunctionToPointerOperation>(std::move(fn));
473std::optional<std::vector<rvsdg::Output *>>
476 const std::vector<rvsdg::Output *> & operands)
479 const auto & operand = *operands[0];
483 if (
const auto ptrToFnOperation =
486 if (*ptrToFnOperation->FunctionType() == *operation.
FunctionType())
488 return std::vector({ node->input(0)->origin() });
500 std::shared_ptr<const rvsdg::FunctionType> fn)
502 FunctionType_(std::move(fn))
510 return *FunctionType() == *o->FunctionType();
518[[nodiscard]] std::string
521 return "PtrFun(" +
FunctionType()->debug_string() +
")";
524[[nodiscard]] std::unique_ptr<rvsdg::Operation>
530std::optional<std::vector<rvsdg::Output *>>
533 const std::vector<rvsdg::Output *> & operands)
536 const auto & operand = *operands[0];
540 if (
const auto fnToPtrOperation =
543 if (*fnToPtrOperation->FunctionType() == *operation.
FunctionType())
545 return std::vector({ node->input(0)->origin() });
553std::unique_ptr<PointerToFunctionOperation>
556 return std::make_unique<PointerToFunctionOperation>(std::move(fn));
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
~BitCastOperation() noexcept override
static rvsdg::Node & createNode(rvsdg::Region ®ion, fpsize size, const ::llvm::APFloat &constant)
std::string debug_string() const override
~ControlToIntOperation() noexcept override
std::unique_ptr< Operation > copy() const override
const fpsize & srcsize() const noexcept
static std::optional< std::vector< rvsdg::Output * > > foldConstant(const FPExtOperation &operation, const std::vector< rvsdg::Output * > &operands)
~FPExtOperation() noexcept override
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
const fpsize & dstsize() const noexcept
~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
static std::optional< std::vector< rvsdg::Output * > > foldConstant(const FPTruncOperation &operation, const std::vector< rvsdg::Output * > &operands)
const fpsize & dstsize() const noexcept
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
#define JLM_UNREACHABLE(msg)
Global memory state passed between functions.
rvsdg::Output & traceOutput(rvsdg::Output &output, bool mayEnterSubregions, const rvsdg::Region *withinRegion)
static const ::llvm::fltSemantics & mapToLlvmFltSemantics(const fpsize size)
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)