X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FPatternMatch.h;h=fda925f5a9a8c2fe4b712df4618c0538a60a4423;hb=38b06447615440f935008a2141bd0a1fe078d437;hp=98964eb235745564036a5e22a90c457a03260339;hpb=159c35b3ee500b521d682cf585e61dea2858d0dc;p=oota-llvm.git diff --git a/include/llvm/Support/PatternMatch.h b/include/llvm/Support/PatternMatch.h index 98964eb2357..fda925f5a9a 100644 --- a/include/llvm/Support/PatternMatch.h +++ b/include/llvm/Support/PatternMatch.h @@ -57,7 +57,7 @@ struct constantint_ty { bool match(ITy *V) { if (const ConstantInt *CI = dyn_cast(V)) { const APInt &CIV = CI->getValue(); - if (Val > 0) + if (Val >= 0) return CIV == Val; // If Val is negative, and CI is shorter than it, truncate to the right // number of bits. If it is larger, then we have to sign extend. Just @@ -108,27 +108,27 @@ inline bind_ty m_Value(Value *&V) { return V; } /// m_ConstantInt - Match a ConstantInt, capturing the value if we match. inline bind_ty m_ConstantInt(ConstantInt *&CI) { return CI; } - + /// specificval_ty - Match a specified Value*. struct specificval_ty { const Value *Val; specificval_ty(const Value *V) : Val(V) {} - + template bool match(ITy *V) { return V == Val; } }; - + /// m_Specific - Match if we have a specific specified value. inline specificval_ty m_Specific(const Value *V) { return V; } - + //===----------------------------------------------------------------------===// // Matchers for specific binary operators. // -template struct BinaryOp_match { LHS_t L; @@ -156,18 +156,36 @@ inline BinaryOp_match m_Add(const LHS &L, return BinaryOp_match(L, R); } +template +inline BinaryOp_match m_FAdd(const LHS &L, + const RHS &R) { + return BinaryOp_match(L, R); +} + template inline BinaryOp_match m_Sub(const LHS &L, const RHS &R) { return BinaryOp_match(L, R); } +template +inline BinaryOp_match m_FSub(const LHS &L, + const RHS &R) { + return BinaryOp_match(L, R); +} + template inline BinaryOp_match m_Mul(const LHS &L, const RHS &R) { return BinaryOp_match(L, R); } +template +inline BinaryOp_match m_FMul(const LHS &L, + const RHS &R) { + return BinaryOp_match(L, R); +} + template inline BinaryOp_match m_UDiv(const LHS &L, const RHS &R) { @@ -223,19 +241,19 @@ inline BinaryOp_match m_Xor(const LHS &L, } template -inline BinaryOp_match m_Shl(const LHS &L, +inline BinaryOp_match m_Shl(const LHS &L, const RHS &R) { return BinaryOp_match(L, R); } template -inline BinaryOp_match m_LShr(const LHS &L, +inline BinaryOp_match m_LShr(const LHS &L, const RHS &R) { return BinaryOp_match(L, R); } template -inline BinaryOp_match m_AShr(const LHS &L, +inline BinaryOp_match m_AShr(const LHS &L, const RHS &R) { return BinaryOp_match(L, R); } @@ -310,14 +328,14 @@ struct BinaryOpClass_match { template inline BinaryOpClass_match m_Shift(Instruction::BinaryOps &Op, const LHS &L, const RHS &R) { - return BinaryOpClass_match(Op, L, R); } template inline BinaryOpClass_match m_Shift(const LHS &L, const RHS &R) { - return BinaryOpClass_match(L, R); } @@ -395,7 +413,7 @@ m_Select(const Cond &C, const LHS &L, const RHS &R) { template inline SelectClass_match, constantint_ty > m_SelectCst(const Cond &C) { - return SelectClass_match, + return SelectClass_match, constantint_ty >(C, m_ConstantInt(), m_ConstantInt()); } @@ -408,9 +426,9 @@ m_SelectCst(const Cond &C) { template struct CastClass_match { Op_t Op; - + CastClass_match(const Op_t &OpMatch) : Op(OpMatch) {} - + template bool match(OpTy *V) { if (Class *I = dyn_cast(V)) @@ -424,7 +442,7 @@ inline CastClass_match m_Cast(const OpTy &Op) { return CastClass_match(Op); } - + //===----------------------------------------------------------------------===// // Matchers for unary operators // @@ -468,9 +486,9 @@ inline not_match m_Not(const LHS &L) { return L; } template struct neg_match { LHS_t L; - + neg_match(const LHS_t &LHS) : L(LHS) {} - + template bool match(OpTy *V) { if (Instruction *I = dyn_cast(V)) @@ -494,6 +512,35 @@ template inline neg_match m_Neg(const LHS &L) { return L; } +template +struct fneg_match { + LHS_t L; + + fneg_match(const LHS_t &LHS) : L(LHS) {} + + template + bool match(OpTy *V) { + if (Instruction *I = dyn_cast(V)) + if (I->getOpcode() == Instruction::FSub) + return matchIfFNeg(I->getOperand(0), I->getOperand(1)); + if (ConstantExpr *CE = dyn_cast(V)) + if (CE->getOpcode() == Instruction::FSub) + return matchIfFNeg(CE->getOperand(0), CE->getOperand(1)); + if (ConstantFP *CF = dyn_cast(V)) + return L.match(ConstantExpr::getFNeg(CF)); + return false; + } +private: + bool matchIfFNeg(Value *LHS, Value *RHS) { + return LHS == ConstantExpr::getZeroValueForNegationExpr(LHS->getType()) && + L.match(RHS); + } +}; + +template +inline fneg_match m_FNeg(const LHS &L) { return L; } + + //===----------------------------------------------------------------------===// // Matchers for control flow //