diff mbox series

[committed] analyzer: add enode status and revamp __analyzer_dump_exploded_nodes

Message ID 20200205145508.25352-1-dmalcolm@redhat.com
State New
Headers show
Series [committed] analyzer: add enode status and revamp __analyzer_dump_exploded_nodes | expand

Commit Message

David Malcolm Feb. 5, 2020, 2:55 p.m. UTC
The analyzer recognizes __analyzer_dump_exploded_nodes as a "magic"
function for use in DejaGnu tests: at the end of the pass, it issues
a warning at each such call, dumping the count of exploded nodes seen at
the call, which can be checked in test cases via dg-warning directives,
along with the IDs of the enodes (which is helpful when debugging).

My intent was to give a way of testing the results of the state-merging
code.

The state-merging code can generate duplicate exploded nodes at a point
when state merging occurs, taking a pair of enodes from the worklist
that share a program_point and sufficiently similar state.  For these
cases it generates a merged state, and adds edges from those enodes to
the merged-state enode (potentially a new or a pre-existing enode); the
input enodes don't have process_node called on them.

This means that at a CFG join point there can be an unpredictable number
of enodes that we don't care about, where the precise number depends on
the details of the state-merger code, immediately followed by a more
predictable number that we do care about.

I've been papering over this in the analyzer DejaGnu tests somewhat
by adding pairs of __analyzer_dump_exploded_nodes calls at CFG join
points, where the output at the first call is somewhat arbitrary, and
the second has the number we care about; the first number tends to
change "at random" as I tweak the state merging code, in ways that
aren't interesting, but require the tests to be updated.

See e.g. gcc.dg/analyzer/paths-6.c which had:

  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
  // FIXME: the above can vary between 2 and 3 exploded nodes
  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */

This patch remedies this situation by tracking which enodes are
processed, and which are merely "merger" enodes.  It updates the
output for __analyzer_dump_exploded_nodes so that count of enodes
only includes the *processed* enodes, and that the IDs are split
into "processed" and "merger" enodes.

The patch simplifies the testsuite by eliminating the redundant calls
described above; the example above becomes:

  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */

where the output in question is now:

  warning: 1 processed enode: [EN: 94] merger(s): [EN: 93]

The patch also adds various checks on the status of enodes, to ensure
e.g. that each enode is processed at most once.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to master as a4d3bfc0851ac1b489c4dea5b57dcc08adb20457.

gcc/analyzer/ChangeLog:
	* engine.cc (exploded_node::dump_dot): Show merger enodes.
	(worklist::add_node): Assert that the node's m_status is
	STATUS_WORKLIST.
	(exploded_graph::process_worklist): Likewise for nodes from the
	worklist.  Set status of merged nodes to STATUS_MERGER.
	(exploded_graph::process_node): Set status of node to
	STATUS_PROCESSED.
	(exploded_graph::dump_exploded_nodes): Rework handling of
	"__analyzer_dump_exploded_nodes", splitting enodes by status into
	"processed" and "merger", showing the count of just the processed
	enodes at the call, rather than the count of all enodes.
	* exploded-graph.h (exploded_node::status): New enum.
	(exploded_node::exploded_node): Initialize m_status to
	STATUS_WORKLIST.
	(exploded_node::get_status): New getter.
	(exploded_node::set_status): New setter.
	(exploded_node::m_status): New field.

gcc/ChangeLog:
	* doc/analyzer.texi
	(Special Functions for Debugging the Analyzer): Update description
	of __analyzer_dump_exploded_nodes.

gcc/testsuite/ChangeLog:
	* gcc.dg/analyzer/data-model-1.c: Update for changed output to
	__analyzer_dump_exploded_nodes, dropping redundant call at merger.
	* gcc.dg/analyzer/data-model-7.c: Likewise.
	* gcc.dg/analyzer/loop-2.c: Update for changed output format.
	* gcc.dg/analyzer/loop-2a.c: Likewise.
	* gcc.dg/analyzer/loop-4.c: Likewise.
	* gcc.dg/analyzer/loop.c: Likewise.
	* gcc.dg/analyzer/malloc-paths-10.c: Likewise; drop redundant
	call at merger.
	* gcc.dg/analyzer/malloc-vs-local-1a.c: Likewise.
	* gcc.dg/analyzer/malloc-vs-local-1b.c: Likewise.
	* gcc.dg/analyzer/malloc-vs-local-2.c: Likewise.
	* gcc.dg/analyzer/malloc-vs-local-3.c: Likewise.
	* gcc.dg/analyzer/paths-1.c: Likewise.
	* gcc.dg/analyzer/paths-1a.c: Likewise.
	* gcc.dg/analyzer/paths-2.c: Likewise.
	* gcc.dg/analyzer/paths-3.c: Likewise.
	* gcc.dg/analyzer/paths-4.c: Update for changed output format.
	* gcc.dg/analyzer/paths-5.c: Likewise.
	* gcc.dg/analyzer/paths-6.c: Likewise; drop redundant calls
	at merger.
	* gcc.dg/analyzer/paths-7.c: Likewise.
	* gcc.dg/analyzer/torture/conditionals-2.c: Update for changed
	output format.
	* gcc.dg/analyzer/zlib-1.c: Likewise; drop redundant calls.
	* gcc.dg/analyzer/zlib-5.c: Update for changed output format.
