aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-07-09 12:22:10 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-07-09 12:22:10 +0000
commitb7fe158a1b3d96a4b001d9373db93678455546cb (patch)
treebb6835b4985dbd6127ae5130c9715b96e3e08885 /gcc
parent495079550e135c7ad0605e9c549202c35625cde7 (diff)
downloadgcc-b7fe158a1b3d96a4b001d9373db93678455546cb.zip
gcc-b7fe158a1b3d96a4b001d9373db93678455546cb.tar.gz
gcc-b7fe158a1b3d96a4b001d9373db93678455546cb.tar.bz2
gimple-match.h (gimple_match_op::resimplify): New.
2019-07-09 Richard Biener <rguenther@suse.de> * gimple-match.h (gimple_match_op::resimplify): New. (gimple_resimplify1, gimple_resimplify2, gimple_resimplify3, gimple_resimplify4, gimple_resimplify5): Remove. * gimple-match-head.c (gimple_resimplify1, gimple_resimplify2, gimple_resimplify3, gimple_resimplify4, gimple_resimplify5): Make static. (gimple_match_op::resimplify): New. * tree-ssa-sccvn.c (vn_nary_build_or_lookup_1): Valueize according to availability. Use gimple_match_op::resimplify. From-SVN: r273302
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/gimple-match-head.c44
-rw-r--r--gcc/gimple-match.h7
-rw-r--r--gcc/tree-ssa-sccvn.c28
4 files changed, 69 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5a6a7f4..271a27a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2019-07-09 Richard Biener <rguenther@suse.de>
+
+ * gimple-match.h (gimple_match_op::resimplify): New.
+ (gimple_resimplify1, gimple_resimplify2, gimple_resimplify3,
+ gimple_resimplify4, gimple_resimplify5): Remove.
+ * gimple-match-head.c (gimple_resimplify1, gimple_resimplify2,
+ gimple_resimplify3, gimple_resimplify4, gimple_resimplify5):
+ Make static.
+ (gimple_match_op::resimplify): New.
+ * tree-ssa-sccvn.c (vn_nary_build_or_lookup_1): Valueize
+ according to availability. Use gimple_match_op::resimplify.
+
2019-07-09 Eric Botcazou <ebotcazou@adacore.com>
* ira-emit.c (emit_moves): Skip DEBUG_INSNs when setting the location.
diff --git a/gcc/gimple-match-head.c b/gcc/gimple-match-head.c
index df9f0c5..5327816 100644
--- a/gcc/gimple-match-head.c
+++ b/gcc/gimple-match-head.c
@@ -57,6 +57,16 @@ static bool gimple_simplify (gimple_match_op *, gimple_seq *, tree (*)(tree),
code_helper, tree, tree, tree, tree, tree);
static bool gimple_simplify (gimple_match_op *, gimple_seq *, tree (*)(tree),
code_helper, tree, tree, tree, tree, tree, tree);
+static bool gimple_resimplify1 (gimple_seq *, gimple_match_op *,
+ tree (*)(tree));
+static bool gimple_resimplify2 (gimple_seq *, gimple_match_op *,
+ tree (*)(tree));
+static bool gimple_resimplify3 (gimple_seq *, gimple_match_op *,
+ tree (*)(tree));
+static bool gimple_resimplify4 (gimple_seq *, gimple_match_op *,
+ tree (*)(tree));
+static bool gimple_resimplify5 (gimple_seq *, gimple_match_op *,
+ tree (*)(tree));
const unsigned int gimple_match_op::MAX_NUM_OPS;
@@ -173,7 +183,7 @@ maybe_resimplify_conditional_op (gimple_seq *seq, gimple_match_op *res_op,
RES_OP with a simplified and/or canonicalized result and
returns whether any change was made. */
-bool
+static bool
gimple_resimplify1 (gimple_seq *seq, gimple_match_op *res_op,
tree (*valueize)(tree))
{
@@ -233,7 +243,7 @@ gimple_resimplify1 (gimple_seq *seq, gimple_match_op *res_op,
RES_OP with a simplified and/or canonicalized result and
returns whether any change was made. */
-bool
+static bool
gimple_resimplify2 (gimple_seq *seq, gimple_match_op *res_op,
tree (*valueize)(tree))
{
@@ -305,7 +315,7 @@ gimple_resimplify2 (gimple_seq *seq, gimple_match_op *res_op,
RES_OP with a simplified and/or canonicalized result and
returns whether any change was made. */
-bool
+static bool
gimple_resimplify3 (gimple_seq *seq, gimple_match_op *res_op,
tree (*valueize)(tree))
{
@@ -376,7 +386,7 @@ gimple_resimplify3 (gimple_seq *seq, gimple_match_op *res_op,
RES_OP with a simplified and/or canonicalized result and
returns whether any change was made. */
-bool
+static bool
gimple_resimplify4 (gimple_seq *seq, gimple_match_op *res_op,
tree (*valueize)(tree))
{
@@ -417,7 +427,7 @@ gimple_resimplify4 (gimple_seq *seq, gimple_match_op *res_op,
RES_OP with a simplified and/or canonicalized result and
returns whether any change was made. */
-bool
+static bool
gimple_resimplify5 (gimple_seq *seq, gimple_match_op *res_op,
tree (*valueize)(tree))
{
@@ -439,6 +449,30 @@ gimple_resimplify5 (gimple_seq *seq, gimple_match_op *res_op,
return false;
}
+/* Match and simplify the toplevel valueized operation THIS.
+ Replaces THIS with a simplified and/or canonicalized result and
+ returns whether any change was made. */
+
+bool
+gimple_match_op::resimplify (gimple_seq *seq, tree (*valueize)(tree))
+{
+ switch (num_ops)
+ {
+ case 1:
+ return gimple_resimplify1 (seq, this, valueize);
+ case 2:
+ return gimple_resimplify2 (seq, this, valueize);
+ case 3:
+ return gimple_resimplify3 (seq, this, valueize);
+ case 4:
+ return gimple_resimplify4 (seq, this, valueize);
+ case 5:
+ return gimple_resimplify5 (seq, this, valueize);
+ default:
+ gcc_unreachable ();
+ }
+}
+
/* If in GIMPLE the operation described by RES_OP should be single-rhs,
build a GENERIC tree for that expression and update RES_OP accordingly. */
diff --git a/gcc/gimple-match.h b/gcc/gimple-match.h
index 22fa86c..ad7f730 100644
--- a/gcc/gimple-match.h
+++ b/gcc/gimple-match.h
@@ -105,6 +105,8 @@ struct gimple_match_op
tree op_or_null (unsigned int) const;
+ bool resimplify (gimple_seq *, tree (*)(tree));
+
/* The maximum value of NUM_OPS. */
static const unsigned int MAX_NUM_OPS = 5;
@@ -331,11 +333,6 @@ extern tree (*mprts_hook) (gimple_match_op *);
bool gimple_simplify (gimple *, gimple_match_op *, gimple_seq *,
tree (*)(tree), tree (*)(tree));
-bool gimple_resimplify1 (gimple_seq *, gimple_match_op *, tree (*)(tree));
-bool gimple_resimplify2 (gimple_seq *, gimple_match_op *, tree (*)(tree));
-bool gimple_resimplify3 (gimple_seq *, gimple_match_op *, tree (*)(tree));
-bool gimple_resimplify4 (gimple_seq *, gimple_match_op *, tree (*)(tree));
-bool gimple_resimplify5 (gimple_seq *, gimple_match_op *, tree (*)(tree));
tree maybe_push_res_to_seq (gimple_match_op *, gimple_seq *,
tree res = NULL_TREE);
void maybe_build_generic_op (gimple_match_op *);
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 627ee8f..9186f15 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -1968,21 +1968,25 @@ vn_nary_build_or_lookup_1 (gimple_match_op *res_op, bool insert)
RCODE (OPS...).
So first simplify and lookup this expression to see if it
is already available. */
- mprts_hook = vn_lookup_simplify_result;
+ /* For simplification valueize. */
+ unsigned i;
+ for (i = 0; i < res_op->num_ops; ++i)
+ if (TREE_CODE (res_op->ops[i]) == SSA_NAME)
+ {
+ tree tem = vn_valueize (res_op->ops[i]);
+ if (!tem)
+ break;
+ res_op->ops[i] = tem;
+ }
+ /* If valueization of an operand fails (it is not available), skip
+ simplification. */
bool res = false;
- switch (TREE_CODE_LENGTH ((tree_code) res_op->code))
+ if (i == res_op->num_ops)
{
- case 1:
- res = gimple_resimplify1 (NULL, res_op, vn_valueize);
- break;
- case 2:
- res = gimple_resimplify2 (NULL, res_op, vn_valueize);
- break;
- case 3:
- res = gimple_resimplify3 (NULL, res_op, vn_valueize);
- break;
+ mprts_hook = vn_lookup_simplify_result;
+ res = res_op->resimplify (NULL, vn_valueize);
+ mprts_hook = NULL;
}
- mprts_hook = NULL;
gimple *new_stmt = NULL;
if (res
&& gimple_simplified_result_is_gimple_val (res_op))