aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-04-03 01:34:05 -0400
committerJakub Konka <kubkon@jakubkonka.com>2023-04-03 17:45:16 +0200
commitcd24ab7f6e56c8365896a9b2dfc506a787346ecb (patch)
tree06e7c9e86bcb62cc02b10cd52a4ba4df110aa970
parentfde1ec5d0e57471b43bab226a78da2eb61e6bb66 (diff)
downloadzig-cd24ab7f6e56c8365896a9b2dfc506a787346ecb.tar.gz
zig-cd24ab7f6e56c8365896a9b2dfc506a787346ecb.zip
x86_64: canonicalise loops
-rw-r--r--src/arch/x86_64/CodeGen.zig23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index 44362f9bc0..a2d0d4da41 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -6132,7 +6132,28 @@ fn airLoop(self: *Self, inst: Air.Inst.Index) !void {
const loop = self.air.extraData(Air.Block, ty_pl.payload);
const body = self.air.extra[loop.end..][0..loop.data.body_len];
const jmp_target = @intCast(u32, self.mir_instructions.len);
- try self.genBody(body);
+
+ {
+ try self.branch_stack.append(.{});
+ errdefer _ = self.branch_stack.pop();
+
+ try self.genBody(body);
+ }
+
+ var branch = self.branch_stack.pop();
+ defer branch.deinit(self.gpa);
+
+ log.debug("airLoop: %{d}", .{inst});
+ log.debug("Upper branches:", .{});
+ for (self.branch_stack.items) |bs| {
+ log.debug("{}", .{bs.fmtDebug()});
+ }
+ log.debug("Loop branch: {}", .{branch.fmtDebug()});
+
+ var dummy_branch = Branch{};
+ defer dummy_branch.deinit(self.gpa);
+ try self.canonicaliseBranches(true, &dummy_branch, &branch, true, false);
+
_ = try self.asmJmpReloc(jmp_target);
return self.finishAirBookkeeping();
}