Skip to content

Perf(opt):Loop-invariant code motion

Kiven requested to merge feat/loop-invariant-code-motion into main

概述

实现循环不变量外提(Loop-Invariant Code Motion, LICM)优化 pass。

将循环体内的不变量指令提升到循环前置块(preheader),减少重复计算。

实现细节

  • 构建循环树(自然循环识别,基于支配树 + 回边)
  • 安全性检查:纯指令(无副作用)且所有操作数均为循环不变量
  • 有 store 的循环中,load 仅在确认无别名 store 时才外提
  • 有函数调用的循环中,load 一律不外提
  • 外提后追加 CSE + DeadCodeDelete 清理冗余

性能结果

在 ARM64 原生容器上顺序跑3次,与 commit 12485ed 基线对比:

优化前 优化后(均值) 变化
总耗时(57个AC) 8.25 min 7.32 min -11.3%

主要收益:h-5(-37%)、crypto(-33%)、crc(-28%)、sort(-25%)、huffman(-22%)

详细数据见 test/loopInvariantCodeMotion.md

正确性

57/60 AC,3个 WA(h-8-01/02/03)为预存在 bug,与本 pass 无关。

Merge request reports