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