LLVM IR 指针别名规则

任何内存访问都必须通过与内存访问的地址范围关联的指针值来完成,否则行为是不确定的。根据以下规则,指针值与地址范围相关联:

  • 指针值与关联基于任何值的地址相关联。(这其实是比较绕口的废话)
  • 全局变量的地址与变量存储的地址范围相关联。
  • 分配指令的结果值与分配的存储器的地址范围相关联。
  • 默认地址空间中的空指针与无地址相关联。
  • 一个非零整数常量或从未在LLVM中定义的函数返回的指针值可能与通过LLVM提供的机制以外的机制分配的地址范围关联。这些范围不得与由LLVM提供的机制分配的任何地址范围重叠。

根据以下规则,指针值是基于另一个指针值:

  • 由标量getelementptr操作符形成的指针值基于指针类型的操作符getelementptr
  • 在车道(lane)中的指针/升的矢量的结果的getelementptr操作是基于对车道(lane)指针升的的类型的载体的指针操作符getelementptr
  • bitcast的结果值是基于操作符bitcast
  • inttoptr形成的指针值是基于对造成(直接或间接)到指针的值的计算中的所有指针值。
  • “基于”的关系是传递性的。

请注意,这个“based”的定义有意地类似于C99中“based”的定义,尽管它稍微弱一些。

LLVM IR不会将类型与内存相关联。load的结果类型仅指示要加载的内存的大小和对齐方式,以及对值的解释。类似的第一个操作数类型store仅指示存储的大小和对齐方式。

因此,基于类型的别名分析,又名TBAA,也就是说-fstrict-aliasing,不适用于通用的非LLVM IR。元数据可用于编码额外的信息,专门的优化过程可用于实现基于类型的别名分析。