【发布时间】: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