xref: /freebsd-src/contrib/llvm-project/llvm/utils/TableGen/Common/GlobalISel/CombinerUtils.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1*0fca6ea1SDimitry Andric //===- CombinerUtils.h ----------------------------------------------------===//
2*0fca6ea1SDimitry Andric //
3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0fca6ea1SDimitry Andric //
7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===//
8*0fca6ea1SDimitry Andric //
9*0fca6ea1SDimitry Andric /// \file Utility functions used by both Combiner backends.
10*0fca6ea1SDimitry Andric //
11*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===//
12*0fca6ea1SDimitry Andric 
13*0fca6ea1SDimitry Andric #ifndef LLVM_UTILS_TABLEGEN_COMBINERUTILS_H
14*0fca6ea1SDimitry Andric #define LLVM_UTILS_TABLEGEN_COMBINERUTILS_H
15*0fca6ea1SDimitry Andric 
16*0fca6ea1SDimitry Andric #include "llvm/ADT/StringRef.h"
17*0fca6ea1SDimitry Andric #include "llvm/TableGen/Record.h"
18*0fca6ea1SDimitry Andric 
19*0fca6ea1SDimitry Andric namespace llvm {
20*0fca6ea1SDimitry Andric 
21*0fca6ea1SDimitry Andric /// A convenience function to check that an Init refers to a specific def. This
22*0fca6ea1SDimitry Andric /// is primarily useful for testing for defs and similar in DagInit's since
23*0fca6ea1SDimitry Andric /// DagInit's support any type inside them.
24*0fca6ea1SDimitry Andric inline bool isSpecificDef(const Init &N, StringRef Def) {
25*0fca6ea1SDimitry Andric   if (const DefInit *OpI = dyn_cast<DefInit>(&N))
26*0fca6ea1SDimitry Andric     if (OpI->getDef()->getName() == Def)
27*0fca6ea1SDimitry Andric       return true;
28*0fca6ea1SDimitry Andric   return false;
29*0fca6ea1SDimitry Andric }
30*0fca6ea1SDimitry Andric 
31*0fca6ea1SDimitry Andric /// A convenience function to check that an Init refers to a def that is a
32*0fca6ea1SDimitry Andric /// subclass of the given class and coerce it to a def if it is. This is
33*0fca6ea1SDimitry Andric /// primarily useful for testing for subclasses of GIDefKind and similar in
34*0fca6ea1SDimitry Andric /// DagInit's since DagInit's support any type inside them.
35*0fca6ea1SDimitry Andric inline Record *getDefOfSubClass(const Init &N, StringRef Cls) {
36*0fca6ea1SDimitry Andric   if (const DefInit *OpI = dyn_cast<DefInit>(&N))
37*0fca6ea1SDimitry Andric     if (OpI->getDef()->isSubClassOf(Cls))
38*0fca6ea1SDimitry Andric       return OpI->getDef();
39*0fca6ea1SDimitry Andric   return nullptr;
40*0fca6ea1SDimitry Andric }
41*0fca6ea1SDimitry Andric 
42*0fca6ea1SDimitry Andric /// A convenience function to check that an Init refers to a dag whose operator
43*0fca6ea1SDimitry Andric /// is a specific def and coerce it to a dag if it is. This is primarily useful
44*0fca6ea1SDimitry Andric /// for testing for subclasses of GIDefKind and similar in DagInit's since
45*0fca6ea1SDimitry Andric /// DagInit's support any type inside them.
46*0fca6ea1SDimitry Andric inline const DagInit *getDagWithSpecificOperator(const Init &N,
47*0fca6ea1SDimitry Andric                                                  StringRef Name) {
48*0fca6ea1SDimitry Andric   if (const DagInit *I = dyn_cast<DagInit>(&N))
49*0fca6ea1SDimitry Andric     if (I->getNumArgs() > 0)
50*0fca6ea1SDimitry Andric       if (const DefInit *OpI = dyn_cast<DefInit>(I->getOperator()))
51*0fca6ea1SDimitry Andric         if (OpI->getDef()->getName() == Name)
52*0fca6ea1SDimitry Andric           return I;
53*0fca6ea1SDimitry Andric   return nullptr;
54*0fca6ea1SDimitry Andric }
55*0fca6ea1SDimitry Andric 
56*0fca6ea1SDimitry Andric /// A convenience function to check that an Init refers to a dag whose operator
57*0fca6ea1SDimitry Andric /// is a def that is a subclass of the given class and coerce it to a dag if it
58*0fca6ea1SDimitry Andric /// is. This is primarily useful for testing for subclasses of GIDefKind and
59*0fca6ea1SDimitry Andric /// similar in DagInit's since DagInit's support any type inside them.
60*0fca6ea1SDimitry Andric inline const DagInit *getDagWithOperatorOfSubClass(const Init &N,
61*0fca6ea1SDimitry Andric                                                    StringRef Cls) {
62*0fca6ea1SDimitry Andric   if (const DagInit *I = dyn_cast<DagInit>(&N))
63*0fca6ea1SDimitry Andric     if (const DefInit *OpI = dyn_cast<DefInit>(I->getOperator()))
64*0fca6ea1SDimitry Andric       if (OpI->getDef()->isSubClassOf(Cls))
65*0fca6ea1SDimitry Andric         return I;
66*0fca6ea1SDimitry Andric   return nullptr;
67*0fca6ea1SDimitry Andric }
68*0fca6ea1SDimitry Andric 
69*0fca6ea1SDimitry Andric /// Copies a StringRef into a static pool to preserve it.
70*0fca6ea1SDimitry Andric StringRef insertStrRef(StringRef S);
71*0fca6ea1SDimitry Andric 
72*0fca6ea1SDimitry Andric } // namespace llvm
73*0fca6ea1SDimitry Andric 
74*0fca6ea1SDimitry Andric #endif
75