Factor the ReachesChainWithoutSideEffects out of dag combiner into
authorChris Lattner <sabre@nondot.org>
Wed, 16 Jan 2008 05:49:24 +0000 (05:49 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 16 Jan 2008 05:49:24 +0000 (05:49 +0000)
a public SDOperand::reachesChainWithoutSideEffects method.  No
functionality change.

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

include/llvm/CodeGen/SelectionDAGNodes.h
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index 30823833b7925dabfbc5b47b083c74ac0e1512cc..fe1d4b68c2e69ae74ddabb2c7f9bed013763784b 100644 (file)
@@ -780,6 +780,14 @@ public:
   inline bool isTargetOpcode() const;
   inline unsigned getTargetOpcode() const;
 
+  
+  /// reachesChainWithoutSideEffects - Return true if this operand (which must
+  /// be a chain) reaches the specified operand without crossing any 
+  /// side-effecting instructions.  In practice, this looks through token
+  /// factors and non-volatile loads.  In order to remain efficient, this only
+  /// looks a couple of nodes in, it does not do an exhaustive search.
+  bool reachesChainWithoutSideEffects(SDOperand Dest, unsigned Depth = 2) const;
+  
   /// hasOneUse - Return true if there is exactly one operation using this
   /// result value of the defining operator.
   inline bool hasOneUse() const;
index 0bb11fa330b038a48056c45780f71bd09e4252a7..09e0c3e0008829cc5802c0f52e9c509eddbe997a 100644 (file)
@@ -4122,33 +4122,6 @@ SDOperand DAGCombiner::visitLOAD(SDNode *N) {
   return SDOperand();
 }
 
-/// ReachesChainWithoutSideEffects - Do a little local search to see if Src can
-/// reach Dest without any side effects like a store, or call.  Non-volatile
-/// loads are ok though.
-static bool ReachesChainWithoutSideEffects(SDOperand Src, SDOperand Dest,
-                                           unsigned Depth = 0) {
-  if (Src == Dest) return true;
-  
-  // Don't search too deeply, we just want to be able to see through
-  // TokenFactor's etc.
-  if (Depth == 2) return false;
-  
-  // If this is a token factor, all inputs to the TF happen in parallel.  If any
-  // of the operands of the TF reach dest, then we can do the xform.
-  if (Src.getOpcode() == ISD::TokenFactor) {
-    for (unsigned i = 0, e = Src.getNumOperands(); i != e; ++i)
-      if (ReachesChainWithoutSideEffects(Src.getOperand(i), Dest, Depth+1))
-        return true;
-    return false;
-  }
-  
-  // Loads don't have side effects, look through them.
-  if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(Src)) {
-    if (!Ld->isVolatile())
-      return ReachesChainWithoutSideEffects(Ld->getChain(), Dest, Depth+1);
-  }
-  return false;
-}
 
 SDOperand DAGCombiner::visitSTORE(SDNode *N) {
   StoreSDNode *ST  = cast<StoreSDNode>(N);
@@ -4283,7 +4256,7 @@ SDOperand DAGCombiner::visitSTORE(SDNode *N) {
         !ST->isVolatile() &&
         // There can't be any side effects between the load and store, such as
         // a call or store.
-        ReachesChainWithoutSideEffects(Chain, SDOperand(Ld, 1))) {
+        Chain.reachesChainWithoutSideEffects(SDOperand(Ld, 1))) {
       // The store is dead, remove it.
       return Chain;
     }
index 381e9dec646c3996df0d23a99a454415e582bd49..67da854aa4f26bc284293df2852388400c1a3e28 100644 (file)
@@ -3562,6 +3562,37 @@ bool SDNode::isOperand(SDNode *N) const {
   return false;
 }
 
+/// reachesChainWithoutSideEffects - Return true if this operand (which must
+/// be a chain) reaches the specified operand without crossing any 
+/// side-effecting instructions.  In practice, this looks through token
+/// factors and non-volatile loads.  In order to remain efficient, this only
+/// looks a couple of nodes in, it does not do an exhaustive search.
+bool SDOperand::reachesChainWithoutSideEffects(SDOperand Dest, 
+                                               unsigned Depth) const {
+  if (*this == Dest) return true;
+  
+  // Don't search too deeply, we just want to be able to see through
+  // TokenFactor's etc.
+  if (Depth == 0) return false;
+  
+  // If this is a token factor, all inputs to the TF happen in parallel.  If any
+  // of the operands of the TF reach dest, then we can do the xform.
+  if (getOpcode() == ISD::TokenFactor) {
+    for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
+      if (getOperand(i).reachesChainWithoutSideEffects(Dest, Depth-1))
+        return true;
+    return false;
+  }
+  
+  // Loads don't have side effects, look through them.
+  if (LoadSDNode *Ld = dyn_cast<LoadSDNode>(*this)) {
+    if (!Ld->isVolatile())
+      return Ld->getChain().reachesChainWithoutSideEffects(Dest, Depth-1);
+  }
+  return false;
+}
+
+
 static void findPredecessor(SDNode *N, const SDNode *P, bool &found,
                             SmallPtrSet<SDNode *, 32> &Visited) {
   if (found || !Visited.insert(N))