- ISBN:9787111764151
- 装帧:平装-胶订
- 册数:暂无
- 重量:暂无
- 开本:16开
- 页数:432
- 出版时间:2024-09-01
- 条形码:9787111764151 ; 978-7-111-76415-1
本书特色
1)主流新版LLVM详解:本书以LLVM 15版本为核心,深入剖析其内部机制,帮助读者掌握前沿的编译器技术。2)提供配套代码仓库:提供专门的代码仓库镜像,确保读者能够轻松获取并编译书中使用的LLVM版本,实现理论与实践相结合。3)LLVM IR从入门到精通:详尽介绍LLVM IR的基础知识及其设计原理,引导初学者快速上手,进阶至专业水平。4)提供BPF后端实战案例:选用BPF作为示例后端,通过精简的代码示例讲解代码生成的关键步骤,易于理解和跟踪。5)丰富的示例与资源:配套大量示例代码,涵盖C/C 、LLVM IR等多种语言和中间表示形式,并遵循统一命名规则,方便验证学习成果。
内容简介
全书分为3篇。第1篇介绍编译器基础知识,包括中间表示,重点介绍SSA、数据流分析、支配、循环等知识,此外还介绍了LLVM的后端描述语言TableGen。第二篇剖析分LLVM代码生成,其中对代码生成的每一步骤都有提及,着重介绍指令选择、指令调度、寄存器分配和编译优化。同时还以BPF后端为例总结了如何基于LLVM开发一款新后端的编译器。第三篇附录主要总结了LLVM代码生成过程中使用的IR、BPF指令集以及如何在Linux运行BPF应用,Pass和PassManager的运行机制等知识。
通过阅读本书,读者理解和掌握LLVM代码生成过程,可以根据本书指导为基于LLVM开发一款新后端的编译器。同时本书还介绍了各种编译过程中使用到的算法,读者可以根据场景对算法进行增强从而达到性能优化目的。
目录
前言
**部分 基础知识
第1章 绪论2
1.1 LLVM设计思路分析3
1.2 LLVM主要子项目4
1.3 LLVM构建与调试5
1.4 LLVM在线工具7
1.5 本章小结9
第2章 IR基础知识10
2.1 IR分类11
2.1.1 树IR11
2.1.2 线性IR11
2.1.3 图IR12
2.2 CFG的基本块与构建14
2.2.1 基本块14
2.2.2 构建CFG15
2.3 静态单赋值15
2.3.1 基本概念16
2.3.2 SSA构造19
2.3.3 SSA析构19
2.3.4 SSA分类28
2.3.5 基本块参数和Phi节点29
2.4 本章小结30
第3章 数据流分析基础知识31
3.1 半格、格与不动点31
3.1.1 半格和偏序集31
3.1.2 格33
3.1.3 不动点34
3.2 数据流分析原理及描述35
3.2.1 数据流方程形式化描述36
3.2.2 数据流分析的理论描述40
3.3 数据流方程示例43
3.3.1 活跃变量43
3.3.2 到达定值45
3.3.3 常量传播46
3.4 扩展阅读:数据流的遍历性能
分析49
3.5 本章小结50
第4章 支配分析51
4.1 支配和逆支配51
4.1.1 支配和逆支配相关定义51
4.1.2 支配和逆支配含义解析53
4.2 支配树和支配边界的实现55
4.2.1 半支配节点及相关概念56
4.2.2 LT算法和Semi-NCA的
差异57
4.2.3 支配边界的实现58
4.3 扩展阅读:支配树相关小课堂58
4.3.1 支配树构造算法及比较59
4.3.2 如何快速判断任意两个节点的
支配关系60
4.4 本章小结62
第5章 循环基本知识63
5.1 自然循环64
5.2 LLVM的循环实现65
5.2.1 循环识别66
5.2.2 循环规范化67
5.3 本章小结71
第6章 TableGen介绍72
6.1 目标描述语言72
6.1.1 词法72
6.1.2 语法74
6.2 TableGen工具链77
6.2.1 从TD定义到记录78
6.2.2 从记录到C 代码81
6.3 扩展阅读:如何在TD文件中
定义匹配83
6.3.1 隐式定义匹配模板83
6.3.2 复杂匹配模板84
6.3.3 匹配规则支撑类86
6.4 本章小结86
第二部分 代码生成
第7章 指令选择91
7.1 指令选择的处理流程92
7.2 SelectionDAGISel算法分析94
7.2.1 SDNode分类96
7.2.2 LLVM IR到SDNode的转换98
7.2.3 SDNode合法化108
7.2.4 机器指令选择117
7.2.5 从DAG输出MIR123
7.3 快速指令选择算法分析126
7.4 全局指令选择算法原理与实现128
7.4.1 全局指令选择的阶段128
7.4.2 GMIR生成129
7.4.3 指令合法化133
7.4.4 寄存器类型选择137
7.4.5 机器指令选择141
7.4.6 合并优化143
7.5 本章小结146
第8章 指令调度147
8.1 LLVM指令调度149
8.1.1 指令调度算法150
8.1.2 拓扑排序算法151
8.2 Linearize调度器152
8.2.1 构造依赖图153
8.2.2 对依赖图进行调度153
8.3 Fast调度器156
8.3.1 Fast调度器实现157
8.3.2 物理寄存器依赖场景的处理158
8.3.3 示例分析162
8.4 BURR List调度器166
8.4.1 影响指令调度的关键因素166
8.4.2 指令优先级计算方法168
8.4.3 示例分析170
8.5 Source List调度器173
8.6 Hybrid List调度器174
8.7 Pre-RA-MISched调度器174
8.7.1 Pre-RA-MISched调度器实现174
8.7.2 调度区域的划分175
8.7.3 影响Pre-RA-MISched调度器
的关键因素175
8.7.4 MIR指令时延的计算175
8.7.5 寄存器压力的计算177
8.7.6 示例分析181
8.8 Post-RA-TDList调度器186
8.8.1 Post-RA-TDList调度器实现186
8.8.2 示例分析186
8.9 Post-RA-MISched调度器189
8.10 循环调度190
8.10.1 循环调度算法实现190
8.10.2 示例分析194
8.11 扩展阅读:调度算法的影响
因素200
8.12 本章小结203
第9章 基于SSA形式的编译优化204
9.1 前期尾代码重复205
9.1.1 尾代码重复原理205
9.1.2 尾代码收益判断207
9.1.3 执行尾代码重复优化209
9.2 Phi优化212
9.3 栈着色213
9.4 栈槽分配217
9.5 死指令消除218
9.6 IPL优化之If-Conversion219
9.7 循环不变量外提224
9.8 公共子表达式消除224
9.9 代码下沉227
9.10 窥孔优化228
9.11 本章小结231
第10章 寄存器分配232
10.1 寄存器分配流程解析233
10.1.1 Fast算法执行流程233
10.1.2 Basic算法执行流程233
10.2 寄存器分配涉及的Pass241
10.2.1 死亡和未定义子寄存器检测241
10.2.2 隐式定义指令处理243
10.2.3 不可达MBB消除243
10.2.4 活跃变量分析244<
作者简介
彭成寒:AI编译器与虚拟机技术专家,目前主要专注于LLVM、MLIR相关的AI编译器研究,并在JVM、V8和WebAssembly等虚拟机技术方面有着丰富的研发经验。他深耕IT领域近20年,曾涉足应用软件和大数据开发等多个领域,并著有《JVM G1源码分析和调优》《新一代垃圾回收器ZGC设计与实现》《深入探索JVM垃圾回收:ARM服务器垃圾回收的挑战和优化》等重要领域专著。
-
有限与无限的游戏:一个哲学家眼中的竞技世界
¥37.4¥68.0 -
全图解零基础word excel ppt 应用教程
¥12.0¥48.0 -
机器学习
¥59.4¥108.0 -
深度学习的数学
¥43.5¥69.0 -
智能硬件项目教程:基于ARDUINO(第2版)
¥37.7¥65.0 -
硅谷之火-人与计算机的未来
¥14.3¥39.8 -
元启发式算法与背包问题研究
¥38.2¥49.0 -
AI虚拟数字人:商业模式+形象创建+视频直播+案例应用
¥62.9¥89.8 -
UNIX环境高级编程(第3版)
¥164.9¥229.0 -
剪映AI
¥52.8¥88.0 -
深度学习高手笔记 卷2:经典应用
¥90.9¥129.8 -
纹样之美:中国传统经典纹样速查手册
¥77.4¥109.0 -
UG NX 12.0数控编程
¥22.1¥45.0 -
MATLAB计算机视觉与深度学习实战(第2版)
¥90.9¥128.0 -
界面交互设计理论研究
¥30.8¥56.0 -
UN NX 12.0多轴数控编程案例教程
¥25.8¥38.0 -
微机组装与系统维护技术教程(第二版)
¥37.8¥43.0 -
明解C语言:实践篇
¥62.9¥89.8 -
Linux服务器架设实战(Linux典藏大系)
¥84.5¥119.0 -
Visual Basic 语言程序设计基础(第6版)
¥32.0¥45.0