Удаление неиспользуемых операций
Информация, содержащаяся в каждой операции, а именно данные о пользователях операции, может быть использована для удаления неиспользуемого кода. Реализация такой трансформации выглядит следующим образом:
void run(const Operation::Ptr &op, OptBuilder &builder) const override {
bool unused = true;
for (const auto &result : op->results)
unused &= result->uses.empty();
if (unused)
builder.erase(op);
}
Здесь происходит вычисление логического выражения, операндами которого является условие «используется ли результат операции?» для каждого результата, порождаемого текущей операцией. На выходе получаем дерево, в котором для каждой операции найдется пользователь ее результата.