如何找到挂起的LLVM优化通行证?

How to find hanging LLVM optimization pass?

我写了一个 LLVM pass,它用调用执行某些簿记的函数替换了一些存储指令,然后以特殊方式执行存储。当我使用 -O0 编译时它工作正常,但我只能在使用 -O3 时保证我的通行证的功能。当我使用 -O3(或 -O1/-O2)编译时,它成功地完成了我的传递,然后在稍后的优化阶段挂起。有没有办法发现哪个优化过程挂起/为什么挂起?

这样我以后就不用再提供了,这是我的代码和我的编译行。

clang++-5.0 -std=c++11 -Xclang -load -Xclang ../../plugin/build/mylib.so single_param.cc -c -I ../../libs/ -S -emit-llvm -O3

问题不在代码生成中,因为我只生成位码。我注意到 -O3 中的存储(没有我的通行证)包含别名信息,我认为由于我删除了这些指令,以后使用此别名信息进行的一些优化可能会遇到一些麻烦,所以我关闭了大部分别名分析使用-fno-严格别名

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>    

void __attribute__((noinline)) f(int *n){
  *n = *n + 1;
}
int main(){
  int a = 4;
  f(&a);

  return a;
 }

我找到被拖延的通行证的方法是用

打开评论
-Rpass=.* -Rpass-missed=.* -Rpass-analysis=.*

我发现给备注的optimization pass只有tail call optimization,所以关掉了。后来我发现我的代码有问题,但这就是我发现我造成的问题的方式。