死代码消除 (DCE) 不适用于 LLVM Opt

问题描述 投票:0回答:1

我在使用 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 相同的内容,表明没有发生优化。我想知道为什么优化没有按预期进行。

故障排除步骤:

  • 我尝试了不同的优化级别(-O1、-O3),但结果相同。
  • 我验证了 main.ll 中的代码包含应该消除的死代码。

问题:

  1. 为什么死代码消除在这种情况下没有按预期工作?
  2. 使用 LLVM IR 选择死代码消除时有什么具体注意事项吗? 我感谢任何有助于解决此问题的见解或建议。谢谢!

细节 操作系统: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

clang llvm
1个回答
0
投票

您的函数有一个

optnone
属性:

; Function Attrs: noinline nounwind optnone uwtable

这将禁用所有进一步的优化。

您需要手动删除它或运行 clang ,如下所示:

clang -O2 -Xclang -disable-llvm-passes
© www.soinside.com 2019 - 2024. All rights reserved.