mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-16 08:29:08 +00:00
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:
parent
00f4a355eb
commit
d27f450262
@ -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());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user