Как mlir::cast преобразует объекты в производные классы?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как mlir::cast преобразует объекты в производные классы?

Сообщение Anonymous »

Руководство программиста LLVM дает краткое представление о том, как работает llvm::cast:
:
Оператор приведения является операцией «проверенного приведения». Он преобразует указатель или ссылку из базового класса в производный класс, что приводит к сбою утверждения, если на самом деле это не экземпляр правильного типа. Это следует использовать в тех случаях, когда у вас есть некоторая информация, которая заставляет вас поверить, что что-то относится к правильному типу. Пример шаблона isa и cast:

Код: Выделить всё

static bool isLoopInvariant(const Value *V, const Loop *L) {
if (isa(V) || isa(V) || isa(V))
return true;

// Otherwise, it must be an instruction...
return !L->contains(cast(V)->getParent());
}
Однако он не определяет никакого другого использования, кроме ссылок или указателей. Более того, существует отдельный mlir::cast, который интуитивно должен следовать тому же соглашению, но не имеет никакой документации. При разработке MLIR Pass я столкнулся со следующей проблемой:

Код: Выделить всё

// op is mlir::tosa::TransposeOp
auto val = op.getOperand(0); // returns mlir::Value
if (val.getType().getShape().size() > 4) // compilation failure
...
Код не скомпилируется, поскольку mlir::Value::getType возвращает mlir::Type базовый класс, который не предоставляет никакой информации об измерении тензора. Однако по определению tosa.transpose я знаю, что операнд должен быть тензорным. В то же время mlir::tosa::TransposeOp::getOperand(int) возвращает mlir::Value (а не ссылку или указатель), поэтому кажется, что я не могу просто «привести» его к производному типу, однако, если я сделаю следующее:

Код: Выделить всё

auto val = mlir::cast(op.getOperand(0));
if (val.getType().getShape().size() > 4)
...
Все кажется работает (даже возвращает правильную форму).
Мне трудно понять, как это приведение может работать правильно. Предоставляет ли mlir::Value каким-то волшебным образом необходимую информацию для создания mlir::TypedValue, или я наблюдаю какой-то UB, который случайно дает ожидаемый результат?

Подробнее здесь: https://stackoverflow.com/questions/797 ... ed-classes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»