Changes in directory llvm/utils/TableGen:
DAGISelEmitter.cpp updated: 1.138 -> 1.139 --- Log message: 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 --- Diffs of the changes: (+9 -6) DAGISelEmitter.cpp | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.138 llvm/utils/TableGen/DAGISelEmitter.cpp:1.139 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.138 Thu Jan 19 15:57:10 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Thu Jan 19 19:11:03 2006 @@ -1907,18 +1907,21 @@ // 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; } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits