6 #ifndef JLM_LLVM_IR_OPERATORS_GETELEMENTPTR_HPP
7 #define JLM_LLVM_IR_OPERATORS_GETELEMENTPTR_HPP
30 const std::vector<std::shared_ptr<const rvsdg::BitType>> & offsetTypes,
31 std::shared_ptr<const rvsdg::Type> pointeeType)
41 operator==(
const Operation & other)
const noexcept
override;
43 [[nodiscard]] std::string
46 [[nodiscard]] std::unique_ptr<Operation>
47 copy()
const override;
68 static std::unique_ptr<llvm::ThreeAddressCode>
71 const std::vector<const Variable *> & offsets,
72 std::shared_ptr<const rvsdg::Type> pointeeType,
73 std::shared_ptr<const rvsdg::Type> resultType)
76 auto offsetTypes = CheckAndExtractOffsetTypes<const Variable>(offsets);
79 auto operation = std::make_unique<GetElementPtrOperation>(offsetTypes, std::move(pointeeType));
80 std::vector<const Variable *>
operands(1, baseAddress);
102 const std::vector<rvsdg::Output *> & offsets,
103 std::shared_ptr<const rvsdg::Type> pointeeType,
104 std::shared_ptr<const rvsdg::Type> resultType)
107 auto offsetTypes = CheckAndExtractOffsetTypes<rvsdg::Output>(offsets);
110 std::vector
operands(1, baseAddress);
113 return rvsdg::CreateOpNode<GetElementPtrOperation>(
116 std::move(pointeeType))
124 if (!is<PointerType>(
type))
131 static std::vector<std::shared_ptr<const rvsdg::BitType>>
134 std::vector<std::shared_ptr<const rvsdg::BitType>> offsetTypes;
135 for (
const auto & offset : offsets)
137 if (
auto offsetType = std::dynamic_pointer_cast<const rvsdg::BitType>(offset->Type()))
139 offsetTypes.emplace_back(std::move(offsetType));
149 static std::vector<std::shared_ptr<const rvsdg::Type>>
153 types.insert(types.end(), indexTypes.begin(), indexTypes.end());
std::string debug_string() const override
GetElementPtrOperation(GetElementPtrOperation &&other) noexcept=default
GetElementPtrOperation(const GetElementPtrOperation &other)=default
bool operator==(const Operation &other) const noexcept override
std::shared_ptr< const rvsdg::Type > PointeeType_
const rvsdg::Type & GetPointeeType() const noexcept
static void CheckPointerType(const rvsdg::Type &type)
~GetElementPtrOperation() noexcept override
static std::vector< std::shared_ptr< const rvsdg::BitType > > CheckAndExtractOffsetTypes(const std::vector< T * > &offsets)
static rvsdg::Output * Create(rvsdg::Output *baseAddress, const std::vector< rvsdg::Output * > &offsets, std::shared_ptr< const rvsdg::Type > pointeeType, std::shared_ptr< const rvsdg::Type > resultType)
std::unique_ptr< Operation > copy() const override
static std::vector< std::shared_ptr< const rvsdg::Type > > CreateOperandTypes(const std::vector< std::shared_ptr< const rvsdg::BitType >> &indexTypes)
static std::unique_ptr< llvm::ThreeAddressCode > Create(const Variable *baseAddress, const std::vector< const Variable * > &offsets, std::shared_ptr< const rvsdg::Type > pointeeType, std::shared_ptr< const rvsdg::Type > resultType)
static std::shared_ptr< const PointerType > Create()
static std::unique_ptr< llvm::ThreeAddressCode > create(std::unique_ptr< rvsdg::SimpleOperation > operation, const std::vector< const Variable * > &operands)
const jlm::rvsdg::Type & type() const noexcept
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
SimpleOperation(std::vector< std::shared_ptr< const jlm::rvsdg::Type >> operands, std::vector< std::shared_ptr< const jlm::rvsdg::Type >> results)
Global memory state passed between functions.
static std::string type(const Node *n)
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)