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

Reply via email to