aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2022-08-16 13:18:37 -0400
committerAndrew MacLeod <amacleod@redhat.com>2022-08-16 21:09:00 -0400
commit80f78716c2c7ce1b7f96077c35c1dd474a2086a2 (patch)
treef6af5d1fef6ba4f80be68a4b331806d7cebd5168 /gcc
parent47a61e65148c6f1c237638144eb72ed5afd86387 (diff)
downloadgcc-80f78716c2c7ce1b7f96077c35c1dd474a2086a2.zip
gcc-80f78716c2c7ce1b7f96077c35c1dd474a2086a2.tar.gz
gcc-80f78716c2c7ce1b7f96077c35c1dd474a2086a2.tar.bz2
Abstract interesting ssa-names from GORI.
Provide a routine to pick out the ssa-names from interesting statements. * gimple-range-fold.cc (gimple_range_ssa_names): New. * gimple-range-fold.h (gimple_range_ssa_names): New prototype. * gimple-range-gori.cc (range_def_chain::get_def_chain): Move code to new routine.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-range-fold.cc33
-rw-r--r--gcc/gimple-range-fold.h11
-rw-r--r--gcc/gimple-range-gori.cc33
3 files changed, 49 insertions, 28 deletions
diff --git a/gcc/gimple-range-fold.cc b/gcc/gimple-range-fold.cc
index 689d827..b0b2210 100644
--- a/gcc/gimple-range-fold.cc
+++ b/gcc/gimple-range-fold.cc
@@ -1580,3 +1580,36 @@ fur_source::register_outgoing_edges (gcond *s, irange &lhs_range, edge e0, edge
}
}
}
+
+// Given stmt S, fill VEC, up to VEC_SIZE elements, with relevant ssa-names
+// on the statement. For efficiency, it is an error to not pass in enough
+// elements for the vector. Return the number of ssa-names.
+
+unsigned
+gimple_range_ssa_names (tree *vec, unsigned vec_size, gimple *stmt)
+{
+ tree ssa;
+ int count = 0;
+
+ if (range_op_handler (stmt))
+ {
+ gcc_checking_assert (vec_size >= 2);
+ if ((ssa = gimple_range_ssa_p (gimple_range_operand1 (stmt))))
+ vec[count++] = ssa;
+ if ((ssa = gimple_range_ssa_p (gimple_range_operand2 (stmt))))
+ vec[count++] = ssa;
+ }
+ else if (is_a<gassign *> (stmt)
+ && gimple_assign_rhs_code (stmt) == COND_EXPR)
+ {
+ gcc_checking_assert (vec_size >= 3);
+ gassign *st = as_a<gassign *> (stmt);
+ if ((ssa = gimple_range_ssa_p (gimple_assign_rhs1 (st))))
+ vec[count++] = ssa;
+ if ((ssa = gimple_range_ssa_p (gimple_assign_rhs2 (st))))
+ vec[count++] = ssa;
+ if ((ssa = gimple_range_ssa_p (gimple_assign_rhs3 (st))))
+ vec[count++] = ssa;
+ }
+ return count;
+}
diff --git a/gcc/gimple-range-fold.h b/gcc/gimple-range-fold.h
index c2f381d..f2eab72 100644
--- a/gcc/gimple-range-fold.h
+++ b/gcc/gimple-range-fold.h
@@ -96,6 +96,14 @@ range_compatible_p (tree type1, tree type2)
&& TYPE_SIGN (type1) == TYPE_SIGN (type2));
}
+extern tree gimple_range_operand1 (const gimple *s);
+extern tree gimple_range_operand2 (const gimple *s);
+
+// Given stmt S, fill VEC, up to VEC_SIZE elements, with relevant ssa-names
+// on the statement. For efficiency, it is an error to not pass in enough
+// elements for the vector. Return the number of ssa-names.
+
+unsigned gimple_range_ssa_names (tree *vec, unsigned vec_size, gimple *stmt);
// Source of all operands for fold_using_range and gori_compute.
// It abstracts out the source of an operand so it can come from a stmt or
@@ -150,9 +158,6 @@ protected:
relation_oracle *m_oracle;
};
-extern tree gimple_range_operand1 (const gimple *s);
-extern tree gimple_range_operand2 (const gimple *s);
-
// This class uses ranges to fold a gimple statement producinf a range for
// the LHS. The source of all operands is supplied via the fur_source class
// which provides a range_query as well as a source location and any other
diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc
index 8879e44..957b8d5 100644
--- a/gcc/gimple-range-gori.cc
+++ b/gcc/gimple-range-gori.cc
@@ -331,7 +331,7 @@ range_def_chain::has_def_chain (tree name)
bitmap
range_def_chain::get_def_chain (tree name)
{
- tree ssa1, ssa2, ssa3;
+ tree ssa[3];
unsigned v = SSA_NAME_VERSION (name);
// If it has already been processed, just return the cached value.
@@ -347,23 +347,10 @@ range_def_chain::get_def_chain (tree name)
}
gimple *stmt = SSA_NAME_DEF_STMT (name);
- if (range_op_handler (stmt))
+ unsigned count = gimple_range_ssa_names (ssa, 3, stmt);
+ if (count == 0)
{
- ssa1 = gimple_range_ssa_p (gimple_range_operand1 (stmt));
- ssa2 = gimple_range_ssa_p (gimple_range_operand2 (stmt));
- ssa3 = NULL_TREE;
- }
- else if (is_a<gassign *> (stmt)
- && gimple_assign_rhs_code (stmt) == COND_EXPR)
- {
- gassign *st = as_a<gassign *> (stmt);
- ssa1 = gimple_range_ssa_p (gimple_assign_rhs1 (st));
- ssa2 = gimple_range_ssa_p (gimple_assign_rhs2 (st));
- ssa3 = gimple_range_ssa_p (gimple_assign_rhs3 (st));
- }
- else
- {
- // Stmts not understood are always imports.
+ // Stmts not understood or with no operands are always imports.
set_import (m_def_chain[v], name, NULL);
return NULL;
}
@@ -373,17 +360,13 @@ range_def_chain::get_def_chain (tree name)
return NULL;
// Increase the depth if we have a pair of ssa-names.
- if (ssa1 && ssa2)
+ if (count > 1)
m_logical_depth++;
- register_dependency (name, ssa1, gimple_bb (stmt));
- register_dependency (name, ssa2, gimple_bb (stmt));
- register_dependency (name, ssa3, gimple_bb (stmt));
- // Stmts with no understandable operands are also imports.
- if (!ssa1 && !ssa2 & !ssa3)
- set_import (m_def_chain[v], name, NULL);
+ for (unsigned x = 0; x < count; x++)
+ register_dependency (name, ssa[x], gimple_bb (stmt));
- if (ssa1 && ssa2)
+ if (count > 1)
m_logical_depth--;
return m_def_chain[v].bm;