Clang需要很长时间来编译LLVM IR大型数组

时间:2018-06-01 17:39:27

标签: clang llvm llvm-clang llvm-ir

我正在尝试编译包含一些大型数组(400个元素)的LLVM IR代码。当我尝试用clang编译它时(不运行,只编译) - 它需要超过10分钟。

IR Code

define i32 @main() {
  %j = alloca double
  %i = alloca double
  %foo = alloca [400 x double]
  %B = alloca [400 x [400 x double]]
  %A = alloca [400 x [400 x double]]
  %1 = insertvalue [400 x double] undef, double 0.000000e+00, 0
  %2 = insertvalue [400 x [400 x double]] undef, [400 x double] %1, 0
  store [400 x [400 x double]] %2, [400 x [400 x double]]* %A
  %3 = insertvalue [400 x double] undef, double 0.000000e+00, 0
  %4 = insertvalue [400 x double] undef, double 0.000000e+00, 0
  %5 = insertvalue [400 x [400 x double]] undef, [400 x double] %4, 0
  store [400 x [400 x double]] %5, [400 x [400 x double]]* %B
  %6 = insertvalue [400 x double] undef, double 0.000000e+00, 0
  store [400 x double] %6, [400 x double]* %foo
  store double 0.000000e+00, double* %i

  ret i32 0
}

要运行的命令:clang out.ll -o built

修改

我认为这与clang尝试创建数组或其他东西有关。当我制作更大的数组时,clang构建需要更长的时间,但运行程序需要大约相同的时间。对我来说,为什么会发生这种情况并没有多大意义,但看起来确实如此。

版本

LLVM:Apple LLVM version 9.0.0 (clang-900.0.39.2)

Clang:clang version 6.0.0 (tags/RELEASE_600/final)

(从评论中添加) 如何让这花费更少的时间? ......这需要很长时间,这似乎很奇怪。我知道有一种方法可以减少时间,因为,例如,C能够使数组变得很大,并且可以立即编译。

编辑2

我尝试实现malloc以便在堆上而不是堆栈上分配数组。这是一些新的IR代码。我的问题是这是分配到哪里的?当我生成多维数组时,它仍然非常慢 - 在这种情况下,我将如何再次加速它?

%foo = alloca [400 x [400 x double]]
%calltmp1 = call i8* @malloc(i64 10240000)
%4 = bitcast i8* %calltmp1 to [400 x [400 x double]]*

%5 = getelementptr [400 x [400 x double]], [400 x [400 x double]]* %4, i32 0, i32 0

%calltmp2 = call i8* @malloc(i64 25600)
%6 = bitcast i8* %calltmp2 to [400 x double]*

%7 = getelementptr [400 x double], [400 x double]* %6, i32 0, i32 0
store double 1.000000e+00, double* %7
%8 = getelementptr [400 x double], [400 x double]* %6, i32 0, i32 1
store double 1.000000e+00, double* %8
%9 = getelementptr [400 x double], [400 x double]* %6, i32 0, i32 1
store double 1.000000e+00, double* %9

%initialized_array3 = load [400 x double], [400 x double]* %6
store [400 x double] %initialized_array3, [400 x double]* %5

%initialized_array4 = load [400 x [400 x double]], [400 x [400 x double]]* %4
store [400 x [400 x double]] %initialized_array4, [400 x [400 x double]]* %foo

编辑3

很抱歉所有的修改,但我认为额外的信息是有帮助的。

以下是我生成的更多IR代码:

  %foo = alloca [400 x [400 x double]]
  store [400 x [400 x double]] undef, [400 x [400 x double]]* %foo

  %0 = getelementptr [400 x [400 x double]], [400 x [400 x double]]* %foo, i32 0, i32 0
  %1 = getelementptr [400 x double], [400 x double]* %0, i32 0, i32 0
  store double 1.598000e+03, double* %1

几乎与此{1}}生成的IR代码相同:

c

然而, %1 = alloca [400 x [400 x i32]], align 16 %2 = alloca i32*, align 8 %3 = getelementptr inbounds [400 x [400 x i32]], [400 x [400 x i32]]* %1, i64 0, i64 0 %4 = getelementptr inbounds [400 x i32], [400 x i32]* %3, i64 0, i64 0 store i32 1, i32* %4, align 16 代码在不到一秒的时间内编译,而我的代码需要太长时间才能分辨出来。这是因为第一个代码段中的第2行(下面是参考)。为什么这会导致铿锵声如此缓慢?

线减慢速度:

c

0 个答案:

没有答案