首页 > 解决方案 > 如何找到挂起的 LLVM 优化通道?

问题描述

我编写了一个 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;
 }

标签: debuggingllvmllvm-clang

解决方案


我能够找到停滞不前的通行证的方法是打开评论

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

我发现唯一给出备注的优化通道是尾调用优化,所以我把它关掉了。后来我发现我的代码有问题,但这就是我发现我造成的问题的方式。


推荐阅读