跳转至

Passes

PyPTO 在 IR 之上运行的全部变换,编号与其在默认流水线中的位置一致。

pass 文档按编号组织,因此从头读到尾就是按执行顺序走完整条编译流水。0143 是流水线 pass;91 及以后保留给"在多个位置运行的 pass"以及"根本不是流水线 pass 的基础设施"。

框架

页面 内容
Pass、PassContext、PassPipeline 和 PassManager 带属性跟踪、插桩与策略化流水线的 pass 组织与执行框架

默认流水线

序号 Pass 作用
01 InlineFunctions FunctionType.Inline 函数体展开到每个调用点
02 UnrollLoops 在编译期展开 ForKind::Unroll 循环
03 CtrlFlowTransform break / continue 改写为结构化控制流
04 ConvertToSSA 转换为 SSA 形式,含变量重命名、phi 节点与 iter_args
05 Simplify 折叠算术表达式、shape 表达式与标量常量绑定
06 FlattenCallExpr 把嵌套调用表达式拍平为三地址形式
07 OutlineHierarchyScopes 把 Hierarchy 作用域外提为带 level / role 元数据的函数
08 OutlineIncoreScopes 把 InCore 作用域外提为独立函数
09 OutlineClusterScopes 把 Cluster 作用域外提为 Group 函数,独立 Spmd 作用域外提为 Spmd 函数
10 ConvertTensorToTileOps 在 InCore 函数中把 tensor 算子转为 tile 算子,并更新编排层调用点
11 OptimizeOrchTensors 消除编排层冗余分配并改善数据流
12 LowerCompositeOps 把复合 tile / 分布式算子分解为基础原语
13 FlattenTileNdTo2D 合并除最后一维外的所有维度,把 3D+ tile 操作拍平为 2D
14 LegalizeTileCast 把 ISA 无法单条指令完成的 tile.cast 展开为最短的原生 cast 链
15 AutoTileMatmulL0 依据后端 L0 容量选择 L0 tile 形状 (m, n, k) 并据此分块 matmul
16 CanonicalizeTileSlice tile.slice 下降为规范的 tile.extract 形式
17 InferTileMemorySpace 推断每个 tile 的片上 MemorySpace,并插入 tile.move 消解残留不匹配
18 ResolveBackendOpLayouts 修正逐元素算子所需的后端 tile layout
19 LowerAutoVectorSplit 把 AUTO pl.split 的混合 InCore 函数转换为显式 split_aiv 形式
20 ExpandMixedKernel 把混合 InCore 函数拆分为独立的 AIC(Cube)与 AIV(Vector)kernel
21 InjectGMPipeBuffer 为经 GM 路由的跨核 pipe 注入 __gm_pipe_buffer workspace(Ascend910B)
22 SplitVectorKernel 标记 split 属性并处理不拆分的双 AIV 路径
23 StampTfreeSplit 把每个跨核 tpop 的 split 与 pipe id 复制到与之配对的 tfree 上
24 NormalizeReturnOrder 把每个 InCore 函数的返回元组重排为规范顺序
25 SkewCrossCorePipeline 对混合 cube/vector 循环做软流水,使两个核重叠执行
26 LowerPipelineLoops pl.pipeline(N, stage=F) 的循环体复制 F 份以启用乒乓缓冲
27 CanonicalizeIOOrder 按 scalar → load → compute → store 阶梯重排流水循环体内的语句
28 MaterializeTensorStrides 为每个尚无 stride 的 tensor view 填入紧致规范 stride
29 InitMemRef 初始化 MemRef 并创建地址未分配的 alloc 操作
30 MaterializeSemanticAliases 强制语义要求同一分配的缓冲区真正共用一块(循环携带、原地更新)
31 MemoryReuse 基于生命周期分析复用缓冲区并删除冗余 alloc
32 AllocateMemoryAddr 为已有 alloc 操作分配真实地址
33 FoldNoOpReshape 折叠既不改变物理形状也不改变分配的 tile.reshape
34 FuseCreateAssembleToSlice tensor.create + tensor.assemble 融合为单个 tensor.slice 视图
35 DeriveCallDirections 先物化包装函数的 ParamDirection,再为每个调用逐实参推导 ArgDirection
36 AutoDeriveTaskDependencies 推导保守的任务间依赖边
37 ExpandManualPhaseFence 压缩 manual scope 中收益明确的全数组 TaskId 依赖
38 SynthesizeAllReduceSignals 把 host allreduce 的可选 signal 转为显式的内部 signal IR
39 MaterializeCommDomainScopes 在每个 host 编排函数体内装配 WindowBufferCommDomainScopeStmt 包装
40 LowerHostTensorCollectives 把 host 级 tensor 集合通信改写为内部 builtin chip 派发
41 MaterializeDistTensorCtx 为每个 DistributedTensor 物化显式的 CommCtx 参数与实参
42 MaterializeRuntimeScopes 插入 AUTO RuntimeScopeStmt 使编排 codegen 能 1:1 发射 PTO2_SCOPE
43 ClassifyIterArgCarry 把编排层 ForStmt 的每个 iter_arg 分类为平凡别名或需物化的重绑定携带

默认流水线之外

页面 内容
工具 Pass 在流水线多个位置运行的归一化与清理 pass
诊断系统 编译期警告与性能提示的统一咨询通道
IR 验证器 在 pass 之间校验 IR 正确性的可插拔属性验证器

共享材料

页面 内容
共享 Pass 工具函数 include/pypto/ir/transforms/utils/ 中的可复用工具
Loop-Carried Compiler Dependency 压缩 循环携带依赖边的压缩方式

另请参阅

  • IR —— 这些 pass 所变换的表示。
  • 后端 —— pass 如何在不对后端分支的前提下获得逐架构答案。
  • 代码生成 —— 流水线跑完之后运行的部分。