diff --git a/include/sirit/sirit.h b/include/sirit/sirit.h index 1a0def9..fadf0a9 100644 --- a/include/sirit/sirit.h +++ b/include/sirit/sirit.h @@ -945,8 +945,7 @@ private: std::vector> execution_modes; std::vector> debug; std::vector> annotations; - std::unordered_set> declarations; - std::vector sorted_declarations; + std::vector> declarations; std::vector global_variables; diff --git a/src/literal_number.cpp b/src/literal_number.cpp index 8f2a20d..a1c3103 100644 --- a/src/literal_number.cpp +++ b/src/literal_number.cpp @@ -35,8 +35,4 @@ bool LiteralNumber::operator==(const Operand& other) const { return false; } -std::size_t LiteralNumber::Hash() const { - return static_cast(raw) ^ Operand::Hash(); -} - } // namespace Sirit diff --git a/src/literal_number.h b/src/literal_number.h index c0e4bb1..6baece8 100644 --- a/src/literal_number.h +++ b/src/literal_number.h @@ -6,7 +6,6 @@ #pragma once -#include #include #include #include "operand.h" @@ -24,8 +23,6 @@ public: bool operator==(const Operand& other) const override; - std::size_t Hash() const override; - template static LiteralNumber* Create(T value) { static_assert(sizeof(T) == 4 || sizeof(T) == 8); diff --git a/src/literal_string.cpp b/src/literal_string.cpp index b7eb2e3..e7f85e6 100644 --- a/src/literal_string.cpp +++ b/src/literal_string.cpp @@ -4,7 +4,6 @@ * 3-Clause BSD License */ -#include #include #include "common_types.h" #include "literal_string.h" @@ -37,8 +36,4 @@ bool LiteralString::operator==(const Operand& other) const { return false; } -std::size_t LiteralString::Hash() const { - return Operand::Hash() ^ std::hash{}(string); -} - } // namespace Sirit diff --git a/src/literal_string.h b/src/literal_string.h index cb05296..c89f533 100644 --- a/src/literal_string.h +++ b/src/literal_string.h @@ -6,7 +6,6 @@ #pragma once -#include #include #include "operand.h" #include "stream.h" @@ -23,10 +22,8 @@ public: bool operator==(const Operand& other) const override; - std::size_t Hash() const override; - private: - std::string string; + const std::string string; }; } // namespace Sirit diff --git a/src/op.cpp b/src/op.cpp index 44c5e65..5639735 100644 --- a/src/op.cpp +++ b/src/op.cpp @@ -5,7 +5,6 @@ */ #include -#include #include "common_types.h" #include "literal_number.h" @@ -48,21 +47,6 @@ bool Op::operator==(const Operand& other) const { return false; } -std::size_t Op::Hash() const { - std::size_t hash = Operand::Hash(); - hash ^= static_cast(opcode) << 20; - if (result_type) { - hash ^= result_type->Hash() << 16; - } - hash ^= static_cast(id.value_or(0)) << 8; - std::size_t wrap = 32; - for (const auto operand : operands) { - wrap = (wrap + 7) % (sizeof(std::size_t) * CHAR_BIT); - hash ^= operand->Hash() << wrap; - } - return hash; -} - void Op::Write(Stream& stream) const { stream.Write(static_cast(opcode)); stream.Write(WordCount()); diff --git a/src/op.h b/src/op.h index 19a6b82..91a3e25 100644 --- a/src/op.h +++ b/src/op.h @@ -6,7 +6,6 @@ #pragma once -#include #include #include "common_types.h" #include "operand.h" @@ -25,8 +24,6 @@ public: bool operator==(const Operand& other) const override; - std::size_t Hash() const override; - void Write(Stream& stream) const; void Sink(Operand* operand); diff --git a/src/operand.cpp b/src/operand.cpp index 4a55417..1a929b8 100644 --- a/src/operand.cpp +++ b/src/operand.cpp @@ -30,10 +30,6 @@ bool Operand::operator!=(const Operand& other) const { return !(*this == other); } -std::size_t Operand::Hash() const { - return static_cast(operand_type) << 30; -} - OperandType Operand::GetType() const { return operand_type; } diff --git a/src/operand.h b/src/operand.h index 85633c7..008d30b 100644 --- a/src/operand.h +++ b/src/operand.h @@ -6,8 +6,6 @@ #pragma once -#include -#include "common_types.h" #include "stream.h" namespace Sirit { @@ -25,8 +23,6 @@ public: virtual bool operator==(const Operand& other) const; bool operator!=(const Operand& other) const; - virtual std::size_t Hash() const; - OperandType GetType() const; protected: @@ -34,14 +30,3 @@ protected: }; } // namespace Sirit - -namespace std { - -template <> -struct hash { - std::size_t operator()(const Sirit::Operand& operand) const noexcept { - return operand.Hash(); - } -}; - -} // namespace std diff --git a/src/sirit.cpp b/src/sirit.cpp index 50135e3..c88111c 100644 --- a/src/sirit.cpp +++ b/src/sirit.cpp @@ -59,7 +59,7 @@ std::vector Module::Assemble() const { WriteSet(stream, execution_modes); WriteSet(stream, debug); WriteSet(stream, annotations); - WriteSet(stream, sorted_declarations); + WriteSet(stream, declarations); WriteSet(stream, global_variables); WriteSet(stream, code); @@ -74,14 +74,13 @@ void Module::AddCapability(spv::Capability capability) { capabilities.insert(capability); } -void Module::SetMemoryModel(spv::AddressingModel addressing_model_, - spv::MemoryModel memory_model_) { +void Module::SetMemoryModel(spv::AddressingModel addressing_model_, spv::MemoryModel memory_model_) { this->addressing_model = addressing_model_; this->memory_model = memory_model_; } -void Module::AddEntryPoint(spv::ExecutionModel execution_model, Id entry_point, std::string name, - const std::vector& interfaces) { +void Module::AddEntryPoint(spv::ExecutionModel execution_model, Id entry_point, + std::string name, const std::vector& interfaces) { auto op{std::make_unique(spv::Op::OpEntryPoint)}; op->Add(static_cast(execution_model)); op->Add(entry_point); @@ -122,12 +121,14 @@ Id Module::AddCode(spv::Op opcode, std::optional id) { } Id Module::AddDeclaration(std::unique_ptr op) { - const auto [it, is_inserted] = declarations.emplace(std::move(op)); - const Id id = it->get(); - if (is_inserted) { - sorted_declarations.push_back(id); - ++bound; + const auto& found{std::find_if(declarations.begin(), declarations.end(), + [&op](const auto& other) { return *other == *op; })}; + if (found != declarations.end()) { + return found->get(); } + const auto id = op.get(); + declarations.push_back(std::move(op)); + bound++; return id; }