aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen/MachineFunction.cpp
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/lib/CodeGen/MachineFunction.cpp
parentda8bc76b4bf7d1a7b025d6c8ef5809551467dcc7 (diff)
downloadrcc-project-495c675771f43cfa12ab7a426a538be72fec1805.tar.gz
rcc-project-495c675771f43cfa12ab7a426a538be72fec1805.tar.xz
[CodeGen] Implement machine optimization and scheduling
Diffstat (limited to 'backend/lib/CodeGen/MachineFunction.cpp')
-rw-r--r--backend/lib/CodeGen/MachineFunction.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/backend/lib/CodeGen/MachineFunction.cpp b/backend/lib/CodeGen/MachineFunction.cpp
index df1ceb5..7f4c3a9 100644
--- a/backend/lib/CodeGen/MachineFunction.cpp
+++ b/backend/lib/CodeGen/MachineFunction.cpp
@@ -172,6 +172,66 @@ Expected<void> MachineFunction::insertBlockBefore(MachineBasicBlock &Position,
return {};
}
+Expected<void> MachineFunction::moveBlockBefore(MachineBasicBlock &Position,
+ MachineBasicBlock &Block) {
+ if (Position.OwnerFunction != this || Block.OwnerFunction != this || !Position.IsLinked ||
+ !Block.IsLinked) {
+ return makeUnexpected(ErrorCode::InvalidArgument,
+ "layout move requires two linked blocks in the same function");
+ }
+ if (&Position == &Block || Block.NextBlock == &Position)
+ return {};
+
+ if (Block.PreviousBlock != nullptr)
+ Block.PreviousBlock->NextBlock = Block.NextBlock;
+ else
+ FirstBlock = Block.NextBlock;
+ if (Block.NextBlock != nullptr)
+ Block.NextBlock->PreviousBlock = Block.PreviousBlock;
+ else
+ LastBlock = Block.PreviousBlock;
+
+ Block.PreviousBlock = Position.PreviousBlock;
+ Block.NextBlock = &Position;
+ if (Position.PreviousBlock != nullptr)
+ Position.PreviousBlock->NextBlock = &Block;
+ else
+ FirstBlock = &Block;
+ Position.PreviousBlock = &Block;
+ renumberBlocks();
+ return {};
+}
+
+Expected<void> MachineFunction::moveBlockAfter(MachineBasicBlock &Position,
+ MachineBasicBlock &Block) {
+ if (Position.OwnerFunction != this || Block.OwnerFunction != this || !Position.IsLinked ||
+ !Block.IsLinked) {
+ return makeUnexpected(ErrorCode::InvalidArgument,
+ "layout move requires two linked blocks in the same function");
+ }
+ if (&Position == &Block || Position.NextBlock == &Block)
+ return {};
+
+ if (Block.PreviousBlock != nullptr)
+ Block.PreviousBlock->NextBlock = Block.NextBlock;
+ else
+ FirstBlock = Block.NextBlock;
+ if (Block.NextBlock != nullptr)
+ Block.NextBlock->PreviousBlock = Block.PreviousBlock;
+ else
+ LastBlock = Block.PreviousBlock;
+
+ Block.PreviousBlock = &Position;
+ Block.NextBlock = Position.NextBlock;
+ if (Position.NextBlock != nullptr)
+ Position.NextBlock->PreviousBlock = &Block;
+ else
+ LastBlock = &Block;
+ Position.NextBlock = &Block;
+ renumberBlocks();
+ return {};
+}
+
Expected<void> MachineFunction::removeBlock(MachineBasicBlock &Block) {
if (Block.OwnerFunction != this || !Block.IsLinked)
return makeUnexpected(ErrorCode::InvalidArgument,