aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Bergner <bergner@gcc.gnu.org>2017-06-30 11:04:08 -0500
committerPeter Bergner <bergner@gcc.gnu.org>2017-06-30 11:04:08 -0500
commit39426ab74f5ca34a413e45efc8b5d461479e3c5a (patch)
treed599649632c97851d238510fa14d8f2a2f8700ab
parent059ab149148378662403798003b8f380c0a12588 (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/tree-cfg.c39
2 files changed, 24 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2fbfc2b..d5f94fb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-06-30 Peter Bergner <bergner@vnet.ibm.com>
+
+ * 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 <aldyh@redhat.com>
* 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 <mask_applied>. For VI4F_256 iterator, use <store_mask_predicate>
instead of register_operand and <store_mask_constraint> 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
<mask_applied>.
2017-06-30 Sylvestre Ledru <sylvestre@debian.org>
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;
}