diff options
Diffstat (limited to 'backend/lib/CodeGen/MachineCombinerPattern.cpp')
| -rw-r--r-- | backend/lib/CodeGen/MachineCombinerPattern.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/backend/lib/CodeGen/MachineCombinerPattern.cpp b/backend/lib/CodeGen/MachineCombinerPattern.cpp new file mode 100644 index 0000000..f13ba73 --- /dev/null +++ b/backend/lib/CodeGen/MachineCombinerPattern.cpp @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "rcc/CodeGen/MachineCombinerPattern.h" + +#include <string> +#include <unordered_set> +#include <utility> + +namespace rcc { + +Expected<TargetMachineCombinerInfo> +TargetMachineCombinerInfo::create(std::vector<MachineCombinerPattern> Patterns) { + TargetMachineCombinerInfo Result(std::move(Patterns)); + std::unordered_set<std::string> Names; + for (const MachineCombinerPattern &Pattern : Result.Patterns) { + if (Pattern.Name.empty() || !Pattern.RootOpcode.isValid() || + !Pattern.ProducerOpcode.isValid() || !Pattern.ReplacementOpcode.isValid() || + Pattern.ProducerOperand == 0 || Pattern.AddendOperand == 0 || + Pattern.ProducerOperand == Pattern.AddendOperand || !Names.insert(Pattern.Name).second) { + return makeUnexpected(ErrorCode::InvalidArgument, + "machine combiner pattern has an invalid target pattern"); + } + Result.MatchTable[Pattern.RootOpcode].push_back(Pattern); + } + return Result; +} + +std::span<const MachineCombinerPattern> +TargetMachineCombinerInfo::patterns(Opcode RootOpcode) const noexcept { + const auto Position = MatchTable.find(RootOpcode); + return Position == MatchTable.end() ? std::span<const MachineCombinerPattern>{} + : std::span<const MachineCombinerPattern>(Position->second); +} + +} // namespace rcc |
