我对 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
我想向每个具有多个前身的基本块添加一个 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)