From 39426ab74f5ca34a413e45efc8b5d461479e3c5a Mon Sep 17 00:00:00 2001 From: Peter Bergner Date: Fri, 30 Jun 2017 11:04:08 -0500 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 +++++++- gcc/tree-cfg.c | 39 +++++++++++++++++---------------------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2fbfc2bebc2..d5f94fb009f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-06-30 Peter Bergner + + * 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. + 2017-06-30 Aldy Hernandez * tree-ssanames.c (set_range_info_raw): Abstract from ... @@ -16,7 +22,7 @@ For V16FI and V8SF_256 iterators, don't test if both operands are MEM if . For VI4F_256 iterator, use instead of register_operand and instead of v for - the input operand. Make sure both operands aren't MEMs for if not + the input operand. Make sure both operands aren't MEMs for if not . 2017-06-30 Sylvestre Ledru diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 5af677ba652..848b20f90d2 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; } -- 2.30.2