Add support for pattern matching cast operations
authorChris Lattner <sabre@nondot.org>
Mon, 18 Sep 2006 05:17:11 +0000 (05:17 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 18 Sep 2006 05:17:11 +0000 (05:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30454 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/PatternMatch.h

index 7bf85e1a128a9cb2223d2496cb4b42c67c0a4992..4d745d6c2e41e4e41b4e8d7aeb213844d417b1da 100644 (file)
@@ -271,6 +271,39 @@ private:
 template<typename LHS>
 inline not_match<LHS> m_Not(const LHS &L) { return L; }
 
+
+template<typename Op_t>
+struct cast_match {
+  Op_t Op;
+  const Type **DestTy;
+  
+  cast_match(const Op_t &op, const Type **destTy) : Op(op), DestTy(destTy) {}
+  
+  template<typename OpTy>
+  bool match(OpTy *V) {
+    if (CastInst *I = dyn_cast<CastInst>(V)) {
+      if (DestTy) *DestTy = I->getType();
+      return Op.match(I->getOperand(0));
+    } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
+      if (CE->getOpcode() == Instruction::Cast) {
+        if (DestTy) *DestTy = I->getType();
+        return Op.match(CE->getOperand(0));
+      }
+    }
+    return false;
+  }
+};
+
+template<typename Op_t>
+inline cast_match<Op_t> m_Cast(const Op_t &Op, const Type *&Ty) {
+  return cast_match<Op_t>(Op, &Ty);
+}
+template<typename Op_t>
+inline cast_match<Op_t> m_Cast(const Op_t &Op) {
+  return cast_match<Op_t>(Op, 0);
+}
+
+
 //===----------------------------------------------------------------------===//
 // Matchers for control flow
 //