Что означает машинное значение типа "прочее" в SD-узлах llvm

Я пытаюсь глубже понять процесс выбора инструкций в llvm, и для этого я пошагово отлаживаю функцию CodeGenAndEmitDAG. Я напечатал небольшую функцию (см. Ниже) как раз перед шагом объединения - первый шаг в вышеупомянутой функции. На графике я вижу синие линии, и кажется, что они всегда указывают на "ch", что, я думаю, означает "другой" тип машинного значения. Что я не понимаю, так это значение синих линий... что это за зависимость? И я прав насчет значения "ч"? это "другой"?

1 ответ

Решение

Пунктирные синие стрелки представляют не связанные с потоком данных зависимости между инструкциями и обеспечивают определенный порядок между ними. Например, хранилища и загрузки, которые могут обращаться к одной и той же памяти, не должны переупорядочиваться, хотя между ними нет зависимости данных. В таких случаях синие стрелки используются для представления такой скрытой зависимости. Эти синие стрелки потребляют значения цепочки (ch) типа Other,

Каждый DAG имеет специальный EntryToken типа Other который поставляет начальное значение цепочки для основного блока.

Рассмотрим следующий пример. Обратите внимание на зависимость элемента управления (синяя стрелка) между загрузкой и сохранением, поскольку им разрешено указывать на одну и ту же память. Также обратите внимание на красную стрелку (клей), которая склеивает две инструкции вместе.

int foo(int *a, int *b) {
  a[0] = 42;
  return b[0];
}

введите описание изображения здесь

Другие вопросы по тегам