MemSSA
MemSSA
MemorySSA将建立一个映射,将指令映射到MemoryAccess
MemoryAccess分为三种:
- MemoryDef
- MemoryPhi
- MemoryUse
memoryDef是修改内存或者引入指令顺序限制的指令。如Store,call,load等等
memoryPhi是针对内存的phi指令。如果同时有多个memoryDef流入一个basicBlock,那么这个BasicBlock头部就会有一个MemoryPhi。实际上LLVM中并没有MemoryPhi的操作,因此它是一种虚拟的IR,我们需要将基本块与其对应,类似的,指令与MemoryDef/MemoryUse对应。
memoryUse是只读取但不会修改内存的指令,如load,call等等
clobber表示一个memoryAccess可能和另一个memoryAccess影响相同的区域
每个函数都有一个特殊的MemoryDef,叫做LiveOnEntry。它支配函数中的每个MemoryAccess,也是唯一一个不对应llvm中具体指令的MemoryDef。
以下面为例:
1 | define void @foo() { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ando's blog!