svn commit: r274483 - in head/contrib/llvm: lib/CodeGen/SelectionDAG patches

Dimitry Andric dim at FreeBSD.org
Thu Nov 13 21:16:02 UTC 2014


Author: dim
Date: Thu Nov 13 21:16:01 2014
New Revision: 274483
URL: https://svnweb.freebsd.org/changeset/base/274483

Log:
  The fix imported into llvm in r274442 contains some C++11 constructs,
  which gcc in base cannot handle.  Replace these with C++98 equivalents.
  
  While here, add the patch for the adapted fix.
  
  Reported by:	bz, kib
  Pointy hat to:	dim
  MFC after:	1 week
  X-MFC-With:	r274442

Added:
  head/contrib/llvm/patches/patch-r274442-llvm-r221709-debug-oom.diff
Modified:
  head/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Modified: head/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
==============================================================================
--- head/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp	Thu Nov 13 21:15:09 2014	(r274482)
+++ head/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp	Thu Nov 13 21:16:01 2014	(r274483)
@@ -629,8 +629,8 @@ void SDDbgInfo::erase(const SDNode *Node
   DbgValMapType::iterator I = DbgValMap.find(Node);
   if (I == DbgValMap.end())
     return;
-  for (auto &Val: I->second)
-    Val->setIsInvalidated();
+  for (unsigned J = 0, N = I->second.size(); J != N; ++J)
+    I->second[J]->setIsInvalidated();
   DbgValMap.erase(I);
 }
 

Added: head/contrib/llvm/patches/patch-r274442-llvm-r221709-debug-oom.diff
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/contrib/llvm/patches/patch-r274442-llvm-r221709-debug-oom.diff	Thu Nov 13 21:16:01 2014	(r274483)
@@ -0,0 +1,73 @@
+Pull in r221709 from upstream llvm trunk (by Frédéric Riss):
+
+  Totally forget deallocated SDNodes in SDDbgInfo.
+
+  What would happen before that commit is that the SDDbgValues associated with
+  a deallocated SDNode would be marked Invalidated, but SDDbgInfo would keep
+  a map entry keyed by the SDNode pointer pointing to this list of invalidated
+  SDDbgNodes. As the memory gets reused, the list might get wrongly associated
+  with another new SDNode. As the SDDbgValues are cloned when they are transfered,
+  this can lead to an exponential number of SDDbgValues being produced during
+  DAGCombine like in http://llvm.org/bugs/show_bug.cgi?id=20893
+
+  Note that the previous behavior wasn't really buggy as the invalidation made
+  sure that the SDDbgValues won't be used. This commit can be considered a
+  memory optimization and as such is really hard to validate in a unit-test.
+
+This should fix abnormally large memory usage and resulting OOM crashes
+when compiling certain ports with debug information.
+
+Reported by:	Dmitry Marakasov <amdmi3 at amdmi3.ru>
+Upstream PRs:	http://llvm.org/PR19031 http://llvm.org/PR20893
+
+Introduced here: http://svnweb.freebsd.org/changeset/base/274442
+
+Index: include/llvm/CodeGen/SelectionDAG.h
+===================================================================
+--- include/llvm/CodeGen/SelectionDAG.h
++++ include/llvm/CodeGen/SelectionDAG.h
+@@ -127,6 +127,10 @@ class SDDbgInfo {
+       DbgValMap[Node].push_back(V);
+   }
+ 
++  /// \brief Invalidate all DbgValues attached to the node and remove
++  /// it from the Node-to-DbgValues map.
++  void erase(const SDNode *Node);
++
+   void clear() {
+     DbgValMap.clear();
+     DbgValues.clear();
+Index: lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+===================================================================
+--- lib/CodeGen/SelectionDAG/SelectionDAG.cpp
++++ lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+@@ -625,6 +625,15 @@ void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *
+   DeallocateNode(N);
+ }
+ 
++void SDDbgInfo::erase(const SDNode *Node) {
++  DbgValMapType::iterator I = DbgValMap.find(Node);
++  if (I == DbgValMap.end())
++    return;
++  for (unsigned J = 0, N = I->second.size(); J != N; ++J)
++    I->second[J]->setIsInvalidated();
++  DbgValMap.erase(I);
++}
++
+ void SelectionDAG::DeallocateNode(SDNode *N) {
+   if (N->OperandsNeedDelete)
+     delete[] N->OperandList;
+@@ -635,10 +644,9 @@ void SelectionDAG::DeallocateNode(SDNode *N) {
+ 
+   NodeAllocator.Deallocate(AllNodes.remove(N));
+ 
+-  // If any of the SDDbgValue nodes refer to this SDNode, invalidate them.
+-  ArrayRef<SDDbgValue*> DbgVals = DbgInfo->getSDDbgValues(N);
+-  for (unsigned i = 0, e = DbgVals.size(); i != e; ++i)
+-    DbgVals[i]->setIsInvalidated();
++  // If any of the SDDbgValue nodes refer to this SDNode, invalidate
++  // them and forget about that node.
++  DbgInfo->erase(N);
+ }
+ 
+ /// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that


More information about the svn-src-head mailing list