Points to solver has a bug that can cause complex constraints to be
skipped leading to wrong points-to results. In the case that exposed
the problem, there is sd constraint: x = *y which is never processed.
'y''s final points to set is { NULL READONLY ESCAPED NOLOCAL}, but 'x'
points-to set is {}.

What happens is before 'y'' is processed, it is merged with another
node 'z' during cycle elimination (the complex constraints get
transferred to 'z'), but 'z' is not marked as 'changed' so it is
skipped in a later iteration.

The attached patch fixed the problem. The problem is exposed by a
large program built with -fprofile-generate in LIPO mode -- so there
is no small testcase attached.

Bootstrapped and regression tested on x86_64-unknown-linux-gnu, OK for trunk?

Index: ChangeLog
===================================================================
--- ChangeLog   (revision 205579)
+++ ChangeLog   (working copy)
@@ -1,3 +1,8 @@
+2013-12-02  Xinliang David Li  <davi...@google.com>
+
+       * tree-ssa-structalias.c (solve_graph): Mark rep node changed
+       after cycle elimination.
+
 2013-12-01  Eric Botcazou  <ebotca...@adacore.com>

        * config/i386/winnt.c (i386_pe_asm_named_section): Be prepared for an
Index: tree-ssa-structalias.c
===================================================================
--- tree-ssa-structalias.c      (revision 205579)
+++ tree-ssa-structalias.c      (working copy)
@@ -2655,8 +2655,13 @@ solve_graph (constraint_graph_t graph)

          /* In certain indirect cycle cases, we may merge this
             variable to another.  */
-         if (eliminate_indirect_cycles (i) && find (i) != i)
-           continue;
+         if (eliminate_indirect_cycles (i))
+            {
+             unsigned int rep = find (i);
+             bitmap_set_bit (changed, rep);
+             if (i != rep)
+               continue;
+            }

          /* If the node has changed, we need to process the
             complex constraints and outgoing edges again.  */

Reply via email to