Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
  • S SysY-Compiler
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Terraform modules
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • 编译小子
  • SysY-Compiler
  • Merge requests
  • !5

backend: 重构 RegPeephole 为规则驱动的流式 peephole 框架

  • Review changes

  • Download
  • Patches
  • Plain diff
Merged 编译小子 requested to merge backend into main May 31, 2026
  • Overview 0
  • Commits 2
  • Pipelines 0
  • Changes 10

将原先基于单个 pending 字符串和少量硬编码特判的 RegPeephole, 重构为可扩展的流式小窗口 peephole 框架。

本次改动主要包括:

  • 为汇编输出引入轻量结构化表示 AsmLine

    • 将每一行分类为 empty / comment / directive / label / instruction
    • 对 instruction 进一步拆分为 opcode + operands
    • 为后续规则匹配提供统一、稳定的表示层
  • 将原有实现改为 3 行滑动窗口 + fixed-point 规则迭代

    • 保持流式处理,不再缓存整份 .s
    • 每次读入一行后在小窗口内反复应用规则,直到局部稳定
    • 只在确认前缀不再被后续规则改写后才写回目标输出流
    • 保留原实现“低额外内存占用”的优点,同时提升可维护性与可扩展性
  • 把原有 peephole 逻辑迁移到统一规则表中

    • 删除自拷贝:mv x, x / fmv.s f, f
    • 删除跳到下一标签的 j
    • 相邻 store-load 转发:sw->lw、sd->ld、fsw->flw
  • 新增一组安全、保守的局部 peephole 规则

    • no-op immediate 归一化:addi/ori/xori 的 0 立即数形式改写为 mv
    • 来回拷贝消除:mv a, b; mv b, a
    • 条件/无条件跳转到下一标签的删除
    • 分支取反吸收后继 j:bcond L1; j L2; L1:
    • 跳转重定向:j L1; L1:; j L2
    • 重复 load 删除
    • 重复 store 删除
    • 连续 store 覆盖前一条 store 的删除
    • load-store round trip 删除:从同地址读出后又原样写回
  • 明确当前框架边界

    • 规则仍然保持保守,只处理最多 3 行的局部窗口
    • 不做跨 label / block 的全局分析
    • 不引入 alias analysis 或更激进的机器级推理
    • 使当前实现更适合作为后续继续扩展 peephole pattern 的基础框架
  • 更新 src/asm/README.md

    • 补充 RegPeephole 的新工作流程
    • 说明结构化行类型、窗口模型、规则分类与当前能力边界
    • 同步示例与设计说明,避免文档与实现脱节

验证:

  • cmake --build build
  • src/scripts/asm_test.sh test/custom/basic.sy -O0
  • src/scripts/asm_test.sh test/tests2026/functional
  • src/scripts/asm_test.sh test/tests2026/h_functional

结果:

  • functional: 100/100 通过
  • h_functional: 40/40 通过
Assignee
Assign to
Reviewers
Request review from
Time tracking
Source branch: backend