mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-13 14:35:54 +00:00
Prevent folding of a node with multiple uses if the node already folds a load!
Here is an example where the load ended up being done twice: %A = global uint 0 uint %test(uint %B, ubyte %C) { %tmp = load uint *%A; %X = shl uint %tmp, ubyte %C %Cv = sub ubyte 32, %C %Y = shr uint %B, ubyte %Cv %Z = or uint %Y, %X store uint %Z, uint* %A ret uint %Z } ==> subl $4, %esp movl %ebx, (%esp) movl 8(%esp), %edx movl A, %eax movb 12(%esp), %bl movb %bl, %cl shldl %cl, %edx, %eax movb %bl, %cl shldl %cl, %edx, A movl (%esp), %ebx addl $4, %esp ret llvm-svn: 25471
This commit is contained in:
parent
40c6c91f56
commit
d3713a9b9a
@ -1907,18 +1907,21 @@ public:
|
||||
|
||||
// Emit code to load the child nodes and match their contents recursively.
|
||||
unsigned OpNo = 0;
|
||||
bool HasChain = NodeHasProperty(N, SDNodeInfo::SDNPHasChain, ISE);
|
||||
bool NodeHasChain = NodeHasProperty(N, SDNodeInfo::SDNPHasChain, ISE);
|
||||
bool HasChain = PatternHasProperty(N, SDNodeInfo::SDNPHasChain, ISE);
|
||||
if (HasChain) {
|
||||
OpNo = 1;
|
||||
if (NodeHasChain)
|
||||
OpNo = 1;
|
||||
if (!isRoot) {
|
||||
const SDNodeInfo &CInfo = ISE.getSDNodeInfo(N->getOperator());
|
||||
OS << " if (!" << RootName << ".hasOneUse()) goto P"
|
||||
<< PatternNo << "Fail; // Multiple uses of actual result?\n";
|
||||
OS << " if (CodeGenMap.count(" << RootName
|
||||
<< ".getValue(" << CInfo.getNumResults() << "))) goto P"
|
||||
<< PatternNo << "Fail; // Already selected for a chain use?\n";
|
||||
if (NodeHasChain)
|
||||
OS << " if (CodeGenMap.count(" << RootName
|
||||
<< ".getValue(" << CInfo.getNumResults() << "))) goto P"
|
||||
<< PatternNo << "Fail; // Already selected for a chain use?\n";
|
||||
}
|
||||
if (!FoundChain) {
|
||||
if (NodeHasChain && !FoundChain) {
|
||||
OS << " SDOperand Chain = " << RootName << ".getOperand(0);\n";
|
||||
FoundChain = true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user