aboutsummaryrefslogtreecommitdiff
path: root/backend/include/rcc/CodeGen/TargetBranchInfo.h
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-09 17:03:19 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-09 17:03:19 +0800
commit495c675771f43cfa12ab7a426a538be72fec1805 (patch)
tree4107223d6c6ef2e74d56064aa21b196307502342 /backend/include/rcc/CodeGen/TargetBranchInfo.h
parentda8bc76b4bf7d1a7b025d6c8ef5809551467dcc7 (diff)
downloadrcc-project-495c675771f43cfa12ab7a426a538be72fec1805.tar.gz
rcc-project-495c675771f43cfa12ab7a426a538be72fec1805.tar.xz
[CodeGen] Implement machine optimization and scheduling
Diffstat (limited to 'backend/include/rcc/CodeGen/TargetBranchInfo.h')
-rw-r--r--backend/include/rcc/CodeGen/TargetBranchInfo.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/backend/include/rcc/CodeGen/TargetBranchInfo.h b/backend/include/rcc/CodeGen/TargetBranchInfo.h
new file mode 100644
index 0000000..39c5122
--- /dev/null
+++ b/backend/include/rcc/CodeGen/TargetBranchInfo.h
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef RCC_CODEGEN_TARGETBRANCHINFO_H
+#define RCC_CODEGEN_TARGETBRANCHINFO_H
+
+#include "rcc/Support/Error.h"
+
+#include <cstdint>
+#include <optional>
+
+namespace rcc {
+
+class MachineBasicBlock;
+class MachineFunction;
+class MachineInstr;
+class TargetDescription;
+
+struct MachineBranchAnalysis final {
+ MachineInstr *Conditional = nullptr;
+ MachineInstr *Unconditional = nullptr;
+ MachineBasicBlock *TrueTarget = nullptr;
+ MachineBasicBlock *FalseTarget = nullptr;
+ bool HasUnanalyzableTerminator = false;
+};
+
+class TargetBranchInfo {
+public:
+ virtual ~TargetBranchInfo() = default;
+
+ [[nodiscard]] virtual Expected<MachineBranchAnalysis>
+ analyzeBranch(MachineBasicBlock &Block, MachineFunction &Function,
+ const TargetDescription &Target) const = 0;
+ [[nodiscard]] virtual Expected<void>
+ reverseBranchCondition(MachineInstr &Branch, MachineBasicBlock &NewTarget,
+ MachineFunction &Function, const TargetDescription &Target) const = 0;
+ [[nodiscard]] virtual Expected<void> removeBranch(MachineInstr &Branch, MachineFunction &Function,
+ const TargetDescription &Target) const = 0;
+ [[nodiscard]] virtual Expected<bool>
+ rewriteBranchTarget(MachineBasicBlock &Block, MachineBasicBlock &OldTarget,
+ MachineBasicBlock &NewTarget, MachineFunction &Function,
+ const TargetDescription &Target) const = 0;
+ [[nodiscard]] virtual Expected<MachineInstr *>
+ insertUnconditionalBranch(MachineBasicBlock &Block, MachineBasicBlock &TargetBlock,
+ MachineFunction &Function, const TargetDescription &Target) const = 0;
+
+ [[nodiscard]] virtual Expected<std::uint32_t>
+ instructionSize(const MachineInstr &Instruction, const MachineFunction &Function,
+ const TargetDescription &Target) const = 0;
+ [[nodiscard]] virtual Expected<MachineBasicBlock *>
+ branchTarget(MachineInstr &Instruction, MachineFunction &Function,
+ const TargetDescription &Target) const = 0;
+ [[nodiscard]] virtual Expected<std::optional<bool>>
+ evaluateBranchCondition(const MachineInstr &, const MachineFunction &,
+ const TargetDescription &) const {
+ return std::optional<bool>{};
+ }
+ [[nodiscard]] virtual bool isBranchOffsetInRange(const MachineInstr &Instruction,
+ std::int64_t Offset) const noexcept = 0;
+ [[nodiscard]] virtual Expected<bool> relaxBranch(MachineInstr &Instruction, std::int64_t Offset,
+ MachineFunction &Function,
+ const TargetDescription &Target) const = 0;
+};
+
+} // namespace rcc
+
+#endif // RCC_CODEGEN_TARGETBRANCHINFO_H