MachineCycleAnalysis

MachineCycleAnalysis 是一个只读分析 Pass,用于识别并记录 MachineFunction 中的循环结构,以支持后续的优化分析。
Pass 比较简单,直接举个例子:

entry:
  br label %loop

loop:
  %i = phi [0, %entry], [%inc, %loop]
  %inc = add %i, 1
  cmp %inc, 10
  br lt %inc, 10, label %loop, label %exit

exit:
  ret

该 Pass 会识别 %loop 为一个循环头,loop 基本块属于一个循环结构,生成 MachineCycle 对象表示这个循环。
可通过 llc -print-machine-cycles 查看分析结果。
该 Pass 会分析:

  1. 循环的存在与边界
    • 是否存在循环(Cycles)
    • 每个循环的入口块(Header)
    • 每个循环中包含哪些 MachineBasicBlock(基本块)
  2. 循环嵌套关系
    • 哪些循环是内层(子循环)
    • 哪些是外层(父循环)
  3. 循环头部是否为入口块
    • 是否为循环的 “自然头”(即所有入口都从后边跳转回来)
  4. 循环是否包含退出块
    • 是否存在跳出循环的路径(循环出口)
  5. 是否是自然循环(Natural Loop)
    • 通过分析后边缘回跳的路径(Backedge)确定

打印类似:

Cycle at header: %bb.1
  Members:
    - %bb.1
    - %bb.2