[llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp

Evan Cheng evan.cheng at apple.com
Thu Jan 19 17:11:15 PST 2006



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;
       }






More information about the llvm-commits mailing list