---
 gcc/analyzer/engine.cc                        | 69 +++++++++++++++----
 gcc/analyzer/exploded-graph.h                 | 28 +++++++-
 gcc/doc/analyzer.texi                         | 16 +++--
 gcc/testsuite/gcc.dg/analyzer/data-model-1.c  |  3 +-
 gcc/testsuite/gcc.dg/analyzer/data-model-7.c  |  3 +-
 gcc/testsuite/gcc.dg/analyzer/loop-2.c        |  6 +-
 gcc/testsuite/gcc.dg/analyzer/loop-2a.c       |  6 +-
 gcc/testsuite/gcc.dg/analyzer/loop-4.c        |  8 +--
 gcc/testsuite/gcc.dg/analyzer/loop.c          |  6 +-
 .../gcc.dg/analyzer/malloc-paths-10.c         |  3 +-
 .../gcc.dg/analyzer/malloc-vs-local-1a.c      | 26 ++++---
 .../gcc.dg/analyzer/malloc-vs-local-1b.c      | 25 +++----
 .../gcc.dg/analyzer/malloc-vs-local-2.c       | 24 +++----
 .../gcc.dg/analyzer/malloc-vs-local-3.c       |  9 ++-
 gcc/testsuite/gcc.dg/analyzer/paths-1.c       |  3 +-
 gcc/testsuite/gcc.dg/analyzer/paths-1a.c      |  3 +-
 gcc/testsuite/gcc.dg/analyzer/paths-2.c       |  8 +--
 gcc/testsuite/gcc.dg/analyzer/paths-3.c       | 10 ++-
 gcc/testsuite/gcc.dg/analyzer/paths-4.c       | 24 ++++---
 gcc/testsuite/gcc.dg/analyzer/paths-5.c       |  4 +-
 gcc/testsuite/gcc.dg/analyzer/paths-6.c       | 13 ++--
 gcc/testsuite/gcc.dg/analyzer/paths-7.c       | 13 ++--
 .../gcc.dg/analyzer/torture/conditionals-2.c  |  4 +-
 gcc/testsuite/gcc.dg/analyzer/zlib-1.c        | 21 +++---
 gcc/testsuite/gcc.dg/analyzer/zlib-5.c        |  2 +-
 25 files changed, 192 insertions(+), 145 deletions(-)
diff mbox series

Patch

diff --git a/gcc/analyzer/engine.cc b/gcc/analyzer/engine.cc
index 81b8a76c5eb..63579da953a 100644
--- a/gcc/analyzer/engine.cc
+++ b/gcc/analyzer/engine.cc
@@ -827,6 +827,8 @@  exploded_node::dump_dot (graphviz_out *gv, const dump_args_t &args) const
   pp_write_text_to_stream (pp);
 
   pp_printf (pp, "EN: %i", m_index);
+  if (m_status == STATUS_MERGER)
+    pp_string (pp, " (merger)");
   pp_newline (pp);
 
   format f (true);
@@ -1638,6 +1640,7 @@  worklist::peek_next ()
 void
 worklist::add_node (exploded_node *enode)
 {
+  gcc_assert (enode->get_status () == exploded_node::STATUS_WORKLIST);
   m_queue.insert (key_t (*this, enode), enode);
 }
 
@@ -2124,6 +2127,7 @@  exploded_graph::process_worklist ()
   while (m_worklist.length () > 0)
     {
       exploded_node *node = m_worklist.take_next ();
+      gcc_assert (node->get_status () == exploded_node::STATUS_WORKLIST);
       gcc_assert (node->m_succs.length () == 0
 		  || node == m_origin);
 
@@ -2136,6 +2140,8 @@  exploded_graph::process_worklist ()
       if (flag_analyzer_state_merge && node != m_origin)
 	if (exploded_node *node_2 = m_worklist.peek_next ())
 	  {
+	    gcc_assert (node_2->get_status ()
+			== exploded_node::STATUS_WORKLIST);
 	    gcc_assert (node->m_succs.length () == 0);
 	    gcc_assert (node_2->m_succs.length () == 0);
 
@@ -2181,6 +2187,7 @@  exploded_graph::process_worklist ()
 
 			/* Remove node_2 from the worklist.  */
 			m_worklist.take_next ();
+			node_2->set_status (exploded_node::STATUS_MERGER);
 
 			/* Continue processing "node" below.  */
 		      }
@@ -2190,6 +2197,7 @@  exploded_graph::process_worklist ()
 			   in the worklist, to be processed on the next
 			   iteration.  */
 			add_edge (node, node_2, NULL, change);
+			node->set_status (exploded_node::STATUS_MERGER);
 			continue;
 		      }
 		    else
