如何找到悬挂式LLVM优化通道?

时间:2018-07-18 14:08:29

标签: debugging llvm llvm-clang

我写了一个LLVM传递,用对执行一些簿记功能的调用代替了一些存储指令,然后以一种特殊的方式执行存储。当我使用-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-strict-aliasing

#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;
 }

1 个答案:

答案 0 :(得分:1)

我能找到停滞的通行证的方法是通过

-Rpass=.* -Rpass-missed=.* -Rpass-analysis=.*

我发现唯一能说明问题的优化过程是尾部调用优化,因此我将其关闭。后来我发现了我的代码有问题,但这就是我发现引起的问题的原因。