逸翎清晗🌈
后端Pass简介——ExpandLargeDivRem
ExpandLargeDivRem 这个 Pass(ExpandLargeDivRem)的主要作用,是在 LLVM 后端针对那些 位宽超过目标硬件或配置所能直接支持的整数除法/取余指令(div/rem),将它们“拆解”成对外部自动生成函数的调用,从而保证在不支持大整数除法的架构上也能正确地执行。具体来说: 检测不支持的指令 在遍历函数中的所有 UDiv、SDiv、URem、SRem 指令时,先读取目标子系统(TargetLowering)报告的最大可合法处理位宽,或者使用用户通过 -expand-div-rem-bits 强制设置的阈值。如果除法/取余操作的位宽超过该阈值,则认定为“超大”指令需要特殊处理。 跳过简单情况 对于常数幂二的除数(如除以 8、16 等),后端往往有专门的移位或乘法优化,所以这里不做拆分。 可扩展向量类型暂不支持,只有定长向量会被拆解。 向量指令的标量化(scalarize) 如果指令作用于一个向量(VectorType),先将其拆成若干条标量除法/取余,然后把结果再插回到向量中,这一步收集生成新的 BinaryOperator,后续一起处理。 调用库 ...
后端Pass简介——ExpandFp
ExpandFp 该 Pass 行数为 600+,是一个辅助 Pass 一些后端(尤其是 x86_64)无法直接对超过一定精度(如 128 位)的浮点与整数互转指令做硬件指令生成(Lowering);默认的 FPToUI/FPToSI、UIToFP/SIToFP 指令只能处理较小的位宽。为了支持更大位宽的转换,需要在 IR 层面用一系列基本操作(位移、掩码、比较、select、phi 等)手工模拟这一转换逻辑。 ExpandFp Pass 会扫描函数中的所有浮点〈→〉整数互转指令,当目标转换的整数位宽超过阈值时(默认无限制),就替换成等价的 IR 序列: 对于 FP→Int,将浮点先解释成原始比特表示(bitcast),提取符号、阶码、尾数,按 IEEE 浮点格式的规则手动生成整数结果; 对于 Int→FP,则基于整数位宽和目标浮点格式的尾数位数构造位级操作,再用 bitcast/fptrunc 等恢复成浮点。 该 Pass 可以调参但不建议调: static cl::opt<unsigned> ExpandFpConvertBits("expand-fp-convert ...
Dwarf调试规范(官方文档)
Dwarf6重要知识总结
后端Pass简介——ExecutionDomainFix
ExecutionDomainFix ExecutionDomainFix 是 LLVM 后端在生成目标机器代码时,用来 检测并修复“执行域”(execution domain)不一致 问题的一个 MachineFunctionPass。 背景 现代多域架构(如 x86 的整数域、SSE/AVX 浮点域、x87 浮点域等)对同一寄存器在不同执行单元间切换有较高的性能开销。 编译器在指令调度、寄存器分配后生成的机器指令序列,可能因为控制流合并、指令重排等原因,让同一个寄存器在多个域间来回“漂移”,导致额外的“域切换”指令或隐性开销。 ExecutionDomainFix 作为一个 MachineFunctionPass,专门用来在 MachineInstr 级别 检测并修复这种跨域不一致问题,最大化利用硬件执行单元、避免不必要的域切换惩罚。 概念 执行域(Execution Domain):LLVM 中,一个指令可以在多个域(Domain)中执行。每个域对应目标机器的某种执行单元(如整数 ALU、浮点单元、向量单元等)。 DomainValue:封装一个寄存器当前可能的域集合(Av ...
后端Pass简介——EarlyIfConversion
EarlyIfConversion 这是一个比较重要的 Pass,代码量 1300 多行。Early If-Conversion 旨在 在指令选择(SelectionDAG)后、寄存器分配(RegAlloc)前,把一些简单的条件分支转换成顺序执行==并用条件移动(cmov 或者其他选择指令)来完成,减少分支指令,从而降低 mispredict 带来的性能损失。== 概念好懂,其支持两种控制流形状:     Head     /  \  TBB    FBB     \  /     Tail # Head 块末尾有一个单分支跳转到 TBB/FBB,再汇合到 Tail。 # Pass 会把 TBB 或 FBB 中的指令按需合并到 Head 中,并在原来 Tail 中的 φ 节点处插入选择指令。 Head / \ TBB FBB \ / \ / Tail # 类似三角形,但两条分支上都有指令需要合并。 # 将两边的指令都移动到 Head,并同样在 Tail ...
市面上的主流编译器大全
市面上的主流编译器大全
后端Pass简介——DwarfEHPreparePass
Dwarf Pass:DwarfEHPreparePass
每日论文合辑
(2025.06.12)【ASPLOS’25】 ClosureX: Compiler Support for Correct Persistent Fuzzing 因为对于该领域不熟悉,我还是召唤了翻译来理解每个词的本意:Fuzzing 是一种被广泛采用且务实的漏洞挖掘方法,用于加强软件的健壮性。研究表明,提高 fuzzing 的吞吐量能直接提升漏洞发现率。性能最高的 fuzzing 策略是「持久化 fuzzing」(persistent fuzzing),它通过在完成一次测试后循环回到入口,而不是退出进程,从而复用同一进程处理所有测试用例。这样就消除了与执行成本相当的进程创建、初始化和销毁开销。不幸的是,持久化 fuzzing 会导致语义上不一致的程序状态:一个测试用例对进程状态的修改会保留到后续测试中。这种语义不一致会带来漏报崩溃、误报崩溃以及整体错误,进而削弱模糊测试器的有效性。我们观察到,现有的 fuzzing 执行机制在“每次测试用例之间丢弃和恢复状态量”上形成一条连续谱。我们提出了 ClosureX,一种在这条状态恢复谱上位于新位置的执行机制:它仅重置与当前测试用例执行相 ...
RISC-V ISA
对RISC-V扩展指令集架构的介绍
后端Pass简介——DroppedVariableStatsMIR
DroppedVariableStatsMIR 这个 Pass 比较简单但重要!是 LLVM 后端的一个统计工具,它在每个机器级优化或代码生成阶段前后对比收集到的调试变量信息,记录因各类转换或优化而被丢弃(Dropped)的 DBG_VALUE 指令数量,并将这些丢失统计结果输出。 为什么要这么做 确保调试质量:优化虽能提升性能,却往往会重排或删除部分中间变量的映射指令,导致调试器无法正确显示源代码中的变量值。 回归检测:通过自动化统计,可以在引入新优化 Pass 时,及时发现是否有过多的调试信息丢失,避免影响调试体验。 定位问题:统计结果帮助后端开发者快速定位是哪个 Pass、哪个函数或哪个变量出了问题,从而有针对性地修改代码生成或优化策略。 举例 假设函数中有一个局部变量 foo,编译器在某次寄存器分配优化中,为了更好地利用寄存器,移除了或合并了原先用于跟踪 foo 的 DBG_VALUE 指令。调试时便无法再观察到 foo 的值。使用 DroppedVariableStatsMIR: 在“寄存器分配” Pass 之前,它记录下所有与 foo 相关的 DBG_VALUE。 P ...
后端Pass简介——DetectDeadLanes
DetectDeadLanes 这个 Pass(“Detect Dead Lanes”) 的目的是在涉及子寄存器(subregister)的时候,跟踪虚拟寄存器中各个“lane”上的定义和使用情况,以便在后续阶段正确地识别“死定义”(dead definitions)或“未定义使用”(undefined uses)。 当寄存器被拆分成若干子寄存器或通过 COPY-like 指令(如 PHI、REG_SEQUENCE、INSERT_SUBREG、EXTRACT_SUBREG 等)传递时,普通的寄存器活性分析无法直接得知哪些子部分是真正被使用或定义的。本 Pass 通过位掩码(LaneBitmask)对每个虚拟寄存器的每个子 lane 做数据流分析,从而在 Machine IR 层标记那些确实“死掉”或“未定义”的操作数。 那么什么是 lane 呢? “Lane”在这里指寄存器的==某个子部分(subregister)对应的位集合==。对于一个虚拟寄存器,LLVM 用一个位掩码(LaneBitmask)来表示其中哪些“lane”(即哪些子寄存器位域)已经被定义或使用。 可以理解为高 1 ...
2025编译领域论文
编译领域仅限通用传统编译与 AI 编译大类,不包括量子编译,WebAssembly,不包括编程语言相关 2025 编译领域论文 (LLVM) ASPLOS Volume1 ClosureX: Compiler Support for Correct Persistent Fuzzing Composing Distributed Computations Through Task and Kernel Fusion Debugger Toolchain Validation via Cross-Level Debugging PartIR: Composing SPMD Partitioning Strategies for Machine Learning pulse: Accelerating Distributed Pointer-Traversals on Disaggregated Memory RANGE-BLOCKS: A Synchronization Facility for Domain-Specific Architectures RTL Verificat ...
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
本站访客数 :
本站总访问量 :
最后更新时间 :
空降评论复制本文地址
随便逛逛昼夜切换关于博客美化设置切换全屏打印页面