Я пытаюсь скомпилировать код LLVM IR, который содержит несколько больших массивов (400 элементов).Когда я пытаюсь скомпилировать это с помощью clang (не запускать, просто скомпилировать) - это занимает больше 10 минут.
ИК-код
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 может делать массивы такими большими, и он будет компилироваться в кратчайшие сроки.
Edit 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
Edit 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
Это почти идентично этой форме, сгенерированной IR Code 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
Однако код c
компилируется менее чем за секунду, и мой занимает слишком много времени, чтобы даже понять.Это из-за строки 2 в первом фрагменте кода (ниже для справки).Почему это заставляет кланг работать так медленно?
Линия, замедляющая его:
store [400 x [400 x double]] undef, [400 x [400 x double]]* %foo