R600/SI: Handle nodes with glue results correctly SITargetLowering::foldOperands()
authorTom Stellard <thomas.stellard@amd.com>
Mon, 3 Jun 2013 17:39:50 +0000 (17:39 +0000)
committerTom Stellard <thomas.stellard@amd.com>
Mon, 3 Jun 2013 17:39:50 +0000 (17:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183133 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/R600/SIISelLowering.cpp

index 826ed9acd3b6e41e8ac8f10e3aec8f4801da98f6..d2cf0dcf20e34a0301443d117f845588f4976aa0 100644 (file)
@@ -700,6 +700,22 @@ SDNode *SITargetLowering::foldOperands(MachineSDNode *Node,
   for (unsigned i = NumOps - NumDefs, e = Node->getNumOperands(); i < e; ++i)
     Ops.push_back(Node->getOperand(i));
 
+  // Nodes that have a glue result are not CSE'd by getMachineNode(), so in
+  // this case a brand new node is always be created, even if the operands
+  // are the same as before.  So, manually check if anything has been changed.
+  if (Desc->Opcode == Opcode) {
+    bool Changed = false;
+    for (unsigned i = 0, e = Node->getNumOperands(); i < e; ++i) {
+      if (Ops[i].getNode() != Node->getOperand(i).getNode()) {
+        Changed = true;
+        break;
+      }
+    }
+    if (!Changed) {
+      return Node;
+    }
+  }
+
   // Create a complete new instruction
   return DAG.getMachineNode(Desc->Opcode, SDLoc(Node), Node->getVTList(), Ops);
 }