【问题标题】:About Variables Used Within BasicBlock关于 BasicBlock 中使用的变量
【发布时间】:2015-12-04 20:00:58
【问题描述】:

我想问一个关于 LLVM IR 语言的问题。对于基本块,使用的变量总是在使用前加载,并在使用后存储。两个示例基本块如下:

 %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i8**, align 8
  %i = alloca i32, align 4
  %fact = alloca i32, align 4
  %n = alloca i32, align 4
  store i32 0, i32* %1
  store i32 %argc, i32* %2, align 4
  store i8** %argv, i8*** %3, align 8
  %4 = load i8*** %3, align 8
  %5 = getelementptr inbounds i8** %4, i64 1
  %6 = load i8** %5, align 8
  %7 = call i32 (i8*, ...)* bitcast (i32 (...)* @atoi to i32 (i8*, ...)*)(i8* %6)
  store i32 %7, i32* %n, align 4
  store i32 1, i32* %fact, align 4
  store i32 1, i32* %i, align 4
  br label %8


  %9 = load i32* %i, align 4
  %10 = load i32* %n, align 4
  %11 = icmp sle i32 %9, %10
  br i1 %11, label %12, label %19

对于控制流,定义第一个基本块为A,第二个基本块为B,控制流是从A到B。

我想知道,对于 %7 的用法,程序将 %7 存储到 A 中的 %n 指针,并加载 %n 指向 %10 的指针以访问它,如下所示:

store i32 %7, i32* %n, align 4

%10 = load i32* %n, align 4

%11 = icmp sle i32 %9, %10

我想知道我是否可以直接DROP存储和加载指令,直接使用值%7,如下:

%11 = icmp sle i32 %9, %7

这样好吗?谁能说说背后的原因?

我的描述可能晦涩难懂。如果您对此有疑问,我可以更清楚地解释它。

谢谢

【问题讨论】:

  • 您认为自己不能这样做有什么原因吗?

标签: llvm llvm-ir


【解决方案1】:

可以从其他基本块引用虚拟寄存器。

由于您提供的示例不完整,我只能推测%7是否可以直接用于比较:

如果使用 LLVM 的 opt 工具优化代码,寄存器可能不会被存储和重新加载,比较会直接使用 %7(或依赖于值的 phi 函数)。

你可以试试mem2reg注册通行证:

opt -mem2reg <your file>.ll -o <target file>.ll

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2016-11-04
    • 1970-01-01
    • 2011-03-01
    • 2014-02-19
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多