Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions benchmarks/fixtures/peephole_demo.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Peephole optimizer demo (Topic 13)
# Run: python3 -m scratchv.backend.asm_peephole benchmarks/fixtures/peephole_demo.asm --report

.text
main:
li a0, 5
addi a0, a0, 3 # li+addi fusion -> li a0, 8
addi a0, a0, 0 # addi zero elimination -> deleted
mv t0, t1
mv t2, t0
beq x0, x0, .Ldone # beq zero-zero -> j .Ldone
.Ldone:
ret
18 changes: 16 additions & 2 deletions scratchv/backend/asm_peephole.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,8 +192,16 @@ def _lines_to_asm(lines: list[AsmLine]) -> str:
# ---------------------------------------------------------------------------

def _default_rules() -> list[PeepholeRule]:
"""Return the set of five default peephole optimization rules."""
"""Return the set of default peephole optimization rules."""
return [
# Rule 0: addi x, x, 0 -> delete (no-op increment)
PeepholeRule(
name="addi zero elimination",
pattern=["addi"],
replacement=[],
register_constraints=[(0, 0, 1)],
),

# Rule 1: addi x, x, a; addi x, x, b -> addi x, x, a+b
PeepholeRule(
name="addi+addi fusion",
Expand Down Expand Up @@ -326,6 +334,12 @@ def _match_rule(
if ops[0] not in ("x0", "zero") or ops[1] not in ("x0", "zero"):
return None

# addi rd, rd, 0 is a no-op
if rule.name == "addi zero elimination":
ops = window[0].operands
if len(ops) < 3 or ops[2] != "0":
return None

return bindings


Expand All @@ -339,7 +353,7 @@ class AsmPeepholeOptimizer:
Parameters
----------
rules:
List of peephole rules. If None, uses the five default rules.
List of peephole rules. If None, uses the default rule set.

Usage::

Expand Down
17 changes: 16 additions & 1 deletion tests/test_asm_peephole.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,22 @@ def test_roundtrip(self):


class TestDefaultRules:
"""Tests for the five default peephole rules."""
"""Tests for the default peephole rules."""

def test_addi_zero_elimination(self):
optimizer = AsmPeepholeOptimizer()
asm = " addi t0, t0, 0\n add t1, t2, t3\n"
result, changes = optimizer.optimize(asm)
assert changes >= 1
assert "addi" not in result
assert "add" in result

def test_addi_zero_elimination_preserves_nonzero(self):
optimizer = AsmPeepholeOptimizer()
asm = " addi t0, t0, 1\n add t1, t2, t3\n"
result, changes = optimizer.optimize(asm)
assert "addi t0, t0, 1" in result or "addi" in result
assert "add" in result

def test_addi_addi_fusion(self):
optimizer = AsmPeepholeOptimizer()
Expand Down