Я пытаюсь глубже понять процесс выбора команд в llvm и для этого я отлаживаю пошаговую функцию CodeGenAndEmitDAG. Я напечатал небольшую функцию (см. Ниже) непосредственно перед шагом комбайна - первым шагом в вышеуказанной функции. На графике я вижу синие линии, и кажется, что они всегда указывают на «ch», что, я думаю, означает «другой» тип машинного значения. То, что я не понимаю, - это смысл синих линий ... что это за зависимость? И правильно ли я имею в виду значение «ch»? это «другое»? Что такое машинное значение типа «other» mean in llvm SDnodes
ответ
Пунктирные синие стрелки представляют собой зависимости от потока данных между командами и обеспечивают выполнение определенного порядка между ними. Например, магазины и грузы, которые могут обращаться к одной и той же памяти, не должны переупорядочиваться, , хотя между ними нет зависимости данных. В таких случаях для представления такой скрытой зависимости используются синие стрелки . Эти синие стрелки потребляют значения цепей (ch) типа Other
.
Каждая DAG имеет специальный EntryToken
типа Other
, который поставляет начальное значение цепочки для базового блока.
Рассмотрим следующий пример. Обратите внимание на зависимость управления (синяя стрелка) между загрузкой и хранением, поскольку они могут указывать на одну и ту же память. Также обратите внимание на красную стрелку (Клей), которая склеивает две инструкции вместе.
int foo(int *a, int *b) {
a[0] = 42;
return b[0];
}
имеют смысл, но о синей линии между copyToReg (0x2efac80 - после инструкции по загрузке) в инструкции магазина? инструкция загрузки действительно зависит от магазина, но инструкции после нагрузки должны зависеть от нагрузки, а не от хранилища ... – yehudahs
Я пытаюсь понять эти узлы, линии и типы тоже, пожалуйста, вы можете предоставить любые полезные ссылки или ключевые слова. Заранее спасибо. –
вы можете проверить следующий файл в коде llvm: include/llvm/CodeGen/ISDOpcodes.h - есть некоторые объяснения там. – yehudahs