Разница между XXXISelDAGToDAG и XXXISelLowering в llvm

В настоящее время я изучаю создание пользовательского бэкэнда для цели. В официальных документах llvm https://llvm.org/docs/WritingAnLLVMBackend.html#basic-steps упоминается, что для понижения Dag нам необходимо модифицировать [Target]ISelDAGToDAG.cpp и [Target]ISelLowering.cpp. Я исследовал несколько целей llvm. Но не в состоянии уловить разницу.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Интересный момент, потому что изучение структуры внутреннего кода не является тривиальным, и каждая цель реализуется в отдельной подпапке в папке Target. с несколькими файлами .cpp, .h и .td.

Поскольку в предоставленном вами связь упоминается следующее:

"Также напишите код в XXXISelLowering.cpp, чтобы заменить или удалить операции и типы данных, которые изначально не поддерживаются в SelectionDAG."

Давайте двигаться вперед. Я бы ответил более крупной картинкой, показывающей основные шаги до выбор инструкции, начиная с LLVM IR шаг, который находится в левом верхнем углу, а затем цитирует Начало работы с LLVM Основные библиотеки:

First, a SelectionDAGBuilder instance (see SelectionDAGISel.cpp for details) visits every function and creates a SelectionDAG object for each basic block. During this process, some special IR instructions such as call and ret already need targetspecific idioms—for instance, how to pass call arguments and how to return from a function—to be transformed into SelectionDAG nodes. To solve this issue, the algorithms in the TargetLowering class are used for the first time. This class is an abstract interface that each target must implement, but also has plenty of common functionality used throughout all backends.

To implement this abstract interface, each target declares a TargetLowering subclass named <Target>TargetLowering. Each target also overloads methods that implement how a specific target-independent, high-level node should be lowered to a level closer to the one of this machine. As expected, only a small subset of nodes must be lowered in this way, while the majority of the others are matched and replaced at instruction selection. For instance, in SelectionDAG from sum. bc, the X86TargetLowering::LowerReturn() method (see lib/Target/X86/ X86ISelLowering.cpp) is used to lower the IR ret instruction. While doing this, it generates the X86ISD::RET_FLAG node, which copies the function result to EAX—a target-specific way to handle the function return.

Спасибо за ответ. «Как и ожидалось, только небольшое подмножество узлов должно быть понижено таким образом, в то время как большинство других сопоставляются и заменяются при выборе инструкции ...», это дает мне много смысла. Затем [Target]ISelDAGToDAG.cpp для выбора инструкции, не так ли?

Mannar Amuthan 23.03.2022 16:40

Точно! [Target]ISelDAGToDAG.cpp для выбора инструкций. Например, если вашей целью является SPARC, вы используете этот Иселдагтодаг.cpp для выбора инструкций.

BZKN 23.03.2022 16:56

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