Clang在LLVM IR中生成本地存储

时间:2015-07-16 09:27:52

标签: clang llvm llvm-ir

我正在通过Clang学习LLVM IR,并发现C函数如:

--storage-opt='dm.blocksize=64k'

生成此IR(优化已关闭):

int inc(int x)
{
  return x+1;
}

我的问题是确切地知道为什么它首先在本地(x.addr)商店中分配,然后从中加载。

1 个答案:

答案 0 :(得分:5)

因为这是未经优化的代码。 Clang(前端)花费不多(几乎任何?)时间来弄清楚如何使它发出的代码最佳。它将它留给后端优化(LLVM)。局部变量在未优化模式下“在堆栈上”,这意味着alloca。这也意味着x具有可寻址的位置,以后可能会或可能不会使用。如果没有优化,编译器就不知道它是否会被使用,所以保守地生成一个可添加的位置。

int inc(int x)
{
  x = x + 1;
  int* px = &x;
  return x;
}

现在Clang发出:

define i32 @inc(i32 %x) #0 {
entry:
  %x.addr = alloca i32, align 4
  %px = alloca i32*, align 8
  store i32 %x, i32* %x.addr, align 4
  %0 = load i32, i32* %x.addr, align 4
  %add = add nsw i32 %0, 1
  store i32 %add, i32* %x.addr, align 4
  store i32* %x.addr, i32** %px, align 8
  %1 = load i32, i32* %x.addr, align 4
  ret i32 %1
}

现在查看用于指针的地址%x.addr

当然,如果你通过优化器运行它,你会得到:

define i32 @inc(i32 %x) #0 {
entry:
  %add = add nsw i32 %x, 1
  ret i32 %add
}

这可能更符合您对编译器的期望。