]> granicus.if.org Git - clang/commitdiff
Revert "[analyzer] Break cycles (optionally) when trimming an ExplodedGraph."
authorJordan Rose <jordan_rose@apple.com>
Fri, 22 Mar 2013 21:15:33 +0000 (21:15 +0000)
committerJordan Rose <jordan_rose@apple.com>
Fri, 22 Mar 2013 21:15:33 +0000 (21:15 +0000)
The algorithm used here was ridiculously slow when a potential back-edge
pointed to a node that already had a lot of successors. The previous commit
makes this feature unnecessary anyway.

This reverts r177468 / f4cf6b10f863b9bc716a09b2b2a8c497dcc6aa9b.

Conflicts:

lib/StaticAnalyzer/Core/BugReporter.cpp

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

include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h
lib/StaticAnalyzer/Core/BugReporter.cpp
lib/StaticAnalyzer/Core/ExplodedGraph.cpp

index 208c12bd748bb499ef2098f02c8c8c7cb78d9d47..5211916407c8f463a6fb4c7d917c6f99714e082f 100644 (file)
@@ -363,16 +363,12 @@ public:
   ///
   /// \param Nodes The nodes which must appear in the final graph. Presumably
   ///              these are end-of-path nodes (i.e. they have no successors).
-  /// \param BreakCycles Whether or not the trimmed graph should make an effort
-  ///                    to eliminate cycles. Note that this may result in some
-  ///                    unnecessary nodes being included in the final graph
-  ///                    (i.e. nodes that would have only appeared in a cycle).
   /// \param[out] ForwardMap A optional map from nodes in this graph to nodes in
   ///                        the returned graph.
   /// \param[out] InverseMap An optional map from nodes in the returned graph to
   ///                        nodes in this graph.
   /// \returns The trimmed graph
-  ExplodedGraph *trim(ArrayRef<const NodeTy *> Nodes, bool BreakCycles = false,
+  ExplodedGraph *trim(ArrayRef<const NodeTy *> Nodes,
                       InterExplodedGraphMap *ForwardMap = 0,
                       InterExplodedGraphMap *InverseMap = 0) const;
 
index ab80d9e8ac70540afaa95d5ad7fd7e117d89a1ce..8f8eb3bb8502377b011f149bdf146c0102b9fcfd 100644 (file)
@@ -1936,8 +1936,7 @@ TrimmedGraph::TrimmedGraph(const ExplodedGraph *OriginalGraph,
   // The trimmed graph is created in the body of the constructor to ensure
   // that the DenseMaps have been initialized already.
   InterExplodedGraphMap ForwardMap;
-  G.reset(OriginalGraph->trim(Nodes, /*BreakCycles=*/false,
-                              &ForwardMap, &InverseMap));
+  G.reset(OriginalGraph->trim(Nodes, &ForwardMap, &InverseMap));
 
   // Find the (first) error node in the trimmed graph.  We just need to consult
   // the node map which maps from nodes in the original graph to nodes
index f9d4345baef680540226591f98d70598f5ae2ae9..ca466d89070c82ebafb481c62e3755c9fc18c54c 100644 (file)
@@ -331,22 +331,8 @@ ExplodedNode *ExplodedGraph::getNode(const ProgramPoint &L,
   return V;
 }
 
-static bool isDescendent(const ExplodedNode *Parent, const ExplodedNode *Child){
-  SmallVector<const ExplodedNode *, 16> WL;
-  WL.push_back(Parent);
-
-  while (!WL.empty()) {
-    const ExplodedNode *N = WL.pop_back_val();
-    if (N == Child)
-      return true;
-    WL.append(N->succ_begin(), N->succ_end());
-  }
-
-  return false;
-}
-
 ExplodedGraph *
-ExplodedGraph::trim(ArrayRef<const NodeTy *> Sinks, bool BreakCycles,
+ExplodedGraph::trim(ArrayRef<const NodeTy *> Sinks,
                     InterExplodedGraphMap *ForwardMap,
                     InterExplodedGraphMap *InverseMap) const{
 
@@ -443,8 +429,7 @@ ExplodedGraph::trim(ArrayRef<const NodeTy *> Sinks, bool BreakCycles,
          I != E; ++I) {
       Pass2Ty::iterator PI = Pass2.find(*I);
       if (PI != Pass2.end()) {
-        if (!BreakCycles || !isDescendent(PI->second, NewN))
-          const_cast<ExplodedNode *>(PI->second)->addPredecessor(NewN, *G);
+        const_cast<ExplodedNode *>(PI->second)->addPredecessor(NewN, *G);
         continue;
       }