change dag isel emitter to only call 'IsProfitableToFold' on nodes

with chains.  On interior nodes that lead up to them, we just directly
check that there is a single use.  This generates slightly more
efficient code.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96366 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-02-16 19:03:34 +00:00
parent 1665b0a224
commit 29c6270328

View File

@ -568,9 +568,12 @@ void PatternCodeEmitter::EmitMatchCode(TreePatternNode *N, TreePatternNode *P,
// Check if it's profitable to fold the node. e.g. Check for multiple uses // Check if it's profitable to fold the node. e.g. Check for multiple uses
// of actual result? // of actual result?
std::string ParentName(RootName.begin(), RootName.end()-1); std::string ParentName(RootName.begin(), RootName.end()-1);
emitCheck("IsProfitableToFold(" + getValueName(RootName) + if (!NodeHasChain) {
", " + getNodeName(ParentName) + ", N)"); // If this is just an interior node, check to see if it has a single
if (NodeHasChain) { // use. If the node has multiple uses and the pattern has a load as
// an operand, then we can't fold the load.
emitCheck(getValueName(RootName) + ".hasOneUse()");
} else {
// If the immediate use can somehow reach this node through another // If the immediate use can somehow reach this node through another
// path, then can't fold it either or it will create a cycle. // path, then can't fold it either or it will create a cycle.
// e.g. In the following diagram, XX can reach ld through YY. If // e.g. In the following diagram, XX can reach ld through YY. If
@ -588,6 +591,8 @@ void PatternCodeEmitter::EmitMatchCode(TreePatternNode *N, TreePatternNode *P,
// We know we need the check if N's parent is not the root. // We know we need the check if N's parent is not the root.
bool NeedCheck = P != Pattern; bool NeedCheck = P != Pattern;
if (!NeedCheck) { if (!NeedCheck) {
// If the parent is the root and the node has more than one operand,
// we need to check.
const SDNodeInfo &PInfo = CGP.getSDNodeInfo(P->getOperator()); const SDNodeInfo &PInfo = CGP.getSDNodeInfo(P->getOperator());
NeedCheck = NeedCheck =
P->getOperator() == CGP.get_intrinsic_void_sdnode() || P->getOperator() == CGP.get_intrinsic_void_sdnode() ||
@ -600,8 +605,13 @@ void PatternCodeEmitter::EmitMatchCode(TreePatternNode *N, TreePatternNode *P,
} }
if (NeedCheck) { if (NeedCheck) {
emitCheck("IsProfitableToFold(" + getValueName(RootName) +
", " + getNodeName(ParentName) + ", N)");
emitCheck("IsLegalToFold(" + getValueName(RootName) + emitCheck("IsLegalToFold(" + getValueName(RootName) +
", " + getNodeName(ParentName) + ", N)"); ", " + getNodeName(ParentName) + ", N)");
} else {
// Otherwise, just verify that the node only has a single use.
emitCheck(getValueName(RootName) + ".hasOneUse()");
} }
} }
} }