课题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:撰写文档,包含常量拆分与合并的数学原理。