simplify DAGCombiner::SimplifySelectOps step #2/2.
authorChris Lattner <sabre@nondot.org>
Tue, 21 Sep 2010 15:58:55 +0000 (15:58 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 21 Sep 2010 15:58:55 +0000 (15:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114437 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/DAGCombiner.cpp

index f43fd699dc083d23289839fcf4895e28afff0ac6..65926adbe730b400b7ef6ba3d47ee80082f59ec4 100644 (file)
@@ -6609,65 +6609,63 @@ bool DAGCombiner::SimplifySelectOps(SDNode *TheSelect, SDValue LHS,
         RLD->getPointerInfo().getAddrSpace() != 0)
       return false;
         
+    // Check that the select condition doesn't reach either load.  If so,
+    // folding this will induce a cycle into the DAG.  If not, this is safe to
+    // xform, so create a select of the addresses.
     SDValue Addr;
     if (TheSelect->getOpcode() == ISD::SELECT) {
-      // Check that the condition doesn't reach either load.  If so, folding
-      // this will induce a cycle into the DAG.
-      if ((!LLD->hasAnyUseOfValue(1) ||
-           !LLD->isPredecessorOf(TheSelect->getOperand(0).getNode())) &&
-          (!RLD->hasAnyUseOfValue(1) ||
-           !RLD->isPredecessorOf(TheSelect->getOperand(0).getNode()))) {
-        Addr = DAG.getNode(ISD::SELECT, TheSelect->getDebugLoc(),
-                           LLD->getBasePtr().getValueType(),
-                           TheSelect->getOperand(0), LLD->getBasePtr(),
-                           RLD->getBasePtr());
-      }
+      SDNode *CondNode = TheSelect->getOperand(0).getNode();
+      if ((LLD->hasAnyUseOfValue(1) && LLD->isPredecessorOf(CondNode)) ||
+          (RLD->hasAnyUseOfValue(1) && RLD->isPredecessorOf(CondNode)))
+        return false;
+      Addr = DAG.getNode(ISD::SELECT, TheSelect->getDebugLoc(),
+                         LLD->getBasePtr().getValueType(),
+                         TheSelect->getOperand(0), LLD->getBasePtr(),
+                         RLD->getBasePtr());
     } else {  // Otherwise SELECT_CC
-      // Check that the condition doesn't reach either load.  If so, folding
-      // this will induce a cycle into the DAG.
-      if ((!LLD->hasAnyUseOfValue(1) ||
-           (!LLD->isPredecessorOf(TheSelect->getOperand(0).getNode()) &&
-            !LLD->isPredecessorOf(TheSelect->getOperand(1).getNode()))) &&
-          (!RLD->hasAnyUseOfValue(1) ||
-           (!RLD->isPredecessorOf(TheSelect->getOperand(0).getNode()) &&
-            !RLD->isPredecessorOf(TheSelect->getOperand(1).getNode())))) {
-        Addr = DAG.getNode(ISD::SELECT_CC, TheSelect->getDebugLoc(),
-                           LLD->getBasePtr().getValueType(),
-                           TheSelect->getOperand(0),
-                           TheSelect->getOperand(1),
-                           LLD->getBasePtr(), RLD->getBasePtr(),
-                           TheSelect->getOperand(4));
-      }
-    }
-
-    if (Addr.getNode()) {
-      SDValue Load;
-      if (LLD->getExtensionType() == ISD::NON_EXTLOAD) {
-        Load = DAG.getLoad(TheSelect->getValueType(0),
-                           TheSelect->getDebugLoc(),
-                           // FIXME: Discards pointer info.
-                           LLD->getChain(), Addr, MachinePointerInfo(),
-                           LLD->isVolatile(), LLD->isNonTemporal(),
-                           LLD->getAlignment());
-      } else {
-        Load = DAG.getExtLoad(LLD->getExtensionType(),
-                              TheSelect->getValueType(0),
-                              TheSelect->getDebugLoc(),
-                              // FIXME: Discards pointer info.
-                              LLD->getChain(), Addr, MachinePointerInfo(),
-                              LLD->getMemoryVT(), LLD->isVolatile(),
-                              LLD->isNonTemporal(), LLD->getAlignment());
-      }
+      SDNode *CondLHS = TheSelect->getOperand(0).getNode();
+      SDNode *CondRHS = TheSelect->getOperand(1).getNode();
 
-      // Users of the select now use the result of the load.
-      CombineTo(TheSelect, Load);
-
-      // Users of the old loads now use the new load's chain.  We know the
-      // old-load value is dead now.
-      CombineTo(LHS.getNode(), Load.getValue(0), Load.getValue(1));
-      CombineTo(RHS.getNode(), Load.getValue(0), Load.getValue(1));
-      return true;
-    }
+      if ((LLD->hasAnyUseOfValue(1) &&
+           (LLD->isPredecessorOf(CondLHS) || LLD->isPredecessorOf(CondRHS))) ||
+          (LLD->hasAnyUseOfValue(1) &&
+           (LLD->isPredecessorOf(CondLHS) || LLD->isPredecessorOf(CondRHS))))
+        return false;
+      
+      Addr = DAG.getNode(ISD::SELECT_CC, TheSelect->getDebugLoc(),
+                         LLD->getBasePtr().getValueType(),
+                         TheSelect->getOperand(0),
+                         TheSelect->getOperand(1),
+                         LLD->getBasePtr(), RLD->getBasePtr(),
+                         TheSelect->getOperand(4));
+    }
+
+    SDValue Load;
+    if (LLD->getExtensionType() == ISD::NON_EXTLOAD) {
+      Load = DAG.getLoad(TheSelect->getValueType(0),
+                         TheSelect->getDebugLoc(),
+                         // FIXME: Discards pointer info.
+                         LLD->getChain(), Addr, MachinePointerInfo(),
+                         LLD->isVolatile(), LLD->isNonTemporal(),
+                         LLD->getAlignment());
+    } else {
+      Load = DAG.getExtLoad(LLD->getExtensionType(),
+                            TheSelect->getValueType(0),
+                            TheSelect->getDebugLoc(),
+                            // FIXME: Discards pointer info.
+                            LLD->getChain(), Addr, MachinePointerInfo(),
+                            LLD->getMemoryVT(), LLD->isVolatile(),
+                            LLD->isNonTemporal(), LLD->getAlignment());
+    }
+
+    // Users of the select now use the result of the load.
+    CombineTo(TheSelect, Load);
+
+    // Users of the old loads now use the new load's chain.  We know the
+    // old-load value is dead now.
+    CombineTo(LHS.getNode(), Load.getValue(0), Load.getValue(1));
+    CombineTo(RHS.getNode(), Load.getValue(0), Load.getValue(1));
+    return true;
   }
 
   return false;