commit 89b4195c69c53e8b1fdd3f5ddd2c9658a61daaac (tree)
parent 3220e0b61c127b60188a040b5f4679765e8f6f40
Author: Koakuma <koachan@protonmail.com>
Date: Sat, 28 May 2022 09:06:25 +0700
stage2: sparc64: Account for delay slot in airBlock
Diffstat:
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/arch/sparc64/CodeGen.zig b/src/arch/sparc64/CodeGen.zig
@@ -991,9 +991,14 @@ fn airBlock(self: *Self, inst: Air.Inst.Index) !void {
const relocs = &self.blocks.getPtr(inst).?.relocs;
if (relocs.items.len > 0 and relocs.items[relocs.items.len - 1] == self.mir_instructions.len - 1) {
// If the last Mir instruction is the last relocation (which
- // would just jump one instruction further), it can be safely
+ // would just jump two instruction further), it can be safely
// removed
- self.mir_instructions.orderedRemove(relocs.pop());
+ const index = relocs.pop();
+
+ // First, remove the delay slot, then remove
+ // the branch instruction itself.
+ self.mir_instructions.orderedRemove(index + 1);
+ self.mir_instructions.orderedRemove(index);
}
for (relocs.items) |reloc| {
try self.performReloc(reloc);