我在使用 LLVM 的 opt 工具时遇到死代码消除 (DCE) 问题。我有一个简单的 C 程序如下:
#include <stdio.h>
int main() {
int a = 5;
int b = 10;
int c = a + b;
return 0;
}
我使用以下命令将此程序编译为 LLVM IR:
clang -S -emit-llvm main.c -o main.ll
然后,我尝试使用 opt 和以下命令执行死代码消除:
opt -O2 -adce main.ll -o main_optimized.ll
; ModuleID = 'main.ll'
source_filename = "main.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
%3 = alloca i32, align 4
%4 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 5, i32* %2, align 4
store i32 10, i32* %3, align 4
%5 = load i32, i32* %2, align 4
%6 = load i32, i32* %3, align 4
%7 = add nsw i32 %5, %6
store i32 %7, i32* %4, align 4
ret i32 0
}
attributes #0 = { noinline nounwind optnone uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
!llvm.module.flags = !{!0, !1, !2, !3, !4}
!llvm.ident = !{!5}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 7, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 1}
!4 = !{i32 7, !"frame-pointer", i32 2}
!5 = !{!"Ubuntu clang version 14.0.0-1ubuntu1.1"}
问题是 main_optimized.ll 最终包含与 main.ll 相同的内容,表明没有发生优化。我想知道为什么优化没有按预期进行。
故障排除步骤:
问题:
细节 操作系统:6.2.0-34-generic #34~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC 9月7日星期四13:12:03 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
LLVM版本:14.0.0
铿锵版本: Ubuntu clang 版本 14.0.0-1ubuntu1.1 目标:x86_64-pc-linux-gnu 线程模型:posix 安装目录:/usr/bin
命令行: 鱼+tmux
您的函数有一个
optnone
属性:
; Function Attrs: noinline nounwind optnone uwtable
这将禁用所有进一步的优化。
您需要手动删除它或运行 clang ,如下所示:
clang -O2 -Xclang -disable-llvm-passes