LLVM 中端(Middle-End) 主要负责 IR 级优化和分析,核心组件包括 优化变换(Transforms)、分析框架(Analysis)、Pass 管理器(Pass Manager) 等。它以 LLVM IR(Static Single Assignment 形式)为基础,通过 标量优化、循环优化、向量化、跨过程优化 等技术提升代码质量。中端优化主要位于 lib/Transforms/lib/Analysis/ 目录,包含诸如 常量传播、死代码删除、循环展开、别名分析、控制流优化 等 Pass。LLVM 采用 Pass 管理器 组织和调度优化流水线,实现模块化和可扩展性,使其适用于不同架构的编译优化需求。
首先我会从最常用也是我自己最先接触的 Pass 开始。

Transforms

Scalar

LLVM lib/Transforms/Scalar/ 目录包含 标量优化(Scalar Transformations) 相关的 Pass,这些优化主要作用于单个基本块或函数级别的 IR,提高执行效率并减少冗余代码。

死代码与冗余消除

  • ADCE.cpp(Aggressive Dead Code Elimination)
  • BDCE.cpp(Bit-Tracking Dead Code Elimination)
  • DCE.cpp(==Dead Code Elimination==)
  • DeadStoreElimination.cpp(删除未使用的存储)
  • EarlyCSE.cpp(早期公共子表达式消除)
  • GVN.cpp(==全局值编号优化==)
  • GVNHoist.cpp(GVN 提升优化)
  • GVNSink.cpp(GVN 下沉优化)
  • MemCpyOptimizer.cpp(优化 memcpy/memmove
  • SCCP.cpp(稀疏条件常量传播)
  • NewGVN.cpp(新的 GVN 算法)

    循环优化

    这些 Pass 主要用于 循环优化,包括 循环展开、分裂、消除不必要计算:
  • LICM.cpp(==循环不变代码外提==)
  • IndVarSimplify.cpp(循环归纳变量优化)
  • LoopAccessAnalysisPrinter.cpp(循环访问分析打印)
  • LoopBoundSplit.cpp(循环边界拆分)
  • LoopDataPrefetch.cpp(循环数据预取)
  • LoopDeletion.cpp(删除无用循环)
  • LoopDistribute.cpp(循环分解)
  • LoopFlatten.cpp(循环扁平化)
  • LoopFuse.cpp(循环合并)
  • LoopIdiomRecognize.cpp(循环惯用优化识别)
  • LoopInstSimplify.cpp(循环指令简化)
  • LoopInterchange.cpp(循环置换优化)
  • LoopLoadElimination.cpp(消除不必要的循环加载)
  • `LoopPassManager.cpp`(循环 Pass 管理器)
  • LoopPredication.cpp(循环谓词优化)
  • LoopRotation.cpp(循环旋转优化)
  • LoopSimplifyCFG.cpp(循环 CFG 简化)
  • LoopSink.cpp(循环代码下沉)
  • LoopStrengthReduce.cpp(循环强度削弱)
  • LoopTermFold.cpp(循环终止折叠)
  • LoopUnrollPass.cpp(==循环展开==)
  • LoopUnrollAndJamPass.cpp(循环展开并融合)
  • LoopVersioningLICM.cpp(循环版本化 + LICM)

    控制流优化

    这些 Pass 主要用于 优化控制流(CFG),减少不必要的跳转:
  • FlattenCFGPass.cpp(扁平化控制流图)
  • JumpTableToSwitch.cpp(将跳转表转换为 switch 语句)
  • JumpThreading.cpp(跳转优化,减少不必要分支)
  • SimplifyCFGPass.cpp(==简化控制流图==)
  • StructurizeCFG.cpp(控制流结构化优化)
  • TailRecursionElimination.cpp(尾递归消除)

    代码转换 & 标量替换

    这些 Pass 主要用于 变量提升、指令替换、标量化:
  • Mem2Reg.cpp(内存变量提升到寄存器)
  • Reg2Mem.cpp(寄存器变量转换回内存)
  • SROA.cpp(结构化对象分析)
  • Scalarizer.cpp(标量化)
  • ScalarizeMaskedMemIntrin.cpp(标量化 Masked 内存指令)

    代码猜测 & 推测执行

    这些 Pass 主要用于 预测分支、推测执行、消除不必要的检查:
  • ConstraintElimination.cpp(约束消除)
  • CorrelatedValuePropagation.cpp(相关值传播)
  • DivRemPairs.cpp(优化除法/取余对)
  • Float2Int.cpp(浮点转整数优化)
  • InferAddressSpaces.cpp(推测地址空间)
  • InferAlignment.cpp(推测对齐方式)
  • InstSimplifyPass.cpp(==指令简化==)
  • MakeGuardsExplicit.cpp(显式化 Guard 语句)
  • NaryReassociate.cpp(N 元重关联优化)
  • Reassociate.cpp(==表达式重关联==)
  • SpeculativeExecution.cpp(推测执行优化)

    安全性 & 运行时优化

    这些 Pass 主要用于 运行时安全 & GC 相关优化:
  • LowerGuardIntrinsic.cpp(降低 Guard 指令)
  • LowerExpectIntrinsic.cpp(降低 __builtin_expect 指令)
  • LowerConstantIntrinsics.cpp(降低常量内置函数)
  • LowerAtomicPass.cpp(降低原子操作)
  • LowerMatrixIntrinsics.cpp(降低矩阵指令)
  • LowerWidenableCondition.cpp(降低可扩展条件)
  • PlaceSafepoints.cpp(安全点插入)
  • RewriteStatepointsForGC.cpp(GC 相关优化)
  • SeparateConstOffsetFromGEP.cpp(GEP 指针偏移优化)

    代码移动 & 其他优化

  • MergedLoadStoreMotion.cpp(合并 Load/Store 语句)
  • MergeICmps.cpp(合并整数比较指令)
  • Sink.cpp(==代码下沉==)
  • StraightLineStrengthReduce.cpp(直线代码强度削弱)
  • WarnMissedTransforms.cpp(提示未进行的优化)

    IPO

    LLVM lib/Transforms/IPO/ 目录包含 跨过程优化(Interprocedural Optimizations, IPO) 相关的 Pass,主要用于 跨函数、跨模块优化,提升整个程序的优化效果。可以将这些 Pass 归类如下:

    内联优化

    这些 Pass 主要用于 函数内联,减少函数调用开销:
  • AlwaysInliner.cpp(强制内联特定函数,如 always_inline 标记的函数)
  • Inliner.cpp(标准内联优化)
  • ModuleInliner.cpp(模块级内联)
  • FunctionImport.cpp(跨模块函数导入,用于 ThinLTO)
  • PartialInlining.cpp(部分内联优化)

    全程序优化

    这些 Pass 主要用于 全程序范围的优化,如 去除无用代码:
  • GlobalDCE.cpp(全局死代码消除)
  • GlobalOpt.cpp(全局变量优化)
  • GlobalSplit.cpp(全局变量拆分优化)
  • ElimAvailExtern.cpp(去除无用的 extern 声明)
  • WholeProgramDevirt.cpp(全程序虚函数去虚拟化)
  • IPO.cpp(IPO 入口 Pass)

    函数级优化

    这些 Pass 主要用于 优化函数的调用方式、属性和结构:
  • FunctionAttrs.cpp(函数属性推导)
  • ForceFunctionAttrs.cpp(强制应用函数属性)
  • InferFunctionAttrs.cpp(推导缺失的函数属性)
  • FunctionSpecialization.cpp(函数特化)
  • ArgumentPromotion.cpp(函数参数提升)
  • DeadArgumentElimination.cpp(死参数消除)
  • CalledValuePropagation.cpp(调用值传播优化)
  • SCCP.cpp(稀疏条件常量传播,用于跨函数优化)

    代码裁剪 & 符号优化(Code Stripping & Symbol Optimization)

    这些 Pass 主要用于 减少无用的符号、元数据、原型:
  • StripSymbols.cpp(移除符号)
  • StripDeadPrototypes.cpp(移除未使用的函数原型)
  • Annotation2Metadata.cpp(将注解转换为元数据)

    代码合并 & 结构优化(Code Merging & Structure Optimization)

    这些 Pass 主要用于 合并相似代码,减少冗余:
  • MergeFunctions.cpp(合并相同或相似函数)
  • IROutliner.cpp(IR 代码模式提取优化)

    并行 & 线程优化(Parallel & Thread Optimizations)

    这些 Pass 主要用于 优化 OpenMP 及并行代码:
  • OpenMPOpt.cpp(OpenMP 代码优化)
  • BarrierNoopPass.cpp(OpenMP 屏障优化)

    控制流优化(Control Flow Optimizations)

    这些 Pass 主要用于 控制流的简化和改进:
  • HotColdSplitting.cpp(冷热代码拆分)
  • BlockExtractor.cpp(提取基本块)
  • LoopExtractor.cpp(提取循环到独立函数)

    类型、检查与安全性优化(Type, Check & Security Optimizations)

    这些 Pass 主要用于 类型测试、内存安全及跨模块安全优化:
  • LowerTypeTests.cpp(优化类型检查)
  • MemProfContextDisambiguation.cpp(基于内存分析的优化)
  • CrossDSOCFI.cpp(跨动态库的控制流完整性优化)

    采样分析 & 反馈优化(Profile-Guided & Sample-Based Optimizations)

    这些 Pass 主要用于 基于采样分析的优化:
  • SampleProfile.cpp(采样分析)
  • SampleProfileMatcher.cpp(采样匹配优化)
  • SampleProfileProbe.cpp(插入采样探针)
  • SampleContextTracker.cpp(采样上下文追踪)

    代码嵌入 & Bitcode 相关(Bitcode Embedding & LTO)

    这些 Pass 主要用于 代码嵌入和 LTO(Link-Time Optimization):
  • EmbedBitcodePass.cpp(嵌入 Bitcode)
  • ThinLTOBitcodeWriter.cpp(ThinLTO Bitcode 写入)

    Vectorize

    LLVM lib/Transforms/Vectorize/ 目录主要包含 矢量化(Vectorization)优化 Pass,用于将 标量代码转换为 SIMD 矢量代码,以提高指令级并行性。可以将这些 Pass 归类如下:

    循环矢量化(Loop Vectorization)

    这些 Pass 主要用于 对循环进行矢量化,使其能够利用 SIMD 指令:
  • LoopVectorize.cpp(==循环矢量化核心 Pass==)
  • LoopIdiomVectorize.cpp(循环惯用优化矢量化)
  • LoopVectorizationLegality.cpp(循环矢量化合法性检查)
  • LoopVectorizationPlanner.h(循环矢量化规划)

    语句级矢量化(SLP Vectorization)

    这些 Pass 主要用于 合并独立语句,形成 SIMD 操作:
  • SLPVectorizer.cpp(Superword Level Parallelism 矢量化)
  • VectorCombine.cpp(矢量化合并优化)
  • Vectorize.cpp(矢量化 Pass 入口)

    VPlan 矢量化框架(VPlan - Vectorization Planning)

    LLVM 使用 VPlan 框架来管理矢量化策略,以下文件负责 VPlan 构建、分析、优化:
  • VPlan.cpp(VPlan 主要逻辑)
  • VPlan.h(VPlan 头文件)
  • VPlanAnalysis.cpp(VPlan 分析)
  • VPlanDominatorTree.h(VPlan 支配树)
  • VPlanHCFGBuilder.cpp(VPlan 层次控制流图构建)
  • VPlanRecipes.cpp(VPlan 矢量化转换规则)
  • VPlanSLP.cpp(VPlan 结合 SLP 矢量化)
  • VPlanTransforms.cpp(VPlan 变换优化)
  • VPlanVerifier.cpp(VPlan 验证)
  • VPlanUnroll.cpp(VPlan 循环展开)
  • VPlanUtils.cpp(VPlan 辅助工具)

    Sandbox 矢量化器

    SandboxVectorizer/ 目录包含一个实验性矢量化器,尝试更高级的矢量化技术:
  • SandboxVectorizer.cpp(Sandbox 矢量化核心逻辑)
  • SandboxVectorizerPassBuilder.cpp(Pass 生成器)
  • Legality.cpp(矢量化合法性分析)
  • Scheduler.cpp(矢量化调度)
  • DependencyGraph.cpp(依赖图构建)
  • Interval.cpp(区间分析)
  • SeedCollector.cpp(种子收集器)
  • Passes/(存放其他辅助 Pass)