稀疏条件常量传播
核心是格,从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, 标量演进,简单理解在循环中,随着循环迭代,其值是如何变化的。
定义例子:
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
0. 写这个文档的原因因为最近遇到几个问题
在llvm ir上,如何分析一个global variable有没有在程序中变化?
在llvm ir上,如何能分析出来指针的address space (stack, heap, global variable).?
前提条件简点,假设我们在full lto模式下,不考虑类,但有函数指针。
因为设计到指针+function call,所以我们需要一个全局分析。如果我想构建一个call graph,就遇到几个问题
递归函数的处理
...
2025.09.10
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
指令选择
1. 数据结构与内存布局内存结构如下:
问题是指针指向关系是前向还是后向?
2. SelectionDAG 结构介绍
作用域:block level
以这段IR为例:(参考^1)
1234then: %y = add i32 %a, 5 %z = mul i32 %y, 3 br label %join
内存占用有点过于大了。。。[[llvm_SDNode_draw.excalidraw]]
SDUse和llvm::Use同理
N:参考
...
2025.05.10
起源:工作里用c搓了个ir库,ssa形式,但在实现方面遇到了问题(replaceAllUsesWith) 。所以看看工业级的llvm怎么处理的
参考llvm18版本源码
我的设计:
12345678910111213141516171819202122enum ClassID{ BasicBlock, Instruction, ...};struct Value{ char* name; ClassID id;
...
2025.05.09
死代码消除在ssa上比较好实现,根据use-def chain传播如果只是运算指令,且没有users,就是dead的指令。其实就是一个use->def的传播
1234567891011121314151617181920212223worklist = {}for bb in func{ for inst in bb { if (inst not in worklist) worklist
...
2025.03.22
domtree构建算法
1. domtree概念介绍
Dom(b): A node n in the CFG dominates b if n lies on every path from the entry node of the CFG to b.即Dom(b)是一个集合,根据定义 b in Dom(b)
immediate dominator: b’s immediate dominator is the node n in Dom(b) which is clo
...
2025.03.22