Adds a new backend to power the GISel Combiners using the InstructionSelector's match tables. This does not depend on any of the data structures created for the current combiner and is intended to replace it entirely. See the RFC for more details: https://discourse.llvm.org/t/rfc-matchtable-based-globalisel-combiners/71457/6 Note: this would replace D141135. Reviewed By: aemerson, arsenm Differential Revision: https://reviews.llvm.org/D153757
73 lines
2.9 KiB
C++
73 lines
2.9 KiB
C++
//===- CombinerUtils.h ----------------------------------------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
/// \file Utility functions used by both Combiner backends.
|
|
/// TODO: Can remove when MatchDAG-based backend is removed.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_UTILS_TABLEGEN_COMBINERUTILS_H
|
|
#define LLVM_UTILS_TABLEGEN_COMBINERUTILS_H
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/TableGen/Record.h"
|
|
|
|
namespace llvm {
|
|
|
|
/// A convenience function to check that an Init refers to a specific def. This
|
|
/// is primarily useful for testing for defs and similar in DagInit's since
|
|
/// DagInit's support any type inside them.
|
|
inline bool isSpecificDef(const Init &N, StringRef Def) {
|
|
if (const DefInit *OpI = dyn_cast<DefInit>(&N))
|
|
if (OpI->getDef()->getName() == Def)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
/// A convenience function to check that an Init refers to a def that is a
|
|
/// subclass of the given class and coerce it to a def if it is. This is
|
|
/// primarily useful for testing for subclasses of GIMatchKind and similar in
|
|
/// DagInit's since DagInit's support any type inside them.
|
|
inline Record *getDefOfSubClass(const Init &N, StringRef Cls) {
|
|
if (const DefInit *OpI = dyn_cast<DefInit>(&N))
|
|
if (OpI->getDef()->isSubClassOf(Cls))
|
|
return OpI->getDef();
|
|
return nullptr;
|
|
}
|
|
|
|
/// A convenience function to check that an Init refers to a dag whose operator
|
|
/// is a specific def and coerce it to a dag if it is. This is primarily useful
|
|
/// for testing for subclasses of GIMatchKind and similar in DagInit's since
|
|
/// DagInit's support any type inside them.
|
|
inline const DagInit *getDagWithSpecificOperator(const Init &N,
|
|
StringRef Name) {
|
|
if (const DagInit *I = dyn_cast<DagInit>(&N))
|
|
if (I->getNumArgs() > 0)
|
|
if (const DefInit *OpI = dyn_cast<DefInit>(I->getOperator()))
|
|
if (OpI->getDef()->getName() == Name)
|
|
return I;
|
|
return nullptr;
|
|
}
|
|
|
|
/// A convenience function to check that an Init refers to a dag whose operator
|
|
/// is a def that is a subclass of the given class and coerce it to a dag if it
|
|
/// is. This is primarily useful for testing for subclasses of GIMatchKind and
|
|
/// similar in DagInit's since DagInit's support any type inside them.
|
|
inline const DagInit *getDagWithOperatorOfSubClass(const Init &N,
|
|
StringRef Cls) {
|
|
if (const DagInit *I = dyn_cast<DagInit>(&N))
|
|
if (I->getNumArgs() > 0)
|
|
if (const DefInit *OpI = dyn_cast<DefInit>(I->getOperator()))
|
|
if (OpI->getDef()->isSubClassOf(Cls))
|
|
return I;
|
|
return nullptr;
|
|
}
|
|
} // namespace llvm
|
|
|
|
#endif
|