You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.7 KiB
50 lines
1.7 KiB
//===- Predicate.cpp - Pattern predicates ---------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "Predicate.h"
|
|
|
|
using namespace mlir;
|
|
using namespace mlir::pdl_to_pdl_interp;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Positions
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Position::~Position() {}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// AttributePosition
|
|
|
|
AttributePosition::AttributePosition(const KeyTy &key) : Base(key) {
|
|
parent = key.first;
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// OperandPosition
|
|
|
|
OperandPosition::OperandPosition(const KeyTy &key) : Base(key) {
|
|
parent = key.first;
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// OperationPosition
|
|
|
|
OperationPosition *OperationPosition::get(StorageUniquer &uniquer,
|
|
ArrayRef<unsigned> index) {
|
|
assert(!index.empty() && "expected at least two indices");
|
|
|
|
// Set the parent position if this isn't the root.
|
|
Position *parent = nullptr;
|
|
if (index.size() > 1) {
|
|
auto *node = OperationPosition::get(uniquer, index.drop_back());
|
|
parent = OperandPosition::get(uniquer, std::make_pair(node, index.back()));
|
|
}
|
|
return uniquer.get<OperationPosition>(
|
|
[parent](OperationPosition *node) { node->parent = parent; }, index);
|
|
}
|