mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 22:04:55 +00:00
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
This commit is contained in:
parent
21390d7984
commit
6bc1b51377
@ -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
|
// 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.
|
// the child numbers of the node are all offset by one.
|
||||||
unsigned OpNo = 0;
|
unsigned OpNo = 0;
|
||||||
if (N->NodeHasProperty(SDNPHasChain, CGP))
|
if (N->NodeHasProperty(SDNPHasChain, CGP)) {
|
||||||
OpNo = 1;
|
OpNo = 1;
|
||||||
|
|
||||||
// If this node is not the root and the subtree underneath it produces a
|
// 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.
|
// 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
|
// Beyond that, this means that we're also folding (at least) the root node
|
||||||
// into the node that produce the chain (for example, matching
|
// into the node that produce the chain (for example, matching
|
||||||
// "(add reg, (load ptr))" as a add_with_memory on X86). This is problematic,
|
// "(add reg, (load ptr))" as a add_with_memory on X86). This is
|
||||||
// if the 'reg' node also uses the load (say, its chain). Graphically:
|
// problematic, if the 'reg' node also uses the load (say, its chain).
|
||||||
//
|
// Graphically:
|
||||||
// [LD]
|
//
|
||||||
// ^ ^
|
// [LD]
|
||||||
// | \ DAG's like cheese.
|
// ^ ^
|
||||||
// / |
|
// | \ DAG's like cheese.
|
||||||
// / [YY]
|
// / |
|
||||||
// | ^
|
// / [YY]
|
||||||
// [XX]--/
|
// | ^
|
||||||
//
|
// [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 (!).
|
// It would be invalid to fold XX and LD. In this case, folding the two
|
||||||
// To prevent this, we emit a dynamic check for legality before allowing this
|
// nodes together would induce a cycle in the DAG, making it a 'cyclic DAG'
|
||||||
// to be folded.
|
// 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.
|
const TreePatternNode *Root = Pattern.getSrcPattern();
|
||||||
N->TreeHasProperty(SDNPHasChain, CGP)) { // Has a chain somewhere in tree.
|
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
|
// If there is a node between the root and this node, then we definitely
|
||||||
// need to emit the check.
|
// need to emit the check.
|
||||||
bool NeedCheck = !Root->hasChild(N);
|
bool NeedCheck = !Root->hasChild(N);
|
||||||
|
Loading…
Reference in New Issue
Block a user