https://gcc.gnu.org/g:6f3c04e20625dee7c32b1ec43cb0812e38f4394b

commit r17-559-g6f3c04e20625dee7c32b1ec43cb0812e38f4394b
Author: Andrew Pinski <[email protected]>
Date:   Sat May 16 16:17:01 2026 -0700

    uncprop: small compile time optimization with switches
    
    In the process of converting gswitch away from CASE_LABEL_EXPR,
    I found a place in uncprop (like the case in dom) where we store
    the whole CASE_LABEL_EXPR. This place only needed to store the value
    of the case rather than the whole case expression. This does that
    small optimization and adds a few comments for the next person
    to understand what is going on here. It was not obvious at my
    first read of the code what it was doing or what error_mark
    was being used for.
    
    Bootstrapped and tested on x86_64-linux-gnu.
    
    gcc/ChangeLog:
    
            * tree-ssa-uncprop.cc (associate_equivalences_with_edges): For 
switches
            info only store the case low value to be recorded as
            the only value. Add comments.
    
    Signed-off-by: Andrew Pinski <[email protected]>

Diff:
---
 gcc/tree-ssa-uncprop.cc | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/gcc/tree-ssa-uncprop.cc b/gcc/tree-ssa-uncprop.cc
index 286f1674219c..79447251ed44 100644
--- a/gcc/tree-ssa-uncprop.cc
+++ b/gcc/tree-ssa-uncprop.cc
@@ -176,6 +176,11 @@ associate_equivalences_with_edges (void)
              && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (cond))
            {
              int i, n_labels = gimple_switch_num_labels (switch_stmt);
+             /* info contains NULL, error_mark_node or a value.
+                error_mark signifies there are multiple values already.
+                A NULL signifies there it is uninitialized.
+                A value signifies that is the only value on that edge
+                to that bb.  */
              tree *info = XCNEWVEC (tree, last_basic_block_for_fn (cfun));
 
              /* Walk over the case label vector.  Record blocks
@@ -186,24 +191,29 @@ associate_equivalences_with_edges (void)
                  tree label = gimple_switch_label (switch_stmt, i);
                  basic_block bb = label_to_block (cfun, CASE_LABEL (label));
 
+                 /* The default case is a case with multiple values.
+                    If the value is already set then it has multiple
+                    values.  */
                  if (CASE_HIGH (label)
                      || !CASE_LOW (label)
                      || info[bb->index])
                    info[bb->index] = error_mark_node;
                  else
-                   info[bb->index] = label;
+                   /* Record the one value that can be on that edge to the
+                      target_bb.  */
+                   info[bb->index] = CASE_LOW (label);
                }
 
              /* Now walk over the blocks to determine which ones were
                 marked as being reached by a useful case label.  */
              for (i = 0; i < n_basic_blocks_for_fn (cfun); i++)
                {
-                 tree node = info[i];
+                 tree value = info[i];
 
-                 if (node != NULL
-                     && node != error_mark_node)
+                 if (value != NULL
+                     && value != error_mark_node)
                    {
-                     tree x = fold_convert (TREE_TYPE (cond), CASE_LOW (node));
+                     tree x = fold_convert (TREE_TYPE (cond), value);
                      struct edge_equivalency *equivalency;
 
                      /* Record an equivalency on the edge from BB to basic

Reply via email to