深入理解LLVM:代码生成
全新正版 极速发货
¥
82.2
7.5折
¥
109
全新
库存2件
作者彭成寒 李灵 戴贤泽 王志磊 俞佳嘉
出版社机械工业
ISBN9787111764151
出版时间2024-09
装帧平装
开本其他
定价109元
货号32207487
上书时间2024-11-05
商品详情
- 品相描述:全新
- 商品描述
-
作者简介
彭成寒:AI编译器与虚拟机技术专家,目前主要专注于LLVM、MLIR相关的AI编译器研究,并在JVM、V8和WebAssembly等虚拟机技术方面有着丰富的研发经验。他深耕IT领域近20年,曾涉足应用软件和大数据开发等多个领域,并著有《JVMG1源码分析和调优》《新一代垃圾回收器ZGC设计与实现》《深入探索JVM垃圾回收:ARM服务器垃圾回收的挑战和优化》等重要领域专著。
目录
目 录 Contents<br />前言<br />第一部分 基础知识<br />第1章 绪论2<br />1.1 LLVM设计思路分析3<br />1.2 LLVM主要子项目4<br />1.3 LLVM构建与调试5<br />1.4 LLVM在线工具7<br />1.5 本章小结9<br />第2章 IR基础知识10<br />2.1 IR分类11<br />2.1.1 树IR11<br />2.1.2 线性IR11<br />2.1.3 图IR12<br />2.2 CFG的基本块与构建14<br />2.2.1 基本块14<br />2.2.2 构建CFG15<br />2.3 静态单赋值15<br />2.3.1 基本概念16<br />2.3.2 SSA构造19<br />2.3.3 SSA析构19<br />2.3.4 SSA分类28<br />2.3.5 基本块参数和Phi节点29<br />2.4 本章小结30<br />第3章 数据流分析基础知识31<br />3.1 半格、格与不动点31<br />3.1.1 半格和偏序集31<br />3.1.2 格33<br />3.1.3 不动点34<br />3.2 数据流分析原理及描述35<br />3.2.1 数据流方程形式化描述36<br />3.2.2 数据流分析的理论描述40<br />3.3 数据流方程示例43<br />3.3.1 活跃变量43<br />3.3.2 到达定值45<br />3.3.3 常量传播46<br />3.4 扩展阅读:数据流的遍历性能<br /> 分析49<br />3.5 本章小结50<br />第4章 支配分析51<br />4.1 支配和逆支配51<br />4.1.1 支配和逆支配相关定义51<br />4.1.2 支配和逆支配含义解析53<br />4.2 支配树和支配边界的实现55<br />4.2.1 半支配节点及相关概念56<br />4.2.2 LT算法和Semi-NCA的<br /> 差异57<br />4.2.3 支配边界的实现58<br />4.3 扩展阅读:支配树相关小课堂58<br />4.3.1 支配树构造算法及比较59<br />4.3.2 如何快速判断任意两个节点的<br /> 支配关系60<br />4.4 本章小结62<br />第5章 循环基本知识63<br />5.1 自然循环64<br />5.2 LLVM的循环实现65<br />5.2.1 循环识别66<br />5.2.2 循环规范化67<br />5.3 本章小结71<br />第6章 TableGen介绍72<br />6.1 目标描述语言72<br />6.1.1 词法72<br />6.1.2 语法74<br />6.2 TableGen工具链77<br />6.2.1 从TD定义到记录78<br />6.2.2 从记录到C++代码81<br />6.3 扩展阅读:如何在TD文件中<br /> 定义匹配83<br />6.3.1 隐式定义匹配模板83<br />6.3.2 复杂匹配模板84<br />6.3.3 匹配规则支撑类86<br />6.4 本章小结86<br />第二部分 代码生成<br />第7章 指令选择91<br />7.1 指令选择的处理流程92<br />7.2 SelectionDAGISel算法分析94<br />7.2.1 SDNode分类96<br />7.2.2 LLVM IR到SDNode的转换98<br />7.2.3 SDNode合法化108<br />7.2.4 机器指令选择117<br />7.2.5 从DAG输出MIR123<br />7.3 快速指令选择算法分析126<br />7.4 全局指令选择算法原理与实现128<br />7.4.1 全局指令选择的阶段128<br />7.4.2 GMIR生成129<br />7.4.3 指令合法化133<br />7.4.4 寄存器类型选择137<br />7.4.5 机器指令选择141<br />7.4.6 合并优化143<br />7.5 本章小结146<br />第8章 指令调度147<br />8.1 LLVM指令调度149<br />8.1.1 指令调度算法150<br />8.1.2 拓扑排序算法151<br />8.2 Linearize调度器152<br />8.2.1 构造依赖图153<br />8.2.2 对依赖图进行调度153<br />8.3 Fast调度器156<br />8.3.1 Fast调度器实现157<br />8.3.2 物理寄存器依赖场景的处理158<br />8.3.3 示例分析162<br />8.4 BURR List调度器166<br />8.4.1 影响指令调度的关键因素166<br />8.4.2 指令优先级计算方法168<br />8.4.3 示例分析170<br />8.5 Source List调度器173<br />8.6 Hybrid List调度器174<br />8.7 Pre-RA-MISched调度器174<br />8.7.1 Pre-RA-MISched调度器实现174<br />8.7.2 调度区域的划分175<br />8.7.3 影响Pre-RA-MISched调度器<br /> 的关键因素175<br />8.7.4 MIR指令时延的计算175<br />8.7.5 寄存器压力的计算177<br />8.7.6 示例分析181<br />8.8 Post-RA-TDList调度器186<br />8.8.1 Post-RA-TDList调度器实现186<br />8.8.2 示例分析186<br />8.9 Post-RA-MISched调度器189<br />8.10 循环调度190<br />8.10.1 循环调度算法实现190<br />8.10.2 示例分析194<br />8.11 扩展阅读:调度算法的影响<br /> 因素200<br />8.12 本章小结203<br />第9章 基于SSA形式的编译优化204<br />9.1 前期尾代码重复205<br />9.1.1 尾代码重复原理205<br />9.1.2 尾代码收益判断207<br />9.1.3 执行尾代码重复优化209<br />9.2 Phi优化212<br />9.3 栈着色213<br />9.4 栈槽分配217<br />9.5 死指令消除218<br />9.6 IPL优化之If-Conversion219<br />9.7 循环不变量外提224<br />9.8 公共子表达式消除224<br />9.9 代码下沉227<br />9.10 窥孔优化228<br />9.11 本章小结231<br />第10章 寄存器分配232<br />10.1 寄存器分配流程解析233<br />10.1.1 Fast算法执行流程233<br />10.1.2 Basic算法执行流程233<br />10.2 寄存器分配涉及的Pass241<br />10.2.1 死亡和未定义子寄存器检测241<br />10.2.2 隐式定义指令处理243<br />10.2.3 不可达MBB消除243<br />10.2.4 活跃变量分析244<br />10.2.5 Phi消除246<br />10.2.6 二地址指令变换249<br />10.2.7 指令编号255<br />10.2.8 变量活跃区间分析256<br />10.2.9 寄存器合并256<br />10.2.10 MBB的频率分析259<br />10.2.11 寄存器分配:直接分配与<br /> 间接分配265<br />10.2.12 将虚拟寄存器映射到物理<br /> 寄存器266<br />10.2.13 栈槽着色266<br />10.2.14 复制传播267<br />10.2.15 循环不变量外提269<br />10.3 Fast算法实现269<br />10.3.1 Fast算法实现思路269<br />10.3.2 示例分析270<br />10.4 Basic算法实现276<br />10.4.1 算法实现思路276<br />10.4.2 示例分析277<br />10.5 Greedy算法实现289<br />10.5.1 Greedy算法实现思路290<br />10.5.2 算法实现的核心:拆分291<br />10.5.3 区域拆分之Hopfield网络<br /> 详解293<br />10.5.4 使用Hopfield网络求解拆分296<br />10.5.5 示例分析300<br />10.6 PBQP算法实现313<br />10.6.1 PBQP介绍313<br />10.6.2 寄存器分配和PBQP的关系314<br />10.6.3 PBQP问题求解314<br />10.6.4 寄存器分配问题建模示例317<br />10.6.5 PBQP实现原理以及示例分析318<br />10.7 扩展阅读:图着色分配324<br />10.8 4种算法对比326<br />10.9 本章小结329<br />第11章 函数栈帧生成和非SSA<br /> 形式的编译优化330<br />11.1 函数栈帧生成以及相关优化331<br />11.1.1 栈帧生成331<br />11.1.2 代码下沉332<br />11.1.3 栈帧范围收缩335<br />11.2 MIR优化337<br />11.2.1 分支折叠337<br />11.2.2 尾代码重复347<br />11.2.3 复制传播347<br />11.3 MIR指令变换和调度347<br />11.4 MIR信息收集及布局优化348<br />11.4.1 基本块布局优化349<br />11.4.2 公共代码提取355<br />11.4.3 函数冷热代码分离359<br />11.4.4 代码布局优化比较363<br />11.5 扩展阅读:后缀树构造和应用365<br />11.5.1 后缀树的构造365<br />11.5.2 后缀树的应用372<br />11.6 本章小结372<br />第12章 生成机器码373<br />12.1 MC374<br />12.2 机器码生成过程375<br />12.2.1 汇编代码生成376<br />12.2.2 二进制代码生成378<br />12.3 本章小结381<br />第13章 添加一个新后端382<br />13.1 适配新后端的各个阶段382<br />13.1.1 指令选择阶段的适配383<br />13.1.2 寄存器分配相关的适配383<br />13.1.3 插入前言/后序384<br />13.1.4 机器码生成相关的适配384<br />13.2 添加新后端所需要的适配385<br />13.2.1 定义TD文件386<br />13.2.2 指令选择处理386<br />13.2.3 栈帧处理387<br />13.2.4 机器码生成处理388<br />13.2.5 添加新后端到LLVM框架中388<br />13.3 本章小结389<br />附录<br />附录A LLVM的中间表示392<br />附录B BPF介绍407<br />附录C Pass的分类与管理413
内容摘要
全书分为3篇。第1篇介绍编译器基础知识,包括中间表示,重点介绍SSA、数据流分析、支配、循环等知识,此外还介绍了LLVM的后端描述语言TableGen。第二篇剖析分LLVM代码生成,其中对代码生成的每一步骤都有提及,着重介绍指令选择、指令调度、寄存器分配和编译优化。同时还以BPF后端为例总结了如何基于LLVM开发一款新后端的编译器。第三篇附录主要总结了LLVM代码生成过程中使用的IR、BPF指令集以及如何在Linux运行BPF应用,Pass和PassManager的运行机制等知识。
通过阅读本书,读者理解和掌握LLVM代码生成过程,可以根据本书指导为基于LLVM开发一款新后端的编译器。同时本书还介绍了各种编译过程中使用到的算法,读者可以根据场景对算法进行增强从而达到性能优化目的。
主编推荐
1)主流新版LLVM详解:本书以LLVM 15版本为核心,深入剖析其内部机制,帮助读者掌握前沿的编译器技术。
2)提供配套代码仓库:提供专门的代码仓库镜像,确保读者能够轻松获取并编译书中使用的LLVM版本,实现理论与实践相结合。
3)LLVM IR从入门到精通:详尽介绍LLVM IR的基础知识及其设计原理,引导初学者快速上手,进阶至专业水平。
4)提供BPF后端实战案例:选用BPF作为示例后端,通过精简的代码示例讲解代码生成的关键步骤,易于理解和跟踪。
5)丰富的示例与资源:配套大量示例代码,涵盖C/C++、LLVM IR等多种语言和中间表示形式,并遵循统一命名规则,方便验证学习成果。
— 没有更多了 —
以下为对购买帮助不大的评价