diff options
author | Chris Lattner <sabre@nondot.org> | 2010-02-28 00:22:30 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-02-28 00:22:30 +0000 |
commit | 225798143dbec36685f9d1e2fa82f5c4e70b0bf5 (patch) | |
tree | 41d8015147c4cd21aef5d8dd3a57f4064a517bcf /utils/TableGen/DAGISelMatcher.cpp | |
parent | 874cadaf210d4ab05eadc64a41228df0f5078eb7 (diff) |
Generalize my hack to use SDNodeInfo to find out when a
node is always guaranteed to have a particular type
instead of hacking in ISD::STORE explicitly. This allows
us to use implied types for a broad range of nodes, even
target specific ones.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97355 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/DAGISelMatcher.cpp')
-rw-r--r-- | utils/TableGen/DAGISelMatcher.cpp | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/utils/TableGen/DAGISelMatcher.cpp b/utils/TableGen/DAGISelMatcher.cpp index ade058ef5f..3ea5b5d7fb 100644 --- a/utils/TableGen/DAGISelMatcher.cpp +++ b/utils/TableGen/DAGISelMatcher.cpp @@ -260,25 +260,6 @@ unsigned CompleteMatchMatcher::getHashImpl() const { // isContradictoryImpl Implementations. -bool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const { - if (const CheckOpcodeMatcher *COM = dyn_cast<CheckOpcodeMatcher>(M)) { - // One node can't have two different opcodes! - return &COM->getOpcode() != &getOpcode(); - } - - // TODO: CheckMultiOpcodeMatcher? - - // 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)) - // FIXME: This sucks, get void nodes from type constraints. - return (getOpcode().getEnumName() == "ISD::STORE" || - getOpcode().getEnumName() == "ISD::INTRINSIC_VOID") && - CT->getType() != MVT::isVoid; - - return false; -} - static bool TypesAreContradictory(MVT::SimpleValueType T1, MVT::SimpleValueType T2) { // If the two types are the same, then they are the same, so they don't @@ -297,6 +278,32 @@ static bool TypesAreContradictory(MVT::SimpleValueType T1, return true; } +bool CheckOpcodeMatcher::isContradictoryImpl(const Matcher *M) const { + if (const CheckOpcodeMatcher *COM = dyn_cast<CheckOpcodeMatcher>(M)) { + // One node can't have two different opcodes! + return &COM->getOpcode() != &getOpcode(); + } + + // TODO: CheckMultiOpcodeMatcher? + + // If the node has a known type, and if the type we're checking for is + // different, then we know they contradict. For example, a check for + // ISD::STORE will never be true at the same time a check for Type i32 is. + if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M)) { + // FIXME: What result is this referring to? + unsigned NodeType; + if (getOpcode().getNumResults() == 0) + NodeType = MVT::isVoid; + else + NodeType = getOpcode().getKnownType(); + if (NodeType != EEVT::isUnknown) + return TypesAreContradictory((MVT::SimpleValueType)NodeType, + CT->getType()); + } + + return false; +} + bool CheckTypeMatcher::isContradictoryImpl(const Matcher *M) const { if (const CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(M)) return TypesAreContradictory(getType(), CT->getType()); |