Prevent folding of a node with multiple uses if the node already folds a load!
authorEvan Cheng <evan.cheng@apple.com>
Fri, 20 Jan 2006 01:11:03 +0000 (01:11 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 20 Jan 2006 01:11:03 +0000 (01:11 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25471 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/DAGISelEmitter.cpp

index f9f5504f76c1d11a48139bedbedd3c2fe5fce423..466adec50ac4e71431d905629e56c885af356f78 100644 (file)
@@ -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;
       }