diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-04-03 01:34:05 -0400 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2023-04-03 17:45:16 +0200 |
| commit | cd24ab7f6e56c8365896a9b2dfc506a787346ecb (patch) | |
| tree | 06e7c9e86bcb62cc02b10cd52a4ba4df110aa970 | |
| parent | fde1ec5d0e57471b43bab226a78da2eb61e6bb66 (diff) | |
| download | zig-cd24ab7f6e56c8365896a9b2dfc506a787346ecb.tar.gz zig-cd24ab7f6e56c8365896a9b2dfc506a787346ecb.zip | |
x86_64: canonicalise loops
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 23 |
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(); } |
