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

Clang需要很长时间来编译LLVM IR大型数组,clang,llvm,llvm-clang,llvm-ir,Clang,Llvm,Llvm Clang,Llvm Ir,我试图编译包含几个大数组(400个元素)的LLVM IR代码。当我尝试用clang编译这个文件时(不是运行,只是编译)——它需要10分钟以上的时间 红外码 要运行的命令:clangout.ll-o builded 编辑 我认为这与试图创建数组或其他东西的叮当声有关。当我制作更大的阵列时,构建程序需要更长的时间,但运行程序所需的时间大致相同。我真的不明白为什么会发生这样的事情,但是,这似乎是正在发生的事情 版本 LLVM:Apple LLVM 9.0.0版(clang-900.0.39.2) 叮当

我试图编译包含几个大数组(400个元素)的LLVM IR代码。当我尝试用clang编译这个文件时(不是运行,只是编译)——它需要10分钟以上的时间

红外码 要运行的命令:
clangout.ll-o builded

编辑 我认为这与试图创建数组或其他东西的叮当声有关。当我制作更大的阵列时,构建程序需要更长的时间,但运行程序所需的时间大致相同。我真的不明白为什么会发生这样的事情,但是,这似乎是正在发生的事情

版本 LLVM:
Apple LLVM 9.0.0版(clang-900.0.39.2)

叮当声:
6.0.0版叮当声(标签/发行版\u 600/最终版)

(从评论中添加) 我如何使这花费更少的时间。。。这似乎很奇怪,要花这么长时间。我知道有一种方法可以使它花费更少的时间,因为,例如,C能够生成那么大的数组,并且它将在短时间内编译

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

%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
这与从c生成的IR代码几乎相同:

  %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
然而,
c
代码在不到一秒钟的时间内编译完成,而我的代码甚至花费了太长的时间才能分辨出来。这是因为第一个代码段中的第2行(以下供参考)。为什么这会导致叮当声跑得这么慢

线路减速:

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

您的clang+llvm版本是什么?你能用full out.ll来测试它吗?您可以尝试某种分析(使用linux
perf record
/
perf report
,或者甚至使用
gdb--args clangout.ll-o builded
,然后
运行
,等等,ctrl-c和
bt
),以了解clang的哪一部分在工作。@osgx我感谢您的帮助!上面的代码是整个out.ll文件。我会在一秒钟内用clang+llvm版本更新帖子。我会看看我是否可以做一些分析,然后再回来这里查看(可能是明天早上)。@osgx刚刚更新了我的问题-不确定这是否是你想要的(对cpp来说是个新手)-让我知道我是否可以/应该做其他事情。再次感谢你的帮助!不确定gdb(很难让它在sierra上运行),但我想我已经实现了回溯(见更新的问题)。我真正的问题是如何使这一过程花费更少的时间。我不太清楚您对二次算法或分析其他线程的要求。这似乎很奇怪,要花这么长时间。我知道有一种方法可以使它花费更少的时间,因为,例如,C能够生成那么大的数组,并且它将在短时间内编译。
store [400 x [400 x double]] undef, [400 x [400 x double]]* %foo