【问题标题】:How to find hanging LLVM optimization pass?如何找到挂起的 LLVM 优化通道?
【发布时间】:2018-07-18 14:08:28
【问题描述】:

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

【问题讨论】:

  • 一种简单而乏味的方法是向 LLVM 代码添加打印并迭代,直到您放大有问题的通道 - 它不应该花费太长时间

标签: debugging llvm llvm-clang


【解决方案1】:

我能够找到停滞不前的通行证的方法是使用

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

我发现唯一给出备注的优化pass是尾调用优化,所以我把它关掉了。后来我发现我的代码有问题,但这就是我发现问题的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多