@@ -2232,12 +2240,18 @@  exploded_graph::process_worklist ()
 			if (merged_enode == node)
 			  m_worklist.add_node (merged_enode);
 			else
-			  add_edge (node, merged_enode, NULL, change);
+			  {
+			    add_edge (node, merged_enode, NULL, change);
+			    node->set_status (exploded_node::STATUS_MERGER);
+			  }
 
 			if (merged_enode == node_2)
 			  m_worklist.add_node (merged_enode);
 			else
-			  add_edge (node_2, merged_enode, NULL, change);
+			  {
+			    add_edge (node_2, merged_enode, NULL, change);
+			    node_2->set_status (exploded_node::STATUS_MERGER);
+			  }
 
 			continue;
 		      }
@@ -2320,6 +2334,8 @@  exploded_graph::process_node (exploded_node *node)
   logger * const logger = get_logger ();
   LOG_FUNC_1 (logger, "EN: %i", node->m_index);
 
+  node->set_status (exploded_node::STATUS_PROCESSED);
+
   const program_point &point = node->get_point ();
 
   /* Update cfun and input_location in case of an ICE: make it easier to
@@ -3180,8 +3196,16 @@  exploded_graph::dump_exploded_nodes () const
     }
 
   /* Emit a warning at any call to "__analyzer_dump_exploded_nodes",
-     giving the number of exploded nodes for "before-stmt", and their
-     IDs.  */
+     giving the number of processed exploded nodes for "before-stmt",
+     and the IDs of processed and merger enodes.
+
+     We highlight the count of *processed* enodes since this is of most
+     interest in DejaGnu tests for ensuring that state merger has
+     happened.
+
+     We don't show the count of merger enodes, as this is more of an
+     implementation detail of the merging that we don't want to bake
+     into our expected DejaGnu messages.  */
 
   unsigned i;
   exploded_node *enode;
@@ -3199,25 +3223,43 @@  exploded_graph::dump_exploded_nodes () const
 	      if (seen.contains (stmt))
 		continue;
 
+	      auto_vec<exploded_node *> processed_enodes;
+	      auto_vec<exploded_node *> merger_enodes;
 	      /* This is O(N^2).  */
 	      unsigned j;
-	      auto_vec<exploded_node *> enodes;
 	      exploded_node *other_enode;
 	      FOR_EACH_VEC_ELT (m_nodes, j, other_enode)
 		{
 		  if (other_enode->get_point ().get_kind () != PK_BEFORE_STMT)
 		    continue;
 		  if (other_enode->get_stmt () == stmt)
-		    enodes.safe_push (other_enode);
+		    switch (other_enode->get_status ())
+		      {
+		      default:
+			gcc_unreachable ();
+		      case exploded_node::STATUS_PROCESSED:
+			processed_enodes.safe_push (other_enode);
+			break;
+		      case exploded_node::STATUS_MERGER:
+			merger_enodes.safe_push (other_enode);
+			break;
+		      }
 		}
 
 	      pretty_printer pp;
-	      print_enode_indices (&pp, enodes);
+	      pp_character (&pp, '[');
+	      print_enode_indices (&pp, processed_enodes);
+	      if (merger_enodes.length () > 0)
+		{
+		  pp_string (&pp, "] merger(s): [");
+		  print_enode_indices (&pp, merger_enodes);
+		}
+	      pp_character (&pp, ']');
 
-	      warning_n (stmt->location, 0, enodes.length (),
-			 "%i exploded node: %s",
-			 "%i exploded nodes: %s",
-			 enodes.length (), pp_formatted_text (&pp));
+	      warning_n (stmt->location, 0, processed_enodes.length (),
+			 "%i processed enode: %s",
+			 "%i processed enodes: %s",
+			 processed_enodes.length (), pp_formatted_text (&pp));
 	      seen.add (stmt);
 
 	      /* If the argument is non-zero, then print all of the states
@@ -3233,10 +3275,11 @@  exploded_graph::dump_exploded_nodes () const
 	      if (i_arg)
 		{
 		  exploded_node *other_enode;
-		  FOR_EACH_VEC_ELT (enodes, j, other_enode)
+		  FOR_EACH_VEC_ELT (processed_enodes, j, other_enode)
 		    {
 		      fprintf (stderr, "%i of %i: EN %i:\n",
-			       j + 1, enodes.length (), other_enode->m_index);
+			       j + 1, processed_enodes.length (),
+			       other_enode->m_index);
 		      other_enode->dump_succs_and_preds (stderr);
 		      /* Dump state.  */
 		      other_enode->get_state ().dump (m_ext_state, false);
