From 247896272a8b812900b27ee85c8b1d347b4752d8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 27 Feb 2010 08:11:15 +0000 Subject: [PATCH] teach the optimizer that opcode == ISD::STORE is contradictory with getType() == MVT::i32 etc. Teach it that two different integer constants are contradictory. This cuts 1K off the X86 table, down to 98k git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97314 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/DAGISelMatcher.cpp | 13 +++++++++++-- utils/TableGen/DAGISelMatcher.h | 1 + utils/TableGen/DAGISelMatcherOpt.cpp | 12 ++++++------ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/utils/TableGen/DAGISelMatcher.cpp b/utils/TableGen/DAGISelMatcher.cpp index dfb23614150..601ac87ea46 100644 --- a/utils/TableGen/DAGISelMatcher.cpp +++ b/utils/TableGen/DAGISelMatcher.cpp @@ -267,7 +267,12 @@ bool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const { } // TODO: CheckMultiOpcodeMatcher? - // TODO: CheckType? + + // This is a special common case we see a lot in the X86 backend, we know that + // ISD::STORE nodes can't have non-void type. + if (const CheckTypeMatcher *CT = dyn_cast(M)) + return getOpcodeName() == "ISD::STORE" && CT->getType() != MVT::isVoid; + return false; } @@ -307,4 +312,8 @@ bool CheckChildTypeMatcher::isContradictoryImpl(const Matcher *M) const { return false; } - +bool CheckIntegerMatcher::isContradictoryImpl(const Matcher *M) const { + if (const CheckIntegerMatcher *CIM = dyn_cast(M)) + return CIM->getValue() != getValue(); + return false; +} diff --git a/utils/TableGen/DAGISelMatcher.h b/utils/TableGen/DAGISelMatcher.h index b4de0e4fcf0..f983f5a133b 100644 --- a/utils/TableGen/DAGISelMatcher.h +++ b/utils/TableGen/DAGISelMatcher.h @@ -511,6 +511,7 @@ private: return cast(M)->Value == Value; } virtual unsigned getHashImpl() const { return Value; } + virtual bool isContradictoryImpl(const Matcher *M) const; }; /// CheckCondCodeMatcher - This checks to see if the current node is a diff --git a/utils/TableGen/DAGISelMatcherOpt.cpp b/utils/TableGen/DAGISelMatcherOpt.cpp index 045d5011e70..d475dad4965 100644 --- a/utils/TableGen/DAGISelMatcherOpt.cpp +++ b/utils/TableGen/DAGISelMatcherOpt.cpp @@ -202,14 +202,14 @@ static void FactorNodes(OwningPtr &MatcherPtr) { } if (Scan != e) { - DEBUG(errs() << "Couldn't merge this:\n "; - Optn->printOne(errs()); - errs() << "into this:\n "; - OptionsToMatch[OptionIdx]->printOne(errs()); + DEBUG(errs() << "Couldn't merge this:\n"; + Optn->print(errs(), 4); + errs() << "into this:\n"; + OptionsToMatch[Scan]->print(errs(), 4); if (OptionIdx+1 != e) - OptionsToMatch[OptionIdx+1]->printOne(errs()); + OptionsToMatch[Scan+1]->printOne(errs()); if (OptionIdx+2 < e) - OptionsToMatch[OptionIdx+2]->printOne(errs()); + OptionsToMatch[Scan+2]->printOne(errs()); errs() << "\n"); } -- 2.34.1