lzkk
10a59110eb
perf: 函数内联 + csneg 取模优化,crypto 1.76x→1.69x
...
- IR 保守内联:纯算术单 BB leaf 函数自底向上迭代内联
- MIR 取模优化:x%2^n 用 negs+and+and+csneg(6→4 指令)
- 添加 CondCode::MI/PL 支持 csneg 的 mi/pl 条件码
- 修正 NegRR 发射 negs(设标志位)供 csneg 使用
1 week ago
lzkk
2f1d7dc856
perf(ir): 保守函数内联——纯算术单BB leaf 函数自底向上迭代内联
...
只内联无副作用(无 Load/Store/GEP)的单基本块 leaf 函数。
InsertBefore 保持 BB 结构不变,支持级联收敛(_and→_xor→_or)。
已验证 140/140 功能测试通过,为后续 MIR 层优化铺路。
1 week ago
lzkk
5d43539290
chore: 代码彻底清理——删除死代码、旧备份、生成文件
...
删除:
- warning/ src.bak.full/ llvm/ docs/superpowers/ (95MB+ 磁盘释放)
- Inline.cpp (621行,从未正确集成)
- PassManagerModule 死类 + 3个未使用pass声明 (PassManager.h)
- RunStrengthReduction/RunLoopUnrolling/RunLoopFission (LoopInfo.cpp 805行)
- FindInductionVars/AllUsesInLoop/IsSRLoopInvariantValue 死辅助函数
- 生成文件: Error.txt results.csv/json time_opt.txt settings.json
更新 .gitignore 防止未来污染
1 week ago
lzkk
39e4dada13
perf(mir): 添加 Madd(乘加)指令——sum+a*b → madd sum,a,b,sum
...
限制:仅折合非常量乘数(常量有 shift 优化更优)。
SSA 单使用 Mul 被跳过,由 Add 处统一发射 Madd。
1 week ago
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基线更新。
1 week ago
lzkk
9095cbe0db
perf(ir): 启用 LICM + 迭代优化循环(ConstFold/ConstProp/CSE/DCE 收敛)
...
管线从 Mem2Reg+ConstFold+DCE+CFGSimplify 升级为:
Mem2Reg+LICM+(ConstFold+ConstProp+CFGSimplify+CSE+DCE)×10收敛
huffman -6.4%, crypto -5.6%, h-8 -11.7%, crc -7.6%
1 week ago
lzkk
ee3b42ac40
feat(opt): 切换至队友代码基线——100%功能正确
...
Chaitin-Briggs 图着色寄存器分配,K=16无需spill。
IRGen starttime/stoptime 修复(去掉 _sysy_ 前缀和 lineno 参数)。
此提交为后续优化工作的安全起点。
1 week 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)
2 weeks 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
2 weeks 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 例需调试溢出重写循环)
2 weeks ago
lzkk
28ad162de4
feat(mir): 线性扫描寄存器分配初始实现(WIP,--regalloc=linear 可用)
...
- Wimmer & Mössenböck (2005) 优化区间分割算法
- 685 行,支持 GP/FP 寄存器池
- 目前通过简单用例,循环函数有寄存器映射 bug(25_while_if 无限循环)
- 默认仍使用图着色,线性扫描可通过 CLI 切换
2 weeks ago
lzkk
6c5441ff43
feat(mir): 添加 MIR 验证器和寄存器分配验证器
...
- MIRVerifier: vreg 单定义(逐块)检查、块终止指令检查
- RegAllocVerifier: 物理寄存器有效性检查(范围 0-96)
- Debug 构建中每个 MIR pass 后自动运行(#ifndef NDEBUG)
2 weeks ago
lzkk
0b589c77da
feat(ir): 添加 IR 验证器,校验 SSA 支配性/终结指令/PHI 一致性
...
- 新建 IRVerifier pass:检查非 PHI 指令的 SSA 支配性、基本块终结指令、
PHI 操作数结构
- 提取 DominatorTree 类到独立头文件,供验证器复用
- User 新增 ClearOperands() 方法,用于重建操作数列表
- 修复 CFGSimplify 两处 PHI 清理遗漏:
1. 常量条件分支简化后,死目标的 PHI 未移除原前驱条目
2. 不可达块删除时,PHI 中部分不可达前驱条目未清理
- 验证器仅在 Debug 模式生效(#ifndef NDEBUG)
- 快门禁:functional 86/87 通过,h_functional 30/31 通过
(1 例预置超时/段错误,非本次引入)
2 weeks 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 条,零退化。
2 weeks 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 新增条目,基线自动更新
2 weeks ago
黄熙哲
06bada3ff5
Merge remote master into local master
2 weeks ago
安峻邑
cb33c344ac
启动循环优化
2 weeks ago
安峻邑
860e5edadf
实现循环优化:LICM、强度削弱、循环展开、循环分裂
2 weeks 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
3 weeks ago
zhm
7ab465d25b
Add missing PassManager.h and fix .gitignore to not ignore src/include/
4 weeks ago
zhm
e9adbe38c7
Fix undefined behavior: signed overflow, negative left shift, float-to-int overflow
4 weeks ago
zhm
8088eb74a2
Remove ANTLR runtime headers from include, add SysY generated files
4 weeks ago
zhm
8e4cbbfd87
移除src/include中的ANTLR重复头文件,使用/extlibs
4 weeks ago
zhm
e95a0f576f
”适配评测平台编译环境“
4 weeks ago
安峻邑
ab305cfdb1
Init
4 weeks ago
安峻邑
04371dd7fa
Init
4 weeks ago
安峻邑
b0afe34cf4
Init
4 weeks ago