Files
clang-p2996/mlir/lib/Query/Matcher/VariantValue.cpp
Denzel-Brian Budii 9b63bdd154 [mlir] Improve mlir-query tool by implementing getBackwardSlice and getForwardSlice matchers (#115670)
Improve mlir-query tool by implementing `getBackwardSlice` and
`getForwardSlice` matchers. As an addition `SetQuery` also needed to be
added to enable custom configuration for each query. e.g: `inclusive`,
`omitUsesFromAbove`, `omitBlockArguments`.

Note: backwardSlice and forwardSlice algoritms are the same as the ones
in `mlir/lib/Analysis/SliceAnalysis.cpp`
Example of current matcher. The query was made to the file:
`mlir/test/mlir-query/complex-test.mlir`

```mlir
./mlir-query /home/dbudii/personal/llvm-project/mlir/test/mlir-query/complex-test.mlir -c "match getDefinitions(hasOpName(\"arith.add
f\"),2)"

Match #1:

/home/dbudii/personal/llvm-project/mlir/test/mlir-query/complex-test.mlir:5:8:
  %0 = linalg.generic {indexing_maps = [#map, #map], iterator_types = ["parallel", "parallel"]} ins(%arg0 : tensor<5x5xf32>) outs(%arg1 : tensor<5x5xf32>) {
       ^
/home/dbudii/personal/llvm-project/mlir/test/mlir-query/complex-test.mlir:7:10: note: "root" binds here
    %2 = arith.addf %in, %in : f32
         ^
Match #2:

/home/dbudii/personal/llvm-project/mlir/test/mlir-query/complex-test.mlir:10:16:
  %collapsed = tensor.collapse_shape %0 [[0, 1]] : tensor<5x5xf32> into tensor<25xf32>
               ^
/home/dbudii/personal/llvm-project/mlir/test/mlir-query/complex-test.mlir:13:11:
    %c2 = arith.constant 2 : index
          ^
/home/dbudii/personal/llvm-project/mlir/test/mlir-query/complex-test.mlir:14:18:
    %extracted = tensor.extract %collapsed[%c2] : tensor<25xf32>
                 ^
/home/dbudii/personal/llvm-project/mlir/test/mlir-query/complex-test.mlir:15:10: note: "root" binds here
    %2 = arith.addf %extracted, %extracted : f32
         ^
2 matches.
```
2025-05-13 13:18:14 +02:00

173 lines
4.3 KiB
C++

//===--- Variantvalue.cpp -------------------------------------------------===//
//
// 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 "mlir/Query/Matcher/VariantValue.h"
namespace mlir::query::matcher {
VariantMatcher::Payload::~Payload() = default;
class VariantMatcher::SinglePayload : public VariantMatcher::Payload {
public:
explicit SinglePayload(DynMatcher matcher) : matcher(std::move(matcher)) {}
std::optional<DynMatcher> getDynMatcher() const override { return matcher; }
std::string getTypeAsString() const override { return "Matcher"; }
private:
DynMatcher matcher;
};
VariantMatcher::VariantMatcher() = default;
VariantMatcher VariantMatcher::SingleMatcher(DynMatcher matcher) {
return VariantMatcher(std::make_shared<SinglePayload>(std::move(matcher)));
}
std::optional<DynMatcher> VariantMatcher::getDynMatcher() const {
return value ? value->getDynMatcher() : std::nullopt;
}
void VariantMatcher::reset() { value.reset(); }
std::string VariantMatcher::getTypeAsString() const { return "<Nothing>"; }
VariantValue::VariantValue(const VariantValue &other)
: type(ValueType::Nothing) {
*this = other;
}
VariantValue::VariantValue(const llvm::StringRef string)
: type(ValueType::String) {
value.String = new llvm::StringRef(string);
}
VariantValue::VariantValue(const VariantMatcher &matcher)
: type(ValueType::Matcher) {
value.Matcher = new VariantMatcher(matcher);
}
VariantValue::VariantValue(int64_t signedValue) : type(ValueType::Signed) {
value.Signed = signedValue;
}
VariantValue::VariantValue(bool setBoolean) : type(ValueType::Boolean) {
value.Boolean = setBoolean;
}
VariantValue::~VariantValue() { reset(); }
VariantValue &VariantValue::operator=(const VariantValue &other) {
if (this == &other)
return *this;
reset();
switch (other.type) {
case ValueType::String:
setString(other.getString());
break;
case ValueType::Matcher:
setMatcher(other.getMatcher());
break;
case ValueType::Signed:
setSigned(other.getSigned());
break;
case ValueType::Boolean:
setBoolean(other.getBoolean());
break;
case ValueType::Nothing:
type = ValueType::Nothing;
break;
}
return *this;
}
void VariantValue::reset() {
switch (type) {
case ValueType::String:
delete value.String;
break;
case ValueType::Matcher:
delete value.Matcher;
break;
// Cases that do nothing.
case ValueType::Signed:
case ValueType::Boolean:
case ValueType::Nothing:
break;
}
type = ValueType::Nothing;
}
// Signed
bool VariantValue::isSigned() const { return type == ValueType::Signed; }
int64_t VariantValue::getSigned() const { return value.Signed; }
void VariantValue::setSigned(int64_t newValue) {
type = ValueType::Signed;
value.Signed = newValue;
}
// Boolean
bool VariantValue::isBoolean() const { return type == ValueType::Boolean; }
bool VariantValue::getBoolean() const { return value.Signed; }
void VariantValue::setBoolean(bool newValue) {
type = ValueType::Boolean;
value.Signed = newValue;
}
bool VariantValue::isString() const { return type == ValueType::String; }
const llvm::StringRef &VariantValue::getString() const {
assert(isString());
return *value.String;
}
void VariantValue::setString(const llvm::StringRef &newValue) {
reset();
type = ValueType::String;
value.String = new llvm::StringRef(newValue);
}
bool VariantValue::isMatcher() const { return type == ValueType::Matcher; }
const VariantMatcher &VariantValue::getMatcher() const {
assert(isMatcher());
return *value.Matcher;
}
void VariantValue::setMatcher(const VariantMatcher &newValue) {
reset();
type = ValueType::Matcher;
value.Matcher = new VariantMatcher(newValue);
}
std::string VariantValue::getTypeAsString() const {
switch (type) {
case ValueType::String:
return "String";
case ValueType::Matcher:
return "Matcher";
case ValueType::Signed:
return "Signed";
case ValueType::Boolean:
return "Boolean";
case ValueType::Nothing:
return "Nothing";
}
llvm_unreachable("Invalid Type");
}
} // namespace mlir::query::matcher