Оптимизация генерирует супер длинное определение функции - PullRequest
2 голосов
/ 13 апреля 2020

В моем коде я генерирую следующую функцию:

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 с? Есть ли способ отключить эту конкретную оптимизацию, не отключая всю оптимизацию?

Или я смотрю на неправильный способ выполнения этой простой задачи?

1 Ответ

0 голосов
/ 06 мая 2020

Чтобы сохранить %x в %x, вам необходимо сначала загрузить значения из %x (аргументы вызова функции), а затем сохранить их обратно в %x (локальная переменная). Вот для чего extractvalue и последующие store. То же самое для %i. Так что это не оптимизация. Это просто способ присвоения переменной a другой переменной b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...