llvm寄存器分配2
greedyTODO ...
2026.03.22
llvm寄存器分配1
接上一篇。列举下RABasic需要的数据结构 LiveRegMatrix, LiveIntervals, VirtRegMap, LiveIntervalUnion LiveIntervals 核心的查询接口。 VirtRegIntervals Map<reg, LiveIntervals> RegMaskSlots 是用来储存哪些指令用了regmask(基本是call),在判断干涉时用到,按照slotindex排序 RegMaskBits,查询的ca ...
2026.03.22
llvm寄存器分配0
依赖的分析 value number live range(liveness). 这块挺复杂的. machine dom tree/machine loop block frequency value number VNInfo 能处理ssa和non-ssa格式的mir 一个例子: 12345678910111213141516171819; llc %s -march=aarch64 --stop-after=register-coalescer declar ...
2026.03.22
博客尽量用text格式
感觉图片太多太麻烦了,想尽量在text格式下写。 web图形处理上面有几种解决方案: 用ascii绘制,有点太累了 markdown提供的mermaid和graphviz。mermaid简单但是功能有限,graphviz功能强大。 TikZ,更加专业,https://github.com/kisonecat/tikzjax https://github.com/jhuix-js/tikzjax base64嵌入,体积会比较大。 关键是文本表示是在框架下已经生成为stati ...
2026.03.18
win构建llvm
构建llvm 以win11+git bash为例 配置 1234567891011set -xexport COMPILER_DIR=D:/LLVM/bin/ # 替换为一个已有compiler的pathexport CC=$COMPILER_DIR/clang.exeexport CXX=$COMPILER_DIR/clang++.exeexport RC_COMPILER=$LLVM_DIR/llvm-rc.exemkdir -p buildmkdir -p inst ...
2026.03.15
2026-3-12记
记录下这一年半编译器开发的经验。 编译通过,但是运行结果错误。 如何检查? 先减小问题规模,整出一个最小可复现用例 检查pipeline,parser结果,ir pass结果,isel结果,reg alloc,stack frame等。 verify的重要性,每个不同格式的中间表示转换处需要有verify,保证其流入和流出结果的合法性。 重复上述步骤,直到问题解决。 既然是pipeline模型,那么衔接需要处理好。需重点注意。 编译器挂掉了,没其他信息。一般是各种空 ...
2026.03.12
LLVM Inst Schedule
LLVM 指令调度有作用在SelectionDAG和MachineInstr的指令调度。并将调度策略和调度框架分离。 结构 SDep代表一个依赖关系 SUnit代表一个基本单元。 ScheduleDAG,调度DAG的基类。https://llvm.org/doxygen/classllvm_1_1ScheduleDAG.html ScheduleDAGSDNodes作用在SelectionDAG上的。主要在SelectionDAGISel::CodeGenAndEmitDA ...
2026.03.10
寄存器分配简介
寄存器分配简介 前置技术 Liveness Analysis, Live Interval, reaching defineLiveness Analysis经典的数据流分析, 后向(倒序)分析. 1234live_out[b] = ⋃ (live_in[s] for s ∈ succ(b))live_in[b] = use[b] ∪ (live_out[b] − def[b]) live intervalllvm依赖这个,就是 def-use 分段. reachin ...
2026.02.20
loop 介绍
循环,重要性不必多说。 llvm与循环相关的优化有很多: loop unroll and jam : 循环展开+ 合并 loop unroll SCEV loop invariant code motion loop interchange loop rotation loop splitting loop fusion loop unswitching loop vectorization…. 从非结构化的CFG中识别loop: 识别循环迭代变量 Loop 定 ...
2025.10.10
SSA构建和销毁
phinode的创建和消除 1. SSA构建算法 依赖: dom tree DF llvm ir基础知识 对以下c代码 1234int foo(int a){ int b = a; return b;} clang会生成类似这种IR 12345678define i32 @foo(i32 %a){ %pa = alloc i32 %pb = alloc i32 store %a, %pa store %a, %pb %b1 = load ...
2025.09.20
123