Hi,

this patch fixes PR70700, an ICE in tree-ssa-structalias.c:dump_pred_graph for the test-case contained in the patch.

In the constraint graph, a node representing a variable varinfo_t var is represented as the corresponding var->id, ranging from 1 to FIRST_REF_NODE - 1.

A node representing a DEREF of a varinfo_t var is represented as the corresponding var->id + FIRST_REF_NODE, ranging from FIRST_REF_NODE + 1 to LAST_REF_NODE.

So, for a DEREF node, we need to substract FIRST_REF_NODE to find the corresponding variable. This logic is missing in a print statement in dump_pred_graph (which is triggered with TDF_GRAPH), which causes the ICE.

This patch fixes the ICE by substracting FIRST_REF_NODE from the node number of a DEREF node to find the varinfo, and prints it as a DEREF node (by adding an '*' prefix).

Bootstrapped and reg-tested on x86_64. Extracted graphs from ealias dump and verified that valid pdfs were produced.

OK for trunk?

Thanks,
- Tom
Fix ICE in dump_pred_graph

2016-05-02  Marek Polacek  <pola...@redhat.com>
	    Tom de Vries  <t...@codesourcery.com>

	PR tree-optimization/70700
	* tree-ssa-structalias.c (dump_pred_graph): Fix getting varinfo for ids
	bigger than FIRST_REF_NODE.

	* gcc.dg/pr70700.c: New test.

---
 gcc/testsuite/gcc.dg/pr70700.c | 15 +++++++++++++++
 gcc/tree-ssa-structalias.c     |  6 +++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/gcc.dg/pr70700.c b/gcc/testsuite/gcc.dg/pr70700.c
new file mode 100644
index 0000000..613cd29
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr70700.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-tree-ealias-graph" } */
+
+struct S
+{
+  long m;
+};
+
+struct S
+fn1 (struct S *a)
+{
+  if (a->m)
+    a->m |= 2;
+  return *a;
+}
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 0a41494..d66bdfa 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -2241,7 +2241,11 @@ dump_pred_graph (struct scc_info *si, FILE *file)
       if (graph->points_to[i]
 	  && !bitmap_empty_p (graph->points_to[i]))
 	{
-	  fprintf (file, "[label=\"%s = {", get_varinfo (i)->name);
+	  if (i < FIRST_REF_NODE)
+	    fprintf (file, "[label=\"%s = {", get_varinfo (i)->name);
+	  else
+	    fprintf (file, "[label=\"*%s = {",
+		     get_varinfo (i - FIRST_REF_NODE)->name);
 	  unsigned j;
 	  bitmap_iterator bi;
 	  EXECUTE_IF_SET_IN_BITMAP (graph->points_to[i], 0, j, bi)

Reply via email to