aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'backend/lib/CodeGen')
-rw-r--r--backend/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp8
-rw-r--r--backend/lib/CodeGen/MachineBasicBlock.cpp28
2 files changed, 29 insertions, 7 deletions
diff --git a/backend/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp b/backend/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp
index e1fdaa6..caf9652 100644
--- a/backend/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp
+++ b/backend/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp
@@ -53,13 +53,7 @@ Expected<void> CSEMIRBuilder::makeInstructionDominate(MachineInstr &Instruction)
}
if (InsertBefore == nullptr || dominatesInsertionPoint(Instruction))
return {};
- auto Removed = Block->removeInstruction(Instruction);
- if (!Removed)
- return std::unexpected(Removed.error());
- auto Inserted = Block->insertInstructionBefore(*InsertBefore, Instruction);
- if (!Inserted)
- return std::unexpected(Inserted.error());
- return {};
+ return Block->spliceInstructionBefore(*InsertBefore, Instruction);
}
Expected<MachineInstr *>
diff --git a/backend/lib/CodeGen/MachineBasicBlock.cpp b/backend/lib/CodeGen/MachineBasicBlock.cpp
index 763a577..2de8f89 100644
--- a/backend/lib/CodeGen/MachineBasicBlock.cpp
+++ b/backend/lib/CodeGen/MachineBasicBlock.cpp
@@ -99,6 +99,34 @@ Expected<void> MachineBasicBlock::insertInstructionAfter(MachineInstr &Position,
return {};
}
+Expected<void> MachineBasicBlock::spliceInstructionBefore(MachineInstr &Position,
+ MachineInstr &Instruction) {
+ if (Position.parent() != this || Instruction.parent() != this) {
+ return makeUnexpected(ErrorCode::InvalidArgument,
+ "instruction splice requires two instructions in this block");
+ }
+ if (&Position == &Instruction || Instruction.NextInstruction == &Position)
+ return {};
+
+ if (Instruction.PreviousInstruction != nullptr)
+ Instruction.PreviousInstruction->NextInstruction = Instruction.NextInstruction;
+ else
+ FirstInstruction = Instruction.NextInstruction;
+ if (Instruction.NextInstruction != nullptr)
+ Instruction.NextInstruction->PreviousInstruction = Instruction.PreviousInstruction;
+ else
+ LastInstruction = Instruction.PreviousInstruction;
+
+ Instruction.PreviousInstruction = Position.PreviousInstruction;
+ Instruction.NextInstruction = &Position;
+ if (Position.PreviousInstruction != nullptr)
+ Position.PreviousInstruction->NextInstruction = &Instruction;
+ else
+ FirstInstruction = &Instruction;
+ Position.PreviousInstruction = &Instruction;
+ return {};
+}
+
Expected<void> MachineBasicBlock::removeInstruction(MachineInstr &Instruction) {
if (Instruction.parent() != this) {
return makeUnexpected(ErrorCode::InvalidArgument, "instruction does not belong to this block");