课题14:常量加载合并优化

难度:低

概述:优化RISC-V加载大常量的指令序列,将lui + addi对合并为单条li伪指令,并消除冗余lui。

详细任务: 1. 理解lui(加载高20位)和addi(加低12位,注意符号扩展)构成32位常量的机制。 2. 识别连续两条指令:lui rd, imm_hi后跟addi rd, rd, imm_lo,计算最终常量值。 3. 替换为一条li rd, final_value(如果后端支持li),否则保留但减少一条指令。 4. 检测冗余lui:同一个rd的lui在之前出现过且中间未修改,则删除后面的lui,调整addi的源寄存器。 5. 实现迭代扫描,统计节省的指令数。 6. 集成到后端,添加--merge-constants开关。

交付产物: - 优化脚本或模块 - 测试汇编文件(包含各种常量值) - 文档:算法原理、使用示例

12周每周目标: - W1:学习RISC-V加载大常量的机制,手动拆解一个32位常量(如0x12345678)。 - W2:编写汇编解析函数,识别lui和addi指令,提取目标寄存器和立即数。 - W3:实现合并检测:判断连续两条指令是否构成lui+addi对,计算最终常数值(处理符号扩展)。 - W4:实现替换:删除原两条,插入li rd, final_value(若后端支持),否则保留原指令但添加注释。 - W5:处理冗余lui:扫描中记录每个寄存器的最后一次lui值,若重复则删除后面lui。 - W6:实现合并优化函数,扫描整个汇编文件,迭代应用直到没有变化。 - W7:测试各种常量值(正数、负数、边界0x80000000),用模拟器验证结果相同。 - W8:增加优化报告:显示合并的对数、删除的冗余lui数、节省指令数。 - W9:集成到编译器后端(在代码生成后执行),添加--merge-constants开关。 - W10:处理特殊情况:addi使用的寄存器不是lui的目标(如lui x1; addi x2, x1),谨慎合并。 - W11:扩展支持跨基本块复用(简单版本)。 - W12:撰写文档,包含常量拆分与合并的数学原理。