В моем коде я генерирую следующую функцию:
define i32 @gl.qi([500 x i32] %x, i32 %i) {
entry:
%x. = alloca [500 x i32]
%i. = alloca i32
%0 = alloca [500 x i32]
store [500 x i32] %x, [500 x i32]* %x.
store i32 %i, i32* %i.
%x.1 = load [500 x i32], [500 x i32]* %x.
%i.2 = load i32, i32* %i.
store [500 x i32] %x.1, [500 x i32]* %0
%1 = icmp slt i32 %i.2, 500
br i1 %1, label %in-bound, label %out-of-bound
out-of-bound: ; preds = %entry
call void @gen.panic(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @pool.str.2, i32 0, i32 0))
unreachable
in-bound: ; preds = %entry
%2 = getelementptr inbounds [500 x i32], [500 x i32]* %0, i32 0, i32 %i.2
%idx = load i32, i32* %2
ret i32 %idx
}
. Функцией высокого уровня является использование %i
для индексации %x
, а если %i
выходит за пределы, пани Вместо этого вызывается функция c.
рассмотрим строку магазина:
store [500 x i32] %x, [500 x i32]* %x.
как только я передаю эту функцию opt -O1 -S --verify --verify-each
, она генерирует код, подобный следующему:
define i32 @gl.qi([500 x i32] %x, i32 %i) local_unnamed_addr {
entry:
%0 = alloca [500 x i32], align 4
%x.fca.0.extract = extractvalue [500 x i32] %x, 0
%x.fca.1.extract = extractvalue [500 x i32] %x, 1
%x.fca.2.extract = extractvalue [500 x i32] %x, 2
%x.fca.3.extract = extractvalue [500 x i32] %x, 3
%x.fca.4.extract = extractvalue [500 x i32] %x, 4
%x.fca.5.extract = extractvalue [500 x i32] %x, 5
до 500. Я поставил число на 50000, и оно не остановится.
Это озадачивает. Я не уверен, почему команда store
должна быть расширена до последовательности etractvalue
с, а затем store
с? Есть ли способ отключить эту конкретную оптимизацию, не отключая всю оптимизацию?
Или я смотрю на неправильный способ выполнения этой простой задачи?