From 495c675771f43cfa12ab7a426a538be72fec1805 Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Sun, 9 Aug 2026 17:03:19 +0800 Subject: [CodeGen] Implement machine optimization and scheduling --- backend/lib/CodeGen/MachineCombinerPattern.cpp | 50 ++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 backend/lib/CodeGen/MachineCombinerPattern.cpp (limited to 'backend/lib/CodeGen/MachineCombinerPattern.cpp') diff --git a/backend/lib/CodeGen/MachineCombinerPattern.cpp b/backend/lib/CodeGen/MachineCombinerPattern.cpp new file mode 100644 index 0000000..b1c3c96 --- /dev/null +++ b/backend/lib/CodeGen/MachineCombinerPattern.cpp @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "rcc/CodeGen/MachineCombinerPattern.h" + +#include +#include +#include +#include +#include + +namespace rcc { + +Expected +TargetMachineCombinerInfo::create(std::vector Patterns) { + TargetMachineCombinerInfo Result(std::move(Patterns)); + std::unordered_set Names; + for (const MachineCombinerPattern &Pattern : Result.Patterns) { + if (Pattern.Name.empty() || !Pattern.RootOpcode.isValid() || Pattern.Stages == 0 || + !Names.insert(Pattern.Name).second) { + return makeUnexpected(ErrorCode::InvalidArgument, + "machine combiner pattern has an invalid identity or stage mask"); + } + for (const MachineCombinerPredicate &Predicate : Pattern.Predicates) { + switch (Predicate.Kind) { + case MachineCombinerPredicateKind::ImmediateEquals: + case MachineCombinerPredicateKind::PhysicalRegisterEquals: + case MachineCombinerPredicateKind::RegisterIsVirtual: + case MachineCombinerPredicateKind::RegisterIsPhysical: + break; + case MachineCombinerPredicateKind::RegisterEquals: + if (Predicate.Operand == Predicate.OtherOperand) { + return makeUnexpected(ErrorCode::InvalidArgument, + "register equality pattern compares an operand with itself"); + } + break; + } + } + Result.MatchTable[Pattern.RootOpcode].push_back(Pattern); + } + return Result; +} + +std::span +TargetMachineCombinerInfo::patterns(Opcode RootOpcode) const noexcept { + const auto Position = MatchTable.find(RootOpcode); + return Position == MatchTable.end() ? std::span{} + : std::span(Position->second); +} + +} // namespace rcc -- cgit v1.2.3