Что означает машинное значение типа "прочее" в SD-узлах llvm
Я пытаюсь глубже понять процесс выбора инструкций в llvm, и для этого я пошагово отлаживаю функцию CodeGenAndEmitDAG. Я напечатал небольшую функцию (см. Ниже) как раз перед шагом объединения - первый шаг в вышеупомянутой функции. На графике я вижу синие линии, и кажется, что они всегда указывают на "ch", что, я думаю, означает "другой" тип машинного значения. Что я не понимаю, так это значение синих линий... что это за зависимость? И я прав насчет значения "ч"? это "другой"?
1 ответ
Пунктирные синие стрелки представляют не связанные с потоком данных зависимости между инструкциями и обеспечивают определенный порядок между ними. Например, хранилища и загрузки, которые могут обращаться к одной и той же памяти, не должны переупорядочиваться, хотя между ними нет зависимости данных. В таких случаях синие стрелки используются для представления такой скрытой зависимости. Эти синие стрелки потребляют значения цепочки (ch) типа Other
,
Каждый DAG имеет специальный EntryToken
типа Other
который поставляет начальное значение цепочки для основного блока.
Рассмотрим следующий пример. Обратите внимание на зависимость элемента управления (синяя стрелка) между загрузкой и сохранением, поскольку им разрешено указывать на одну и ту же память. Также обратите внимание на красную стрелку (клей), которая склеивает две инструкции вместе.
int foo(int *a, int *b) {
a[0] = 42;
return b[0];
}