// Recursive call for construction of match lists void ArchDesc::buildMList(MatchNode *node, const char *rootOp, const char *resultOp, Predicate *pred, const char *cost) { const char *leftstr, *rightstr; const char *resultop; const char *opcode; MatchNode *mnode; Form *form; leftstr = rightstr = NULL; // Do not process leaves of the Match Tree if they are not ideal if ((node) && (node->_lChild == NULL) && (node->_rChild == NULL) && ((form = (Form *)_globalNames[node->_opType]) != NULL) && (!form->ideal_only())) { return; } // Identify index position among ideal operands intptr_t index = _last_opcode; const char *indexStr = node ? node->_opType : (char *) " "; index = (intptr_t)_idealIndex[indexStr]; if (index == 0) { fprintf(stderr, "error: operand \"%s\" not found\n", indexStr); assert(0, "fatal error"); } // Build MatchLists for children // Check each child for an internal operand name, and use that name // for the parent's matchlist entry if it exists mnode = node->_lChild; if (mnode) { buildMList(mnode, NULL, NULL, NULL, NULL); leftstr = mnode->_internalop ? mnode->_internalop : mnode->_opType; } mnode = node->_rChild; if (mnode) { buildMList(mnode, NULL, NULL, NULL, NULL); rightstr = mnode->_internalop ? mnode->_internalop : mnode->_opType; } // Grab the string for the opcode of this list entry if (rootOp == NULL) { opcode = (node->_internalop) ? node->_internalop : node->_opType; } else { opcode = rootOp; } // Grab the string for the result of this list entry if (resultOp == NULL) { resultop = (node->_internalop) ? node->_internalop : node->_opType; } else resultop = resultOp; // Search for an identical matchlist entry already on the list if ((_mlistab[index] == NULL) || (_mlistab[index] && !_mlistab[index]->search(opcode, resultop, leftstr, rightstr, pred))) { // Place this match rule at front of list MatchList *mList = new MatchList(_mlistab[index],pred,cost, opcode, resultop, leftstr, rightstr); _mlistab[index] = mList; } }