mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
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:
parent
1665b0a224
commit
29c6270328
@ -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()");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user