diff options
author | Peter Bergner <bergner@gcc.gnu.org> | 2017-06-30 11:04:08 -0500 |
---|---|---|
committer | Peter Bergner <bergner@gcc.gnu.org> | 2017-06-30 11:04:08 -0500 |
commit | 39426ab74f5ca34a413e45efc8b5d461479e3c5a (patch) | |
tree | d599649632c97851d238510fa14d8f2a2f8700ab /gcc/tree-cfg.c | |
parent | 059ab149148378662403798003b8f380c0a12588 (diff) | |
download | gcc-39426ab74f5ca34a413e45efc8b5d461479e3c5a.zip gcc-39426ab74f5ca34a413e45efc8b5d461479e3c5a.tar.gz gcc-39426ab74f5ca34a413e45efc8b5d461479e3c5a.tar.bz2 |
tree-cfg.c (group_case_labels_stmt): Merge scanning and compressing loops.
* tree-cfg.c (group_case_labels_stmt): Merge scanning and compressing
loops. Remove now unneeded calls to gimple_switch_set_label() that
just set removed labels to NULL_TREE.
From-SVN: r249847
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 5af677b..848b20f 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -1679,13 +1679,13 @@ bool group_case_labels_stmt (gswitch *stmt) { int old_size = gimple_switch_num_labels (stmt); - int i, j, base_index, new_size = old_size; + int i, next_index, new_size; basic_block default_bb = NULL; default_bb = label_to_block (CASE_LABEL (gimple_switch_default_label (stmt))); /* Look for possible opportunities to merge cases. */ - i = 1; + new_size = i = 1; while (i < old_size) { tree base_case, base_high; @@ -1699,23 +1699,21 @@ group_case_labels_stmt (gswitch *stmt) /* Discard cases that have the same destination as the default case. */ if (base_bb == default_bb) { - gimple_switch_set_label (stmt, i, NULL_TREE); i++; - new_size--; continue; } base_high = CASE_HIGH (base_case) ? CASE_HIGH (base_case) : CASE_LOW (base_case); - base_index = i++; + next_index = i + 1; /* Try to merge case labels. Break out when we reach the end of the label vector or when we cannot merge the next case label with the current one. */ - while (i < old_size) + while (next_index < old_size) { - tree merge_case = gimple_switch_label (stmt, i); + tree merge_case = gimple_switch_label (stmt, next_index); basic_block merge_bb = label_to_block (CASE_LABEL (merge_case)); wide_int bhp1 = wi::add (base_high, 1); @@ -1727,9 +1725,7 @@ group_case_labels_stmt (gswitch *stmt) base_high = CASE_HIGH (merge_case) ? CASE_HIGH (merge_case) : CASE_LOW (merge_case); CASE_HIGH (base_case) = base_high; - gimple_switch_set_label (stmt, i, NULL_TREE); - new_size--; - i++; + next_index++; } else break; @@ -1742,23 +1738,22 @@ group_case_labels_stmt (gswitch *stmt) edge base_edge = find_edge (gimple_bb (stmt), base_bb); if (base_edge != NULL) remove_edge_and_dominated_blocks (base_edge); - gimple_switch_set_label (stmt, base_index, NULL_TREE); - new_size--; + i = next_index; + continue; } - } - /* Compress the case labels in the label vector, and adjust the - length of the vector. */ - for (i = 0, j = 0; i < new_size; i++) - { - while (! gimple_switch_label (stmt, j)) - j++; - gimple_switch_set_label (stmt, i, - gimple_switch_label (stmt, j++)); + if (new_size < i) + gimple_switch_set_label (stmt, new_size, + gimple_switch_label (stmt, i)); + i = next_index; + new_size++; } gcc_assert (new_size <= old_size); - gimple_switch_set_num_labels (stmt, new_size); + + if (new_size < old_size) + gimple_switch_set_num_labels (stmt, new_size); + return new_size < old_size; } |