More heuristics for Combiner-AA. Still catches all important cases, but

compile time penalty on gnugo, the worst case in MultiSource, is down to
about 2.5% from 30%

llvm-svn: 83824
This commit is contained in:
Nate Begeman 2009-10-12 05:53:58 +00:00
parent 00f4a355eb
commit d27f450262

View File

@ -6230,13 +6230,28 @@ void DAGCombiner::GatherAllAliases(SDNode *N, SDValue OriginalChain,
// Starting off. // Starting off.
Chains.push_back(OriginalChain); Chains.push_back(OriginalChain);
unsigned Depth = 0;
// Look at each chain and determine if it is an alias. If so, add it to the // Look at each chain and determine if it is an alias. If so, add it to the
// aliases list. If not, then continue up the chain looking for the next // aliases list. If not, then continue up the chain looking for the next
// candidate. // candidate.
while (!Chains.empty()) { while (!Chains.empty()) {
SDValue Chain = Chains.back(); SDValue Chain = Chains.back();
Chains.pop_back(); Chains.pop_back();
// For TokenFactor nodes, look at each operand and only continue up the
// chain until we find two aliases. If we've seen two aliases, assume we'll
// find more and revert to original chain since the xform is unlikely to be
// profitable.
//
// FIXME: The depth check could be made to return the last non-aliasing
// chain we found before we hit a tokenfactor rather than the original
// chain.
if (Depth > 6 || Aliases.size() == 2) {
Aliases.clear();
Aliases.push_back(OriginalChain);
break;
}
// Don't bother if we've been before. // Don't bother if we've been before.
if (!Visited.insert(Chain.getNode())) if (!Visited.insert(Chain.getNode()))
@ -6268,8 +6283,7 @@ void DAGCombiner::GatherAllAliases(SDNode *N, SDValue OriginalChain,
} else { } else {
// Look further up the chain. // Look further up the chain.
Chains.push_back(Chain.getOperand(0)); Chains.push_back(Chain.getOperand(0));
// Clean up old chain. ++Depth;
AddToWorkList(Chain.getNode());
} }
break; break;
} }
@ -6285,8 +6299,7 @@ void DAGCombiner::GatherAllAliases(SDNode *N, SDValue OriginalChain,
} }
for (unsigned n = Chain.getNumOperands(); n;) for (unsigned n = Chain.getNumOperands(); n;)
Chains.push_back(Chain.getOperand(--n)); Chains.push_back(Chain.getOperand(--n));
// Eliminate the token factor if we can. ++Depth;
AddToWorkList(Chain.getNode());
break; break;
default: default:
@ -6312,7 +6325,7 @@ SDValue DAGCombiner::FindBetterChain(SDNode *N, SDValue OldChain) {
// If a single operand then chain to it. We don't need to revisit it. // If a single operand then chain to it. We don't need to revisit it.
return Aliases[0]; return Aliases[0];
} }
// Construct a custom tailored token factor. // Construct a custom tailored token factor.
return DAG.getNode(ISD::TokenFactor, N->getDebugLoc(), MVT::Other, return DAG.getNode(ISD::TokenFactor, N->getDebugLoc(), MVT::Other,
&Aliases[0], Aliases.size()); &Aliases[0], Aliases.size());