13 #include <unordered_map>
29 return jlm::rvsdg::is<PointerType>(other);
44 std::shared_ptr<const PointerType>
48 return std::shared_ptr<const PointerType>(std::shared_ptr<void>(), &instance);
56 return util::strfmt(
"[ ", nelements(),
" x ", type_->debug_string(),
" ]");
63 return type &&
type->element_type() == element_type() &&
type->nelements() == nelements();
69 const auto typeHash =
typeid(
ArrayType).hash_code();
70 const auto numElementsHash = std::hash<std::size_t>()(
nelements_);
85 static std::unordered_map<fpsize, std::string> map({ {
fpsize::half,
"half" },
99 return type &&
type->size() == size();
106 const auto sizeHash = std::hash<fpsize>()(
size_);
116 std::shared_ptr<const FloatingPointType>
124 return std::shared_ptr<const FloatingPointType>(std::shared_ptr<void>(), &instance);
129 return std::shared_ptr<const FloatingPointType>(std::shared_ptr<void>(), &instance);
134 return std::shared_ptr<const FloatingPointType>(std::shared_ptr<void>(), &instance);
139 return std::shared_ptr<const FloatingPointType>(std::shared_ptr<void>(), &instance);
144 return std::shared_ptr<const FloatingPointType>(std::shared_ptr<void>(), &instance);
179 std::shared_ptr<const VariableArgumentType>
183 return std::shared_ptr<const VariableArgumentType>(std::shared_ptr<void>(), &instance);
192 if (!
type ||
type->isPacked_ != isPacked_ ||
type->isLiteral_ != isLiteral_
193 ||
type->name_ != name_ ||
type->numElements() != numElements())
196 for (
size_t n = 0; n < numElements(); n++)
198 if (*types_[n] != *
type->types_[n])
208 const auto typeHash =
typeid(
StructType).hash_code();
209 const auto isLiteralHash = std::hash<bool>()(
isLiteral_);
210 const auto isPackedHash = std::hash<bool>()(
isPacked_);
211 const auto nameHash = std::hash<std::string>()(
name_);
263 return type &&
type->size_ == size_ && *
type->type_ == *type_;
284 auto sizeHash = std::hash<size_t>()(
size());
306 const auto sizeHash = std::hash<size_t>()(
size());
321 return jlm::rvsdg::is<IOStateType>(other);
342 std::shared_ptr<const IOStateType>
346 return std::shared_ptr<const IOStateType>(std::shared_ptr<void>(), &instance);
363 return jlm::rvsdg::is<MemoryStateType>(other);
378 std::shared_ptr<const MemoryStateType>
382 return std::shared_ptr<const MemoryStateType>(std::shared_ptr<void>(), &instance);
391 const auto bytes = (bits->nbits() + 7) / 8;
394 if (jlm::rvsdg::is<PointerType>(
type))
399 if (
const auto arrayType =
dynamic_cast<const ArrayType *
>(&
type))
401 return arrayType->nelements() *
GetTypeAllocSize(*arrayType->GetElementType());
405 switch (floatType->size())
421 if (
const auto structType =
dynamic_cast<const StructType *
>(&
type))
423 size_t totalSize = 0;
424 size_t alignment = 1;
427 const auto isPacked = structType->IsPacked();
429 for (
size_t i = 0; i < structType->numElements(); i++)
431 auto field = structType->getElementType(i);
442 totalSize += fieldSize;
445 alignment = std::lcm(alignment, fieldAlignment);
456 if (
const auto vectorType =
dynamic_cast<const VectorType *
>(&
type))
459 const auto bytesNeeded = vectorType->size() *
GetTypeAllocSize(*vectorType->Type());
462 if (rvsdg::is<rvsdg::FunctionType>(
type))
475 if (rvsdg::is<StructType>(
type) || rvsdg::is<ArrayType>(
type))
487 if (jlm::rvsdg::is<rvsdg::BitType>(
type) || jlm::rvsdg::is<PointerType>(
type)
488 || jlm::rvsdg::is<FloatingPointType>(
type) || jlm::rvsdg::is<VectorType>(
type))
493 if (
const auto arrayType =
dynamic_cast<const ArrayType *
>(&
type))
497 if (
const auto structType =
dynamic_cast<const StructType *
>(&
type))
500 if (structType->IsPacked())
503 size_t alignment = 1;
505 for (
size_t i = 0; i < structType->numElements(); i++)
507 auto field = structType->getElementType(i);
511 alignment = std::lcm(alignment, fieldAlignment);
516 if (rvsdg::is<rvsdg::FunctionType>(
type))
rvsdg::TypeKind Kind() const noexcept override
Return the kind of this type.
std::shared_ptr< const rvsdg::Type > type_
ArrayType(std::shared_ptr< const Type > type, size_t nelements)
std::size_t ComputeHash() const noexcept override
~ArrayType() noexcept override
bool operator==(const jlm::rvsdg::Type &other) const noexcept override
std::string debug_string() const override
~FixedVectorType() noexcept override
std::size_t ComputeHash() const noexcept override
FixedVectorType(std::shared_ptr< const rvsdg::Type > type, size_t size)
bool operator==(const jlm::rvsdg::Type &other) const noexcept override
static std::shared_ptr< const FloatingPointType > Create(fpsize size)
FloatingPointType(const fpsize &size)
~FloatingPointType() noexcept override
const fpsize & size() const noexcept
std::size_t ComputeHash() const noexcept override
rvsdg::TypeKind Kind() const noexcept override
Return the kind of this type.
constexpr IOStateType() noexcept=default
~IOStateType() noexcept override
static std::shared_ptr< const IOStateType > Create()
std::string debug_string() const override
std::size_t ComputeHash() const noexcept override
rvsdg::TypeKind Kind() const noexcept override
Return the kind of this type.
rvsdg::TypeKind Kind() const noexcept override
Return the kind of this type.
constexpr MemoryStateType() noexcept=default
bool operator==(const jlm::rvsdg::Type &other) const noexcept override
~MemoryStateType() noexcept override
std::size_t ComputeHash() const noexcept override
static std::shared_ptr< const MemoryStateType > Create()
static std::shared_ptr< const PointerType > Create()
~PointerType() noexcept override
bool operator==(const jlm::rvsdg::Type &other) const noexcept override
std::size_t ComputeHash() const noexcept override
rvsdg::TypeKind Kind() const noexcept override
Return the kind of this type.
std::string debug_string() const override
std::size_t ComputeHash() const noexcept override
ScalableVectorType(std::shared_ptr< const rvsdg::Type > type, size_t size)
~ScalableVectorType() noexcept override
std::size_t ComputeHash() const noexcept override
std::string debug_string() const override
size_t numElements() const noexcept
std::shared_ptr< const Type > getElementType(const size_t index) const noexcept
StructType(std::string name, std::vector< std::shared_ptr< const Type >> types, const bool isPacked, const bool isLiteral)
bool IsPacked() const noexcept
std::vector< std::shared_ptr< const Type > > types_
size_t GetFieldOffset(size_t fieldIndex) const
rvsdg::TypeKind Kind() const noexcept override
Return the kind of this type.
~StructType() noexcept override
~VariableArgumentType() noexcept override
std::size_t ComputeHash() const noexcept override
rvsdg::TypeKind Kind() const noexcept override
Return the kind of this type.
std::string debug_string() const override
constexpr VariableArgumentType()=default
static std::shared_ptr< const VariableArgumentType > Create()
bool operator==(const jlm::rvsdg::Type &other) const noexcept override
size_t size() const noexcept
const rvsdg::Type & type() const noexcept
rvsdg::TypeKind Kind() const noexcept override
Return the kind of this type.
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
#define JLM_UNREACHABLE(msg)
Global memory state passed between functions.
size_t GetTypeAlignment(const rvsdg::Type &type)
size_t GetTypeAllocSize(const rvsdg::Type &type)
size_t GetTypeStoreSize(const rvsdg::Type &type)
static std::string type(const Node *n)
TypeKind
The kinds of types supported in rvsdg.
@ State
Designate a state type.
@ Value
Designate a value type.
static std::string strfmt(Args... args)
static constexpr T RoundUpToMultipleOf(T value, T multiple)
static constexpr T RoundUpToPowerOf2(T value)
std::size_t CombineHashes(std::size_t hash, Args... args)