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
This commit is contained in:
Chris Lattner 2010-02-27 08:11:15 +00:00
parent 9fcd72b71a
commit 247896272a
3 changed files with 18 additions and 8 deletions

View File

@ -267,7 +267,12 @@ bool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const {
} }
// TODO: CheckMultiOpcodeMatcher? // 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<CheckTypeMatcher>(M))
return getOpcodeName() == "ISD::STORE" && CT->getType() != MVT::isVoid;
return false; return false;
} }
@ -307,4 +312,8 @@ bool CheckChildTypeMatcher::isContradictoryImpl(const Matcher *M) const {
return false; return false;
} }
bool CheckIntegerMatcher::isContradictoryImpl(const Matcher *M) const {
if (const CheckIntegerMatcher *CIM = dyn_cast<CheckIntegerMatcher>(M))
return CIM->getValue() != getValue();
return false;
}

View File

@ -511,6 +511,7 @@ private:
return cast<CheckIntegerMatcher>(M)->Value == Value; return cast<CheckIntegerMatcher>(M)->Value == Value;
} }
virtual unsigned getHashImpl() const { return 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 /// CheckCondCodeMatcher - This checks to see if the current node is a

View File

@ -202,14 +202,14 @@ static void FactorNodes(OwningPtr<Matcher> &MatcherPtr) {
} }
if (Scan != e) { if (Scan != e) {
DEBUG(errs() << "Couldn't merge this:\n "; DEBUG(errs() << "Couldn't merge this:\n";
Optn->printOne(errs()); Optn->print(errs(), 4);
errs() << "into this:\n "; errs() << "into this:\n";
OptionsToMatch[OptionIdx]->printOne(errs()); OptionsToMatch[Scan]->print(errs(), 4);
if (OptionIdx+1 != e) if (OptionIdx+1 != e)
OptionsToMatch[OptionIdx+1]->printOne(errs()); OptionsToMatch[Scan+1]->printOne(errs());
if (OptionIdx+2 < e) if (OptionIdx+2 < e)
OptionsToMatch[OptionIdx+2]->printOne(errs()); OptionsToMatch[Scan+2]->printOne(errs());
errs() << "\n"); errs() << "\n");
} }