【问题标题】:Missing Virtual Register Numbers in LLVM IRLLVM IR 中缺少虚拟寄存器号
【发布时间】:2018-02-02 23:57:33
【问题描述】:

考虑以下两个例子:

int test_plus(int a, int b)
{
  int c = a + b;
  return c;
}

int reg_incr(int a)
{
  int b = a + 1;
  return b;
}

LLVM IR 将是:

; Function Attrs: nounwind ssp uwtable
define i32 @test_plus(i32, i32) #0 {
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  store i32 %0, i32* %3, align 4
  store i32 %1, i32* %4, align 4
  %6 = load i32, i32* %3, align 4
  %7 = load i32, i32* %4, align 4
  %8 = add nsw i32 %6, %7
  store i32 %8, i32* %5, align 4
  %9 = load i32, i32* %5, align 4
  ret i32 %9
}

; Function Attrs: nounwind ssp uwtable
define i32 @reg_incr(i32) #0 {
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  store i32 %0, i32* %2, align 4
  %4 = load i32, i32* %2, align 4
  %5 = add nsw i32 %4, 1
  store i32 %5, i32* %3, align 4
  %6 = load i32, i32* %3, align 4
  ret i32 %6
}

在第一个函数中,寄存器%2 缺失(%0 和%1 用于参数);

同样,在第二个函数中,寄存器%1 丢失了。

只是好奇,失踪的有什么用?为什么不一致?

【问题讨论】:

标签: llvm llvm-clang llvm-ir register-allocation


【解决方案1】:

我相信#0 指的是函数本身。而#1/#2 指的是参数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多