逸翎清晗🌈
Useful Linux Commands & Tools
实用linux命令大全(周更)
💐
title: 后端Pass简介——IntrinsicLowering categories: 编译器 LLVM tags: LLVM Backend date: 2025-07-11 07:28:28 cover: description: swiper_index: IntrinsicLowering 这个 IntrinsicLowering 不是一个典型的优化 Pass,而是在 LLVM 后端生成机器指令前,对 IR 中各种内建(intrinsic)函数调用做“降级”处理——要么展开成一段等价的 LLVM IR 序列,要么替换成对外部库函数(如 memcpy、sqrtf)的调用。 所以这个 pass 基本是一个模式匹配的过程(500 行) 下面对 IntrinsicLowering::LowerIntrinsicCall 中处理到的每一种 LLVM Intrinsic,按出现顺序逐一说明它们最终是如何“降级”或替换的: 1. 分支预测相关 llvm.expect、llvm.expect_with_probability 直接将 __builtin_expect(exp, c ...
Language Models for Code Optimization: Survey, Challenges and Future Directions
【综述解析·V】Language Models for Code Optimization: Survey, Challenges and Future Directions (推荐) 个人领域内强相关的综述(LMs,ML,Code Optimization,Compiler Optimization,Systems),链接🔗 元信息: 来源:Arxiv2025.01 的论文,感觉目标投稿为 CSUR,看样子已经投稿完毕了,但是 CSUR 审稿期很长,所以暂时还未到正刊。 作者:利兹大学 & TurinTech AI 利兹大学教授 Wang Zheng(王峥)算是领域内比较有名的人物之一了,至少在 AI for Compiler 和其他领域上从事十余年之久,他的很多论文和合著论文都是在领域内具有广泛影响力的,比较著名的就是一篇发在 CCF-A(Proceedings of the IEEE)的特邀论文 Machine Learning in Compiler Optimisation,他的合作单位广泛,Meta AI、爱丁堡大学较为出众,也和计算所编译的大团队有论文交 ...
后端Pass简介——MachineLateInstrsCleanup
MachineLateInstrsCleanup 该 Pass 用于在机器代码阶段删除完全相同的延迟(late)指令,特别是移除由重计算(rematerialization)或框架索引消除后产生的冗余立即数或地址加载指令,从而精简最终生成的机器指令。 “完全相同的延迟指令”:“延迟指令” 指的是这些指令不是在最初阶段生成的,而是在寄存器分配之后或 FrameIndex 消解阶段才生成的“后期指令(late instructions)” Rematerialization(重构/重建/重计算)是 LLVM 在 寄存器分配时的一种策略,“与其从栈中 reload 某个值,不如干脆重新 计算/加载 这个值”。目的是: 避免使用太多物理寄存器; 减少 spill & reload(存回 + 加载); 利用立即数或简单可重构值的 cheap cost。 举个例子,假设在两个基本块中都有同一地址计算指令: # 基本块 A t0 = LEA addr(base, offset) ... # 基本块 B(与 A 共享出口) t1 = LEA addr(base, offset) . ...
每日Pass简介——MachineInstrBundle
MachineInstrBundle 这是一个工具类 Pass,它主要处理 Machine Instruction Bundles(机器指令捆绑) 的构造、解析与分析。换句话说,它负责在 LLVM 后端的代码生成阶段,对一系列底层机器指令进行组合、打包与拆包,从而支持目标平台(尤其是 VLIW、压缩指令等架构)对“指令包(bundle)”的要求。 该 Pass 涉及一些 VLIW 相关的概念: 概念 说明 Instruction Bundling 某些架构(如 VLIW、Itanium)要求将多个指令打包为一个单元调度或发射,称为指令捆绑 Dead/Kill/Undef Flags 注册使用的生命周期属性分析,用于设置寄存器是否已失效或终止使用等优化标记 Subregisters / Lane Masks 对支持 SIMD/SVE 等子寄存器体系结构,lane mask 用于追踪特定位宽的寄存器使用 支持 VLIW 架构的处理器如 Hexagon/Itanium/AArch64 都会触发这个 Pass: LLVM 后端生成的指令流中,若某些指令被标记为 I ...
SOTA and Challenges of Engineering ML-Enabled Software Systems in the Deep Learning Era
【综述解析·IV】SOTA and Challenges of Engineering ML-Enabled Software Systems in the Deep Learning Era (不推荐) 元信息: 领域:机器学习驱动的软件系统(ML-enabled systems),软件工程 作者单位:挪威克里斯蒂安尼亚应用科技大学(Kristiania University of Applied Sciences) 日期:CSUR2025 TL;DR:本综述聚焦在传统软件工程方法如何适配并改进机器学习系统开发的全过程,强调跨学科挑战与未来研究方向。(不是强调的是应用,所以该综述是更加抽象层次告诉读者如何开发 MLSys 并说明现存问题) 首先不得不说,我被标题骗进去了,我眼睛自动捕捉了 SOTA ML Systems,于是以为讲的是 MLSys 的前沿进展;现在看来好像是讲的软件工程的 ML 系统,此系统非彼系统(所以标记了“不推荐”)🤔不管了,这篇先摆上来,总之还是提供了一个软件工程的视角来看 MLSystems 的应用,我个人在软工涉猎不多,顶多对 APR 稍微了解,但 ...
每日Pass简介——MachineFunctionSplitter
MachineFunctionSplitter MachineFunctionSplitter 是 LLVM 中的一个机器函数拆分(Machine Function Splitting)优化通道,根据配置的阈值和运行时/采样的性能分析数据,将冷(rarely executed)的基本块拆分到独立的冷代码段,以提升指令缓存和 TLB 利用率。 该 Pass 主要涉及函数拆分的理由,即为什么要拆分: ProfileSummaryInfo (PSI) 和 MachineBlockFrequencyInfo (MBFI):分别提供函数/基本块的概要分析数据和具体的执行频率,用于判断哪些基本块是“冷”的。 BasicBlockSections:LLVM 支持将基本块分组到不同的节(section),本 Pass 会将冷块标记为特定的冷节(如 .text.unlikely.*)。 阈值判断:基于百分位数(PercentileCutoff)或最低执行次数(ColdCountThreshold)来决定冷块;不同的 Profile 类型(Instrumentation vs. Sample)有不同的冷 ...
Optimization Techniques for GPU Programming(2)
【综述解析·III】Optimization Techniques for GPU Programming (推荐)(下) 本文是一篇 CSUR 长文,80 页,≈450 文献整理而成。作者来自阿姆斯特丹自由大学,QS209. 本文接续上一部分(正文+附录),这篇为附录部分。值得一提的是,附录也写的非常全面且很精彩。 Appendix A:不光解释了一些概念,还从实践而非理论的角度教读者如何进行操作,还有正文放不下的那些优化,这里都进一步进行了讲解。 Appendix B:告诉读者本综述筛选的视角和办法。(值得学习) Appendix C:讲述了关于近些年 GPU 的发展和他们的论文数量,这个内容不多。 Appendix D:权衡因素,基本也能辅助读者快速入门 GPU 的性能考量了。 附录A:优化手段 本附录汇集了文献中提取的优化技术。为了便于参考与深入了解,这些优化技术按照第6节中的主题进行归类与组织,形成了系统化的参考资料。以下是所涵盖优化方法的概览: A.1 内存访问 A.1.1 片上内存 —— 使用专用内存 对于大多数应用而言,GPU 通常具备比其内存系统更强的计算资源。 ...
LLVM常用接口与API
LLVM常用数据结构与API 前言 LLVM 作为现代编译器基础设施的代表,其模块化设计和强大的中间表示(LLVM IR)使其在编译优化、程序分析、语言实现、JIT 运行时等多个领域广泛应用。然而,想要高效地在 LLVM 上构建工具或开发新功能,必须深入理解其内部的数据结构与接口体系。 本笔记旨在为 LLVM 的使用者,尤其是希望在 C++ 层面编写 Pass、分析器或后端工具的开发者,提供一份实用的接口速查与设计参考。相比于官方文档的厚重和散乱,这里更注重常用 API 的结构化梳理、配套示例的直观呈现,以及开发过程中易踩的坑与实践建议。 Support 层 容器 LLVM 容器 分类 STL 类比 Small 版本 优化 关键特性 / 适用场景 典型复杂度* 头文件 SmallVector<T,N> 顺序 std::vector ✅ 栈上预留 N 元素,溢出再堆分配;最常用 IR 构造容器 push O(1) 均摊 SmallVector.h TinyPtrVector 顺序 std::vector<T*> 部分 0/1 个元素时放指针本身, ...
后端Pass简介——MachineFrameInfo
MachineFrameInfo 这是属于 CodeGen 的一个子文件,暂且把他认定为 Pass。他实现的是“栈帧布局和栈内对象管理相关的核心模块”。是 LLVM 用于管理函数栈帧中所有栈上对象(如局部变量、Spill槽、调用帧等)的位置、对齐和属性的模块,并辅助生成正确的栈布局与栈帧大小。 概念 简要说明 栈帧(Stack Frame) 每个函数调用分配的一块栈内存,用于保存局部变量、返回地址、保存的寄存器等 对齐(Alignment) 指定内存对象在栈上的对齐要求,通常是 4/8/16 字节 Spill Slot 当寄存器不够用时,变量会被“溢出”到栈上,称为 Spill 可变大小对象 如 alloca 分配的大小运行时决定的数组 固定栈对象(Fixed Object) 位于栈帧固定位置的对象,如返回地址、保存寄存器 StackRealignable 当前目标是否允许动态栈对齐 Call Frame Size 为函数调用参数保留的栈空间 Frame Pointer / Stack Pointer 栈帧地址计算常用寄存器,影响对象定位 ...
后端Pass简介——MachineDebugify
MachineDebugify DebugifyMachineModule 是一个用于给每个 MachineFunction 附加合成调试信息的 LLVM 模块级 Pass,用于测试 debug info 在后续 CodeGen 中的保留情况。 其中: DISubprogram / DILocalVariable / DILocation:LLVM 的调试信息元数据,描述函数、局部变量、源代码行号等信息。 DBG_VALUE 指令:MachineInstr 中用于传达变量值与调试变量之间关系的指令。 DIBuilder:LLVM 的调试信息生成工具类。
后端Pass简介——MachineCycleAnalysis
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 会分析: 循环的存在与边界 是否存在循环(Cycles) 每个循环的入口块(Header) 每个循环中包含哪些 MachineBasicBlock(基本块) 循环嵌套关系 哪些循环是内层(子循环) 哪些是外层(父循环 ...
avatar
💦非常忙碌!
逸翎清晗🌈
Talk is cheap, show me the code.💎
GitHub
公告栏
--- 主域名 ---
www.yangzi.world | yangzi.world
推荐实用资料工具目录
yangzi.world/pages/opensources.html
--- 旅游分享 ---
🍧yangzi.world/iternery/index.html
--- 安卓APP ---
🍧点此下载🍧

最新文章
公开数据
文章数目 :
222
本站总字数 :
46.4w
本站访客数 :
本站总访问量 :
最后更新时间 :
空降评论复制本文地址
随便逛逛昼夜切换关于博客美化设置切换全屏打印页面