https://gcc.gnu.org/g:7b5a05667c8e40bec5e070b1638d3b3882f7c78e

commit r17-2045-g7b5a05667c8e40bec5e070b1638d3b3882f7c78e
Author: Richard Biener <[email protected]>
Date:   Fri Jun 26 16:31:26 2026 +0200

    tree-optimization/125040 - fix sorted_array_from_bitmap_set
    
    The function attempts to provide a topological sorting of expressions
    in a bitmap set but it fails short of that because we have no knowledge
    of the entries of the value graph.  The following makes sure to first
    compute those.  This should reduce the amount of iteration we do.
    
            PR tree-optimization/125040
            * tree-ssa-pre.cc (sorted_array_from_bitmap_set): Compute
            the set of entries to the value graph before building the
            final sorted expression set.

Diff:
---
 gcc/tree-ssa-pre.cc | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc
index b41c7364c965..cc182f6fe36d 100644
--- a/gcc/tree-ssa-pre.cc
+++ b/gcc/tree-ssa-pre.cc
@@ -1076,11 +1076,43 @@ sorted_array_from_bitmap_set (bitmap_set_t set, bool 
for_insertion)
       result.truncate (0);
     }
 
+  bool single_p = true;
   auto_bitmap val_visited (&grand_bitmap_obstack);
   bitmap_tree_view (val_visited);
   FOR_EACH_VALUE_ID_IN_SET (set, i, bi)
     if (bitmap_set_bit (val_visited, i))
-      pre_expr_DFS (i, set, exclusions, val_visited, result);
+      {
+       if (!result.is_empty ())
+         {
+           single_p = false;
+           result.truncate (0);
+         }
+       pre_expr_DFS (i, set, exclusions, val_visited, result);
+       /* Mark i as entry that is not forward reachable.  Note we do
+          have cycles in the value graph so eventually i reaches itself.  */
+       bitmap_clear_bit (val_visited, i);
+      }
+  /* If we didn't by luck visit only a single entry to the value
+     graph visit now all not forward reachable values.  */
+  if (!single_p)
+    {
+      result.truncate (0);
+      auto_bitmap val_visited2 (&grand_bitmap_obstack);
+      bitmap_tree_view (val_visited2);
+      FOR_EACH_VALUE_ID_IN_SET (set, i, bi)
+       if (!bitmap_bit_p (val_visited, i))
+         {
+           if (bitmap_set_bit (val_visited2, i))
+             pre_expr_DFS (i, set, exclusions, val_visited2, result);
+           else
+             gcc_unreachable ();
+         }
+      if (flag_checking)
+       {
+         bitmap_list_view (val_visited2);
+         gcc_assert (bitmap_equal_p (&set->values, val_visited2));
+       }
+    }
 
   return result;
 }

Reply via email to