小编Aet*_*etX的帖子

为什么 LLVM AliasAnalysis 无法精确确定两次取消引用的指针之间的别名关系?

我对 LLVM AliasAnalysis 实现感到非常困惑。假设我有这个程序:

int* key = malloc(4);
*key = 10;
*key = 11;
Run Code Online (Sandbox Code Playgroud)

它被转换为 IR 代码,如下所示:

  %3 = call noalias i8* @malloc(i64 4) #2
  %4 = bitcast i8* %3 to i32*
  store i32* %4, i32** %2, align 8
  %5 = load i32*, i32** %2, align 8
  store i32 10, i32* %5, align 4
  %6 = load i32*, i32** %2, align 8
  store i32 11, i32* %6, align 4
Run Code Online (Sandbox Code Playgroud)

然后我要求 LLVM使用该函数打印出%5和之间的别名关系。然后它表明它们可能彼此别名(如 )。为什么 LLVM 无法检测到它们必须互相别名?我有什么办法可以修复它吗?%6static_cast<uint16_t>(AA_->getModRefInfo(FirstStore, MemoryLocation(SecondStorePointer)))ModRefInfo::Mod

c c++ llvm strict-aliasing

5
推荐指数
0
解决办法
131
查看次数

如何将 PHI 节点添加到每个基本块的开头

我想向每个具有多个前身的基本块添加一个 phi 节点。例如,在store之前添加phi节点。我对 llvm IR 很陌生,我知道有一些函数调用replaceAllUsesWith()可以用来做类似的事情。但我不知道具体如何使用它。非常感谢任何帮助!

 <label>:7:                                      ; preds = %6, %0
 store i32 999, i32* %3, align 4
 ret i32 0
Run Code Online (Sandbox Code Playgroud)

c++ llvm compiler-optimization

2
推荐指数
1
解决办法
1776
查看次数

标签 统计

c++ ×2

llvm ×2

c ×1

compiler-optimization ×1

strict-aliasing ×1