debugging - 如何找到挂起的 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;
}
解决方案
我能够找到停滞不前的通行证的方法是打开评论
-Rpass=.* -Rpass-missed=.* -Rpass-analysis=.*
我发现唯一给出备注的优化通道是尾调用优化,所以我把它关掉了。后来我发现我的代码有问题,但这就是我发现我造成的问题的方式。
推荐阅读
- testng - TestNG DataProvider 返回对象和 RetryAnalyzer 无法识别重试
- windows - 批量解释这种奇怪的评论风格
- kubernetes - 为什么 Kubernetes Ingress 在其负载均衡器上默认创建 *两个* 健康检查?
- javascript - 您如何将当前时间/总时间添加到自定义音频播放器?
- image - 如何为 JavaScript/React 应用托管图像
- html - 弹性项目不会溢出
- php - 将文本大小与图像宽度对齐
- mysql - MySQL 使用 select in or 子句的结果
- django - 基于两个输入的条件验证
- java - 如果@transactional 在类级别应用,如何拦截@transactional 参数