On Sun, May 17, 2026 at 6:16 AM Andrew Pinski <[email protected]> wrote: > > 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.
OK > 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]> > --- > 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 286f1674219..79447251ed4 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 > -- > 2.43.0 >
