[llvm] r353416 - [DAG] Cleanup unused nodes on failed store-to-load forward combine.

Nirav Dave via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 7 07:38:14 PST 2019


Author: niravd
Date: Thu Feb  7 07:38:14 2019
New Revision: 353416

URL: http://llvm.org/viewvc/llvm-project?rev=353416&view=rev
Log:
[DAG] Cleanup unused nodes on failed store-to-load forward combine.

Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=353416&r1=353415&r2=353416&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Thu Feb  7 07:38:14 2019
@@ -13123,30 +13123,42 @@ SDValue DAGCombiner::ForwardStoreValueTo
   if (LD->getBasePtr().isUndef() || Offset != 0)
     return SDValue();
   // Model necessary truncations / extenstions.
-  SDValue Val;
+  SmallVector<SDNode *, 4> Vals; // Temporaries which may need to be deleted.
+  SDValue Val, RV;
   // Truncate Value To Stored Memory Size.
   do {
     if (!getTruncatedStoreValue(ST, Val))
       continue;
+    if (Vals.empty() || Vals.back() != Val.getNode())
+      Vals.push_back(Val.getNode());
     if (!isTypeLegal(LDMemType))
       continue;
     if (STMemType != LDMemType) {
       // TODO: Support vectors? This requires extract_subvector/bitcast.
       if (!STMemType.isVector() && !LDMemType.isVector() &&
-          STMemType.isInteger() && LDMemType.isInteger())
+          STMemType.isInteger() && LDMemType.isInteger()) {
+        Vals.push_back(Val.getNode());
         Val = DAG.getNode(ISD::TRUNCATE, SDLoc(LD), LDMemType, Val);
-      else
+      } else
         continue;
     }
-    if (!extendLoadedValueToExtension(LD, Val))
-      continue;
-    return ReplaceLd(LD, Val, Chain);
+    if (Vals.empty() || Vals.back() != Val.getNode())
+      Vals.push_back(Val.getNode());
+    if (extendLoadedValueToExtension(LD, Val))
+      RV = ReplaceLd(LD, Val, Chain);
+    else if (Vals.empty() || Vals.back() != Val.getNode())
+      Vals.push_back(Val.getNode());
   } while (false);
 
   // On failure, cleanup dead nodes we may have created.
-  if (Val->use_empty())
-    deleteAndRecombine(Val.getNode());
-  return SDValue();
+  if (Vals.empty() || Vals.back() != Val.getNode())
+    Vals.push_back(Val.getNode());
+  while (!Vals.empty()) {
+    SDNode *Val = Vals.pop_back_val();
+    if (Val->use_empty())
+      recursivelyDeleteUnusedNodes(Val);
+  }
+  return RV;
 }
 
 SDValue DAGCombiner::visitLOAD(SDNode *N) {




More information about the llvm-commits mailing list