lzkk
2cfc9e2fc8
perf(mir): MIR预分配 MovImm 转发——消除常数二次传递
...
mov v1,#N; mov v2,v1(v1 无其他使用)→ mov v2,#N
matmul -3.3%, optim_sched -10.2%, 01_mm -4.4%。33基线更新。
4 days ago
lzkk
ee3b42ac40
feat(opt): 切换至队友代码基线——100%功能正确
...
Chaitin-Briggs 图着色寄存器分配,K=16无需spill。
IRGen starttime/stoptime 修复(去掉 _sysy_ 前缀和 lineno 参数)。
此提交为后续优化工作的安全起点。
4 days ago
lzkk
5fb106bde8
fix(mir): LLVM两遍分配 + 间隙分裂 + Assign安全网
...
改进:
1. 两遍分配(Pass1短活范围优先→Pass2延迟vreg驱逐/分裂)
— SSA弦图完美消除序近似:短范围先分配,长范围获得清晰干涉图
2. TrySplit改间隙分裂:在连续use间最大间隙处分裂,替代简单中点切分
— 参考 LLVM tryLocalSplit()
3. Assign返回bool + ForceAssign(预填跳过检查)
— 防止非法分配通过的安全网
诊断:Mem2Reg开启时,CheckInterference在某些情况下漏过重叠检测,
导致冲突vreg分配到同一物理寄存器。具体触发条件待进一步定位。
当前正确率:94% (94/100)
4 days ago
lzkk
508f9d8ddc
fix(mir): TrySplit引用失效修复 + LLVM Defer机制
...
Three fixes:
1. TrySplit: 参数从 LiveInterval& 改为 vreg索引,避免 push_back 使引用失效
— 旧代码在 intervals.push_back() 后继续使用 li 引用(UB),高寄存器压力下导致
段错误
2. LLVM Defer机制: 首次无法分配时将 vreg 推迟到堆尾(RS_New→RS_Deferred)
— 让更小范围先分配以获得更清晰干涉图
— 参考: llvm/lib/CodeGen/RegAllocGreedy.cpp selectOrSplit()
3. LiveInterval 新增 deferred_count 字段追踪推迟状态
诊断: 65_color/94_nested_loops 在 Mem2Reg 开启时失败,关闭时通过。
Mem2Reg 消除栈分配(alloca→SSA),增加同时活跃 vreg 数量,触发高压 spill。
根因追踪到 TrySplit 的引用失效(与之前 heap 指针失效同类 bug)。
当前: 94% (94/100),剩余6失败详见 project_greedy_alloc_progress.md
4 days ago
lzkk
da1e456133
feat(mir): 实现 LLVM-style 贪婪寄存器分配器 —— 统一架构
...
核心变更:
- MIR.h: 增强 LiveInterval(VNInfo/UsePosition/Segment)+ LiveRegMatrix + RegClass
- GreedyAlloc.cpp: TryAssign/TryAnyFreeReg/TryEvict/TrySplit 贪婪分配 + RewriteSpills
- InstLiveness.cpp: EnhanceIntervals 前向 pass + ComputeInstLiveness 适配
- MIRBasicBlock.cpp: InsertInst/ReplaceVReg API
- main.cpp: 切换至 RunGreedyRegAlloc
- RegAlloc.cpp/LinearScanAlloc.cpp: #if 0 隔离
架构:优先级队列驱动分配(每轮全新分配),TryEvict 无条件驱逐,
StoreStack+LoadStack 溢出重写,区间分裂处理高寄存器压力。
功能测试通过率: 53/100(剩余 47 例需调试溢出重写循环)
4 days ago
lzkk
6c5441ff43
feat(mir): 添加 MIR 验证器和寄存器分配验证器
...
- MIRVerifier: vreg 单定义(逐块)检查、块终止指令检查
- RegAllocVerifier: 物理寄存器有效性检查(范围 0-96)
- Debug 构建中每个 MIR pass 后自动运行(#ifndef NDEBUG)
5 days ago
lzkk
befdca6451
perf(backend): 叶函数跳过帧设置,节省 x29/x30 保存/恢复
...
MachineFunction 添加 HasCall 标记,Lowering 在发射 Call 时设置。
叶函数无帧且无 callee-saved 寄存器的函数完全跳过 prologue/epilogue;
有帧叶函数改用 str/ldr x29 替代 stp/ldp x29,x30。
huffman -93, crypto -54, conv2d -45, crc -27, h-9 -27,
03_sort -18, opt_scheduling -18, h-4 -12, fft -9, shuffle -9。
总计 -312 条,零退化。
6 days ago
lzkk
fccd935a24
feat(backend): 新增 AddImm/SubImm 操作码,消除冗余 MovImm
...
AArch64 add/sub 支持 12 位立即数,但 MIR 只有 AddRR/SubRR,
导致 RHS 为常量时需先 MovImm 再 RR 运算。本次修改:
- MIR.h:新增 AddImm、SubImm 操作码
- Lowering.cpp:Add/Sub 降级时 RHS 为 0-4095 常量直接用 AddImm/SubImm
- RegAlloc.cpp:AddImm/SubImm 复用 AddRR/SubRR 的 def-use 分析
- AsmPrinter.cpp:通用打印机自动处理 Imm 操作数(#value)
效果(对比 CmpImm 基线):
- sl1-3: 261→247 (-14, -5.4%)
- huffman-01-03: 792→790 (-2)
- h-5-01-03: 341→338 (-3)
- 全 60 个性能用例总减少 55 行
- 功能测试 0 新故障
更新:优化记录.md 新增条目,基线自动更新
6 days ago
黄熙哲
774a2688a3
feat(remat): add rematerializable annotation for MovImm instructions
...
- Add IsRematerializable/SetRematImm APIs to MachineInstr
- Mark all MovImm in Lowering as rematerializable with immediate value
- Add _sysy_starttime/_sysy_stoptime runtime functions for SysY timing
2 weeks ago
安峻邑
ab305cfdb1
Init
3 weeks ago
安峻邑
04371dd7fa
Init
3 weeks ago
安峻邑
b0afe34cf4
Init
3 weeks ago