我写了一个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;
}
答案 0 :(得分:1)
我能找到停滞的通行证的方法是通过
-Rpass=.* -Rpass-missed=.* -Rpass-analysis=.*
我发现唯一能说明问题的优化过程是尾部调用优化,因此我将其关闭。后来我发现了我的代码有问题,但这就是我发现引起的问题的原因。