为什么LLVM CFL-Steens-AA分析中%0与%i的别名结果为MayAlias?
为什么
i32* %0和i32* %i的别名分析结果为MayAlias 核心前提
本次分析你关闭了LLVM默认的高精度基础别名分析(BasicAA),仅使用--cfl-steens-aa(Steensgaard风格CFL别名分析)执行判断,该工具的特性直接决定了结果精度。
1. CFL-Steens的固有精度限制
CFL-Steens是为了高性能设计的低精度别名分析,有两个核心特性:
- 流不敏感:不跟踪代码执行顺序,不会区分不同位置的赋值和加载操作
- 上下文不敏感:不区分函数调用的上下文,也不会推导单条存储指令的具体取值
它基于统一(unification)算法实现,只会合并指针的指向等价类,不会精确追踪每个指针的所有可能指向值。
2. 本次判断的具体逻辑
从IR执行逻辑来看,%0是从%j加载得到的指针,而%j存储的就是%i的地址,理论上二者是100%的MustAlias关系:
- 但CFL-Steens不会追踪
store i32* %i, i32** %j这条指令的具体赋值,只能识别到%0是从二级指针加载的一级指针,%i是一级栈指针,二者的指向集合存在重叠可能 - 别名分析遵循保守原则:如果不能100%确定两个指针无别名,也不能100%确定二者一定别名,就会返回MayAlias结果
3. 验证方法
你可以去掉-disable-basic-aa参数重新执行分析,BasicAA会识别%j的存储内容,直接返回%0和%i为MustAlias的结果。
内容的提问来源于stack exchange,提问作者Taik-Dai
相关产品推荐
相关产品推荐

