diff options
author | Chris Lattner <sabre@nondot.org> | 2010-02-16 19:19:58 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-02-16 19:19:58 +0000 |
commit | 6bc1b51377d86c7f9ec422ab6962d3051dc92de2 (patch) | |
tree | 324c38a60b9ea5ff4a19226623afc0c103f4b2d9 | |
parent | 21390d79843050ae8b3226860cadc16ff51d0dcf (diff) | |
download | external_llvm-6bc1b51377d86c7f9ec422ab6962d3051dc92de2.zip external_llvm-6bc1b51377d86c7f9ec422ab6962d3051dc92de2.tar.gz external_llvm-6bc1b51377d86c7f9ec422ab6962d3051dc92de2.tar.bz2 |
simplify this code. In the new world order there is no
need to scan the entire subtree of the pattern anymore.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96369 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | utils/TableGen/DAGISelMatcherGen.cpp | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/utils/TableGen/DAGISelMatcherGen.cpp b/utils/TableGen/DAGISelMatcherGen.cpp index fac5824..84e9a3d 100644 --- a/utils/TableGen/DAGISelMatcherGen.cpp +++ b/utils/TableGen/DAGISelMatcherGen.cpp @@ -186,36 +186,33 @@ void MatcherGen::EmitOperatorMatchCode(const TreePatternNode *N, // If this node has a chain, then the chain is operand #0 is the SDNode, and // the child numbers of the node are all offset by one. unsigned OpNo = 0; - if (N->NodeHasProperty(SDNPHasChain, CGP)) + if (N->NodeHasProperty(SDNPHasChain, CGP)) { OpNo = 1; - // If this node is not the root and the subtree underneath it produces a - // chain, then the result of matching the node is also produce a chain. - // Beyond that, this means that we're also folding (at least) the root node - // into the node that produce the chain (for example, matching - // "(add reg, (load ptr))" as a add_with_memory on X86). This is problematic, - // if the 'reg' node also uses the load (say, its chain). Graphically: - // - // [LD] - // ^ ^ - // | \ DAG's like cheese. - // / | - // / [YY] - // | ^ - // [XX]--/ - // - // It would be invalid to fold XX and LD. In this case, folding the two - // nodes together would induce a cycle in the DAG, making it a cyclic DAG (!). - // To prevent this, we emit a dynamic check for legality before allowing this - // to be folded. - // - const TreePatternNode *Root = Pattern.getSrcPattern(); - if (N != Root && // Not the root of the pattern. - N->TreeHasProperty(SDNPHasChain, CGP)) { // Has a chain somewhere in tree. + // If this node is not the root and the subtree underneath it produces a + // chain, then the result of matching the node is also produce a chain. + // Beyond that, this means that we're also folding (at least) the root node + // into the node that produce the chain (for example, matching + // "(add reg, (load ptr))" as a add_with_memory on X86). This is + // problematic, if the 'reg' node also uses the load (say, its chain). + // Graphically: + // + // [LD] + // ^ ^ + // | \ DAG's like cheese. + // / | + // / [YY] + // | ^ + // [XX]--/ + // + // It would be invalid to fold XX and LD. In this case, folding the two + // nodes together would induce a cycle in the DAG, making it a 'cyclic DAG' + // To prevent this, we emit a dynamic check for legality before allowing + // this to be folded. + // + const TreePatternNode *Root = Pattern.getSrcPattern(); + if (N != Root) { // Not the root of the pattern. - // If this non-root node produces a chain, we may need to emit a validity - // check. - if (OpNo != 0) { // If there is a node between the root and this node, then we definitely // need to emit the check. bool NeedCheck = !Root->hasChild(N); |