diff --git a/gcc/analyzer/exploded-graph.h b/gcc/analyzer/exploded-graph.h
index 6a1b9b20277..e47816a5b6e 100644
--- a/gcc/analyzer/exploded-graph.h
+++ b/gcc/analyzer/exploded-graph.h
@@ -151,9 +151,26 @@  struct eg_traits
 class exploded_node : public dnode<eg_traits>
 {
  public:
+  /* Has this enode had exploded_graph::process_node called on it?
+     This allows us to distinguish enodes that were merged during
+     worklist-handling, and thus never had process_node called on them
+     (in favor of processing the merged node).  */
+  enum status
+  {
+    /* Node is in the worklist.  */
+    STATUS_WORKLIST,
+
+    /* Node has had exploded_graph::process_node called on it.  */
+    STATUS_PROCESSED,
+
+    /* Node was left unprocessed due to merger; it won't have had
+       exploded_graph::process_node called on it.  */
+    STATUS_MERGER
+  };
+
   exploded_node (point_and_state ps,
 		 int index)
-  : m_ps (ps), m_index (index)
+  : m_ps (ps), m_status (STATUS_WORKLIST), m_index (index)
   {
     gcc_checking_assert (ps.get_state ().m_region_model->canonicalized_p ());
   }
@@ -240,6 +257,13 @@  class exploded_node : public dnode<eg_traits>
 
   void dump_succs_and_preds (FILE *outf) const;
 
+  enum status get_status () const { return m_status; }
+  void set_status (enum status status)
+  {
+    gcc_assert (m_status == STATUS_WORKLIST);
+    m_status = status;
+  }
+
 private:
   DISABLE_COPY_AND_ASSIGN (exploded_node);
 
@@ -249,6 +273,8 @@  private:
      is immutable once the exploded_node has been created.  */
   const point_and_state m_ps;
 
+  enum status m_status;
+
 public:
   /* The index of this exploded_node.  */
   const int m_index;
diff --git a/gcc/doc/analyzer.texi b/gcc/doc/analyzer.texi
index 1fe4bcefd1b..4bd1c59d8b6 100644
--- a/gcc/doc/analyzer.texi
+++ b/gcc/doc/analyzer.texi
@@ -469,20 +469,28 @@  __analyzer_dump_path ();
 will emit a placeholder ``note'' diagnostic with a path to that call site,
 if the analyzer finds a feasible path to it.
 
-The builtin @code{__analyzer_dump_exploded_nodes} will dump information
-after analysis on all of the exploded nodes at that program point:
+The builtin @code{__analyzer_dump_exploded_nodes} will emit a warning
+after analysis containing information on all of the exploded nodes at that
+program point:
 
 @smallexample
   __analyzer_dump_exploded_nodes (0);
 @end smallexample
 
-will dump just the number of nodes, and their IDs.
+will output the number of ``processed'' nodes, and the IDs of
+both ``processed'' and ``merger'' nodes, such as:
+
+@smallexample
+warning: 2 processed enodes: [EN: 56, EN: 58] merger(s): [EN: 54-55, EN: 57, EN: 59]
+@end smallexample
+
+With a non-zero argument
 
 @smallexample
   __analyzer_dump_exploded_nodes (1);
 @end smallexample
 
-will also dump all of the states within those nodes.
+it will also dump all of the states within the ``processed'' nodes.
 
 @smallexample
    __analyzer_dump_region_model ();
diff --git a/gcc/testsuite/gcc.dg/analyzer/data-model-1.c b/gcc/testsuite/gcc.dg/analyzer/data-model-1.c
index d75b9fa1db3..e2bd1f9cd36 100644
--- a/gcc/testsuite/gcc.dg/analyzer/data-model-1.c
+++ b/gcc/testsuite/gcc.dg/analyzer/data-model-1.c
@@ -895,8 +895,7 @@  int test_40 (int flag)
     i = 17;
 
   /* With state-merging, we lose the relationship between 'flag' and 'i'.  */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   if (flag)
     __analyzer_eval (i == 43); /* { dg-warning "UNKNOWN" } */
diff --git a/gcc/testsuite/gcc.dg/analyzer/data-model-7.c b/gcc/testsuite/gcc.dg/analyzer/data-model-7.c
index 67a681be607..cb0b33e66c8 100644
--- a/gcc/testsuite/gcc.dg/analyzer/data-model-7.c
+++ b/gcc/testsuite/gcc.dg/analyzer/data-model-7.c
@@ -10,8 +10,7 @@  int test_40 (int flag)
     i = 17;
 
   /* Without state-merging, we retain the relationship between 'flag' and 'i'.  */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   if (flag)
     __analyzer_eval (i == 43); /* { dg-warning "TRUE" } */
diff --git a/gcc/testsuite/gcc.dg/analyzer/loop-2.c b/gcc/testsuite/gcc.dg/analyzer/loop-2.c
index 20728cb6dd3..f106722c247 100644
--- a/gcc/testsuite/gcc.dg/analyzer/loop-2.c
+++ b/gcc/testsuite/gcc.dg/analyzer/loop-2.c
@@ -10,14 +10,14 @@  void test(void)
 {
   struct s s;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
 
   for (s.i=0; s.i<256; s.i++) {
     __analyzer_eval (s.i < 256); /* { dg-warning "TRUE" } */
       /* (should report TRUE twice). */
 
-    __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+    __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
     //__analyzer_eval (s.i == 0); /* { d-todo-g-warning "UNKNOWN" "" { xfail *-*-* } } */
       /* { d-todo-g-warning "TRUE" "" { target *-*-* } .-1 } */
@@ -33,5 +33,5 @@  void test(void)
   /* { dg-warning "UNKNOWN" "status quo" { target *-*-* } .-1 } */
   /* TODO(xfail^^^): ideally it should figure out i == 256 at exit.  */
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 }
diff --git a/gcc/testsuite/gcc.dg/analyzer/loop-2a.c b/gcc/testsuite/gcc.dg/analyzer/loop-2a.c
index 0b1de203f12..a392ffc1a63 100644
--- a/gcc/testsuite/gcc.dg/analyzer/loop-2a.c
+++ b/gcc/testsuite/gcc.dg/analyzer/loop-2a.c
@@ -10,7 +10,7 @@  void test(void)
 {
   union u u;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
 
   for (u.i=0; u.i<256; u.i++) {
@@ -19,7 +19,7 @@  void test(void)
     /* { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-2 } */
     /* (should report TRUE twice). */
 
-    __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+    __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
     //__analyzer_eval (u.i == 0); /* { d-todo-g-warning "UNKNOWN" "" { xfail *-*-* } } */
       /* { d-todo-g-warning "TRUE" "" { target *-*-* } .-1 } */
@@ -36,5 +36,5 @@  void test(void)
   /* { dg-warning "UNKNOWN" "status quo" { target *-*-* } .-1 } */
   /* TODO(xfail^^^): ideally it should figure out i == 256 at exit.  */
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 }
diff --git a/gcc/testsuite/gcc.dg/analyzer/loop-4.c b/gcc/testsuite/gcc.dg/analyzer/loop-4.c
index 2ea44f5d18d..e5767de1f96 100644
--- a/gcc/testsuite/gcc.dg/analyzer/loop-4.c
+++ b/gcc/testsuite/gcc.dg/analyzer/loop-4.c
@@ -9,7 +9,7 @@  void test(void)
 {
   int i, j, k;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   for (i=0; i<256; i++) {
 
@@ -25,7 +25,7 @@  void test(void)
 
       __analyzer_eval (j < 256); /* { dg-warning "TRUE" } */
 
-      __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+      __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
 
       for (k=0; k<256; k++) {
 
@@ -34,10 +34,10 @@  void test(void)
 
 	__analyzer_eval (k < 256); /* { dg-warning "TRUE" } */
 
-	__analyzer_dump_exploded_nodes (0); /* { dg-warning "4 exploded nodes" } */
+	__analyzer_dump_exploded_nodes (0); /* { dg-warning "4 processed enodes" } */
       }
     }
   }
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 }
diff --git a/gcc/testsuite/gcc.dg/analyzer/loop.c b/gcc/testsuite/gcc.dg/analyzer/loop.c
index 0fcc39316c4..37b757bf8f4 100644
--- a/gcc/testsuite/gcc.dg/analyzer/loop.c
+++ b/gcc/testsuite/gcc.dg/analyzer/loop.c
@@ -6,7 +6,7 @@  void test(void)
 {
   int i;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   for (i=0; i<256; i++) {
       __analyzer_eval (i < 256); /* { dg-warning "TRUE" } */
@@ -22,7 +22,7 @@  void test(void)
       /* { dg-warning "UNKNOWN" "status quo" { target *-*-* } .-2 } */
       /* TODO(xfail^^^): ideally we ought to figure out i >= 0 for all iterations.  */
 
-      __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+      __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
   }
 
   __analyzer_eval (i >= 256); /* { dg-warning "TRUE" } */
@@ -31,5 +31,5 @@  void test(void)
   /* { dg-warning "UNKNOWN" "status quo" { target *-*-* } .-1 } */
   /* TODO(xfail^^^): it only figures out i >= 256, rather than i == 256.  */
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 }
diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-paths-10.c b/gcc/testsuite/gcc.dg/analyzer/malloc-paths-10.c
index 2a2937ed043..ef88388267b 100644
--- a/gcc/testsuite/gcc.dg/analyzer/malloc-paths-10.c
+++ b/gcc/testsuite/gcc.dg/analyzer/malloc-paths-10.c
@@ -10,8 +10,7 @@  int test (int flag)
     other_flag = 0;
 
   /* With state-merging, we lose the relationship between 'flag' and 'other_flag'.  */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   if (other_flag)
     __analyzer_eval (flag); /* { dg-warning "UNKNOWN" } */
diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-1a.c b/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-1a.c
index 72360c2f9fa..d47dfa8b2c0 100644
--- a/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-1a.c
+++ b/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-1a.c
@@ -44,14 +44,13 @@  int test_repeated_predicate_1 (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   result = do_stuff (ptr, n);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
   // FIXME: why 3 here?
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
   // FIXME: why 3 here?
 
   if (n > 10)
@@ -73,11 +72,11 @@  int test_repeated_predicate_2 (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   result = do_stuff_2 (ptr, n);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   if (n > 10)
     free (ptr); /* { dg-bogus "not on the heap" } */
@@ -102,11 +101,11 @@  int test_explicit_flag (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   result = do_stuff (ptr, n);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
   // FIXME: why 3 here?
 
   if (need_to_free)
@@ -128,11 +127,11 @@  int test_pointer_comparison (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   result = do_stuff (ptr, n);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
   // FIXME: why 3 here?
 
   if (ptr != buf)
@@ -159,19 +158,18 @@  int test_initial_flag (int n)
   /* Due to state-merging, we lose the relationship between 'n > 10'
      and 'on_heap' here; we have to rely on feasibility-checking
      in the diagnostic_manager to reject the false warnings.  */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   if (on_heap)
     ptr = (int *)malloc (sizeof (int) * n);
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   result = do_stuff (ptr, n);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "5 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "5 processed enodes" } */
   // FIXME: why 5 here?
 
   if (n > 10)
diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-1b.c b/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-1b.c
index 1997bb7adb4..a30b8c0e080 100644
--- a/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-1b.c
+++ b/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-1b.c
@@ -44,13 +44,11 @@  int test_repeated_predicate_1 (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   result = do_stuff (ptr, n);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   if (n > 10)
     free (ptr); /* { dg-bogus "not on the heap" } */
@@ -71,11 +69,11 @@  int test_repeated_predicate_2 (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   result = do_stuff_2 (ptr, n);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   if (n > 10)
     free (ptr); /* { dg-bogus "not on the heap" } */
@@ -100,11 +98,11 @@  int test_explicit_flag (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   result = do_stuff (ptr, n);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   if (need_to_free)
     free (ptr); /* { dg-bogus "not on the heap" } */
@@ -125,11 +123,11 @@  int test_pointer_comparison (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   result = do_stuff (ptr, n);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   if (ptr != buf)
     free (ptr); /* { dg-bogus "not on the heap" } */
@@ -155,19 +153,18 @@  int test_initial_flag (int n)
   /* Due to state-merging, we lose the relationship between 'n > 10'
      and 'on_heap' here; we have to rely on feasibility-checking
      in the diagnostic_manager to reject the false warnings.  */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   if (on_heap)
     ptr = (int *)malloc (sizeof (int) * n);
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   result = do_stuff (ptr, n);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   if (n > 10)
     free (ptr); /* { dg-bogus "not on the heap" } */
diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-2.c b/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-2.c
index 74d9687b960..89bd511549f 100644
--- a/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-2.c
+++ b/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-2.c
@@ -24,8 +24,7 @@  int test_repeated_predicate_1 (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   {
     int *p = ptr;
@@ -38,8 +37,7 @@  int test_repeated_predicate_1 (int n)
     result = sum;
   }
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
 
   if (n > 10)
     free (ptr); /* { dg-bogus "not on the heap" } */
@@ -60,8 +58,7 @@  int test_repeated_predicate_1a (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   {
     int *p = ptr;
@@ -72,8 +69,7 @@  int test_repeated_predicate_1a (int n)
     result = sum;
   }
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
 
   if (n > 10)
     free (ptr); /* { dg-bogus "not on the heap" } */
@@ -94,11 +90,11 @@  int test_repeated_predicate_2 (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   result = do_stuff_2 (ptr, n);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   if (n > 10)
     free (ptr); /* { dg-bogus "not on the heap" } */
@@ -123,7 +119,7 @@  int test_explicit_flag (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   {
     int *p = ptr;
@@ -136,7 +132,7 @@  int test_explicit_flag (int n)
     result = sum;
   }
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
 
   if (need_to_free)
     free (ptr); /* { dg-bogus "not on the heap" } */
@@ -157,7 +153,7 @@  int test_pointer_comparison (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   {
     int *p = ptr;
@@ -170,7 +166,7 @@  int test_pointer_comparison (int n)
     result = sum;
   }
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
 
   if (ptr != buf)
     free (ptr); /* { dg-bogus "not on the heap" } */
diff --git a/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-3.c b/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-3.c
index fe9b240be5b..d20a2753bb8 100644
--- a/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-3.c
+++ b/gcc/testsuite/gcc.dg/analyzer/malloc-vs-local-3.c
@@ -23,8 +23,7 @@  int test_1 (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   {
     int *p = ptr;
@@ -37,7 +36,7 @@  int test_1 (int n)
     result = sum;
   }
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
 
   return result; /* { dg-message "leak of 'p'" } */
   /* FIXME: should this be 'ptr'?  */
@@ -56,11 +55,11 @@  int test_2 (int n)
   else
     ptr = buf;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   result = do_stuff_2 (ptr, n);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   return result; /* { dg-message "leak of 'ptr'" } */
 }
diff --git a/gcc/testsuite/gcc.dg/analyzer/paths-1.c b/gcc/testsuite/gcc.dg/analyzer/paths-1.c
index 06468774472..df5b3a66084 100644
--- a/gcc/testsuite/gcc.dg/analyzer/paths-1.c
+++ b/gcc/testsuite/gcc.dg/analyzer/paths-1.c
@@ -13,6 +13,5 @@  void test (struct foo *pf)
     bar (0);
   else
     bar (1);
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 }
diff --git a/gcc/testsuite/gcc.dg/analyzer/paths-1a.c b/gcc/testsuite/gcc.dg/analyzer/paths-1a.c
index 8760de93499..a1b842ff54f 100644
--- a/gcc/testsuite/gcc.dg/analyzer/paths-1a.c
+++ b/gcc/testsuite/gcc.dg/analyzer/paths-1a.c
@@ -13,6 +13,5 @@  void test (union foo *pf)
     bar (0);
   else
     bar (1);
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 }
diff --git a/gcc/testsuite/gcc.dg/analyzer/paths-2.c b/gcc/testsuite/gcc.dg/analyzer/paths-2.c
index c48a2d7758c..3efc053ade1 100644
--- a/gcc/testsuite/gcc.dg/analyzer/paths-2.c
+++ b/gcc/testsuite/gcc.dg/analyzer/paths-2.c
@@ -6,9 +6,7 @@  int test (int a)
     return (-2);
   }
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
-
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   return 0;
 }
@@ -19,9 +17,7 @@  int test_2 (int a)
     return (-2);
   }
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "4 exploded nodes" } */
-
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   return 0;
 }
diff --git a/gcc/testsuite/gcc.dg/analyzer/paths-3.c b/gcc/testsuite/gcc.dg/analyzer/paths-3.c
index 440213b7991..9bd30301690 100644
--- a/gcc/testsuite/gcc.dg/analyzer/paths-3.c
+++ b/gcc/testsuite/gcc.dg/analyzer/paths-3.c
@@ -13,13 +13,12 @@  int test_1 (int a, int b)
     else
       p = malloc (32);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "4 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   if (a > 5)
     {
       free (p);
-      __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+      __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
     }
 
   return 0; /* { dg-bogus "leak" } */
@@ -35,13 +34,12 @@  int test_2 (int a, int b)
     else
       p = malloc (32);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "4 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   if (a > 6) /* different condition */
     {
       free (p);
-      __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+      __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
     }
 
   return 0; /* { dg-warning "leak of 'p'" } */
diff --git a/gcc/testsuite/gcc.dg/analyzer/paths-4.c b/gcc/testsuite/gcc.dg/analyzer/paths-4.c
index 34bd09eee05..2f58763886c 100644
--- a/gcc/testsuite/gcc.dg/analyzer/paths-4.c
+++ b/gcc/testsuite/gcc.dg/analyzer/paths-4.c
@@ -10,41 +10,43 @@  extern void do_stuff (struct state *, int);
 
 int test_1 (struct state *s)
 {
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
   while (1)
     {
-      __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-      __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+      __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
+      __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
+      /* TODO: why does the above need an extra stmt to merge state?  */
       do_stuff (s, s->mode);
     }
 }
 
 int test_2 (struct state *s)
 {
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
   while (1)
     {
-      __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
-      __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+      __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
+      __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
+      /* TODO: why does the above need an extra stmt to merge state?  */
       switch (s->mode)
 	{
 	case 0:
-	  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+	  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 	  do_stuff (s, 0);
 	  break;
 	case 1:
-	  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+	  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 	  do_stuff (s, 17);
 	  break;
 	case 2:
-	  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+	  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 	  do_stuff (s, 5);
 	  break;
 	case 3:
-	  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+	  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 	  return 42;
 	case 4:
-	  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+	  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 	  return -3;
 	}
     }
diff --git a/gcc/testsuite/gcc.dg/analyzer/paths-5.c b/gcc/testsuite/gcc.dg/analyzer/paths-5.c
index f96169d9d2b..21aa23067c1 100644
--- a/gcc/testsuite/gcc.dg/analyzer/paths-5.c
+++ b/gcc/testsuite/gcc.dg/analyzer/paths-5.c
@@ -3,10 +3,10 @@ 
 void test (int *p, int n)
 {
   int i;
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
   for (i = 0; i < n; i++)
     {
       p[i] = i; /* { dg-bogus "uninitialized" } */
-      __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+      __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
     }
 }
diff --git a/gcc/testsuite/gcc.dg/analyzer/paths-6.c b/gcc/testsuite/gcc.dg/analyzer/paths-6.c
index 7a1a94228dd..8220b8eff82 100644
--- a/gcc/testsuite/gcc.dg/analyzer/paths-6.c
+++ b/gcc/testsuite/gcc.dg/analyzer/paths-6.c
@@ -19,9 +19,7 @@  void test_1 (int flag)
       a = 3;
     }
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  // FIXME: the above can vary between 2 and 3 exploded nodes
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
   __analyzer_eval (a == 3); /* { dg-warning "TRUE" } */
   __analyzer_eval (b == 4); /* { dg-warning "TRUE" } */
 }
@@ -42,8 +40,7 @@  void test_2 (int flag)
       f = 3;
     }
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
   __analyzer_eval (f == 3); /* { dg-warning "TRUE" } */
   __analyzer_eval (g == 4); /* { dg-warning "TRUE" } */
 }
@@ -92,8 +89,7 @@  void test_3 (int i)
       break;
     }
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "6 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enode" } */
   __analyzer_eval (f == 3); /* { dg-warning "TRUE" } */
   __analyzer_eval (g == 4); /* { dg-warning "TRUE" } */
   __analyzer_eval (h == 5); /* { dg-warning "TRUE" } */
@@ -112,8 +108,7 @@  void test_4 (int flag)
       q = malloc (256);
       p = malloc (256);
     }
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
   free (p);
   free (q);
 }
diff --git a/gcc/testsuite/gcc.dg/analyzer/paths-7.c b/gcc/testsuite/gcc.dg/analyzer/paths-7.c
index 6a99e64439f..243b9635364 100644
--- a/gcc/testsuite/gcc.dg/analyzer/paths-7.c
+++ b/gcc/testsuite/gcc.dg/analyzer/paths-7.c
@@ -9,12 +9,12 @@  int test (int flag, void *ptr, int *p, int n)
   int sum = 0;
   int i;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   if (flag)
     free (ptr);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   for (i = 0; i < n; i++)
     p[i] = i;
@@ -22,7 +22,7 @@  int test (int flag, void *ptr, int *p, int n)
     sum += foo (p[i]); /* { dg-bogus "uninitialized" } */
   result = sum;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   if (flag)
     free (ptr); /* { dg-warning "double-'free' of 'ptr'" } */
@@ -37,12 +37,12 @@  int test_2 (int flag, int *p, int n)
 
   void *ptr = malloc (16);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   if (flag)
     free (ptr);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
 
   for (i = 0; i < n; i++)
     p[i] = i;
@@ -50,8 +50,7 @@  int test_2 (int flag, int *p, int n)
     sum += foo (p[i]); /* { dg-bogus "uninitialized" } */
   result = sum;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "5 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "5 exploded nodes" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "5 processed enodes" } */
   // FIXME: why 5 here?
 
   free (ptr); /* { dg-warning "double-'free' of 'ptr'" } */
diff --git a/gcc/testsuite/gcc.dg/analyzer/torture/conditionals-2.c b/gcc/testsuite/gcc.dg/analyzer/torture/conditionals-2.c
index 5580d22ab92..35b0a05f649 100644
--- a/gcc/testsuite/gcc.dg/analyzer/torture/conditionals-2.c
+++ b/gcc/testsuite/gcc.dg/analyzer/torture/conditionals-2.c
@@ -7,7 +7,7 @@ 
 static void __attribute__((noinline))
 test_1_callee (void *p, void *q)
 {
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   __analyzer_eval (p == Z_NULL); /* { dg-warning "FALSE" } */
   __analyzer_eval (p != Z_NULL); /* { dg-warning "TRUE" } */
@@ -27,7 +27,7 @@  void test_1 (void *p, void *q)
 static void __attribute__((noinline))
 test_2_callee (void *p, void *q)
 {
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   __analyzer_eval (p == Z_NULL); /* { dg-warning "FALSE" } */
   __analyzer_eval (p != Z_NULL); /* { dg-warning "TRUE" } */
diff --git a/gcc/testsuite/gcc.dg/analyzer/zlib-1.c b/gcc/testsuite/gcc.dg/analyzer/zlib-1.c
index 5537c984e1a..171af3d6852 100644
--- a/gcc/testsuite/gcc.dg/analyzer/zlib-1.c
+++ b/gcc/testsuite/gcc.dg/analyzer/zlib-1.c
@@ -21,49 +21,44 @@  int deflateEnd(z_stream *strm)
 {
   int status;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   if (strm == 0 || strm->state == 0)
     return (-2);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   status = strm->state->status;
   if (status != 42 && status != 113 && status != 666) {
     return (-2);
   }
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "4 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   if (strm->state->pending_buf)
     (*(strm->zfree))(strm->opaque, (void *)(strm->state->pending_buf));
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   if (strm->state->head)
       (*(strm->zfree))(strm->opaque, (void *)(strm->state->head));
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   if (strm->state->prev)
     (*(strm->zfree))(strm->opaque, (void *)(strm->state->prev));
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   if (strm->state->window)
     (*(strm->zfree))(strm->opaque, (void *)(strm->state->window));
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   (*(strm->zfree))(strm->opaque, (void *)(strm->state));
   strm->state = 0;
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   return status == 113 ? (-3) : 0;
 }
diff --git a/gcc/testsuite/gcc.dg/analyzer/zlib-5.c b/gcc/testsuite/gcc.dg/analyzer/zlib-5.c
index 715604dbe77..afb61023330 100644
--- a/gcc/testsuite/gcc.dg/analyzer/zlib-5.c
+++ b/gcc/testsuite/gcc.dg/analyzer/zlib-5.c
@@ -42,7 +42,7 @@  int main(int argc, char *argv[]) {
   if (compr == 0 || uncompr == 0)
     exit(1);
 
-  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+  __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
 
   test_compress(compr, comprLen, uncompr, uncomprLen);