博客尽量用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
LLVM Inst Schedule
LLVM 指令调度有作用在SelectionDAG和MachineInstr的指令调度。并将调度策略和调度框架分离。 结构 SDep代表一个依赖关系 SUnit代表一个基本单元。 ScheduleDAG,调度DAG的基类。https://llvm.org/doxygen/classllvm_1_1ScheduleDAG.htmluse-def ScheduleDAGSDNodes作用在SelectionDAG上的。主要在SelectionDAGISel::CodeGenAn ...
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
SCCP
稀疏条件常量传播 核心是格,从def到use的传播。 有Top,Const,Bottom三类,Const其实有无穷个状态。状态转移就是从Top 到 Const/Bottom 然后定义状态转移函数meet: meet(any, Top) = any meet(any, Bottom) = Bottom meet(Ci, Cj) = Ci if i==j meet(Ci, Cj) = Bottom if i! ...
2025.09.20
Scalar Evolution介绍
Scalar Evolution, 标量演进,简单理解在循环中,随着循环迭代,其值是如何变化的。 定义例子: 12345for(int i=0;i<10;i++){ int a = i*10; int b = i*i + a;} 对这个循环来说,i = 0, 1, 2, …, 9a = 0, 10, 20, …, 90b = 0, 11, 24, …, 165 对于更复杂情况呢?所以需要一种代数来表 ...
2025.09.20
alias analysis简介
0. 写这个文档的原因因为最近遇到几个问题 在llvm ir上,如何分析一个global variable有没有在程序中变化? 在llvm ir上,如何能分析出来指针的address space (stack, heap, global variable).? 前提条件简点,假设我们在full lto模式下,不考虑类,但有函数指针。 因为设计到指针+function call,所以我们需要一个全局分析。如果我想构建一个call graph,就遇到几个问题 递归函数的处理 ...
2025.09.10
clang配置
clangd+vscode在win11上经常崩溃,记录下可能的解决方案。 配置文件冲突 用户和工作区的clangd配置冲突了。用一个就行 inlay hints 可以尝试关掉( 不一定有用) clangd配置 12345--log=verbose--background-index=0-j=1--clang-tidy--header-insertion=never 设置--query-driver详见https://github.com/clangd/cla ...
2025.08.01
1234