diff options
author | Richard Biener <rguenther@suse.de> | 2015-07-24 08:31:07 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-07-24 08:31:07 +0000 |
commit | 96a111a3dfb5def92156e41ea48f7677f34ce3c2 (patch) | |
tree | ea73c4893759d64987134135112562c59854df86 /gcc | |
parent | 37d486ab11c0d4f1e860b6dbc46e2e94bb8f0647 (diff) | |
download | gcc-96a111a3dfb5def92156e41ea48f7677f34ce3c2.zip gcc-96a111a3dfb5def92156e41ea48f7677f34ce3c2.tar.gz gcc-96a111a3dfb5def92156e41ea48f7677f34ce3c2.tar.bz2 |
genmatch.c (add_operator): Allow SSA_NAME as predicate.
2015-07-24 Richard Biener <rguenther@suse.de>
* genmatch.c (add_operator): Allow SSA_NAME as predicate.
* fold-const.c (fold_comparison): Move parameter does not
alias &local simplification ...
* match.pd: ... as a pattern here.
From-SVN: r226140
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fold-const.c | 28 | ||||
-rw-r--r-- | gcc/genmatch.c | 4 | ||||
-rw-r--r-- | gcc/match.pd | 15 |
4 files changed, 27 insertions, 27 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 47f7237..515f8ad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2015-07-24 Richard Biener <rguenther@suse.de> + * genmatch.c (add_operator): Allow SSA_NAME as predicate. + * fold-const.c (fold_comparison): Move parameter does not + alias &local simplification ... + * match.pd: ... as a pattern here. + +2015-07-24 Richard Biener <rguenther@suse.de> + * gimple-fold.c (replace_stmt_with_simplification): Special-case valueizing call operands. * gimple-match-head.c (maybe_push_res_to_seq): Take diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 886922f..54a6b13 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8467,33 +8467,9 @@ fold_comparison (location_t loc, enum tree_code code, tree type, } } - /* A local variable can never be pointed to by - the default SSA name of an incoming parameter. */ - if ((TREE_CODE (arg0) == ADDR_EXPR - && indirect_base0 - && TREE_CODE (base0) == VAR_DECL - && auto_var_in_fn_p (base0, current_function_decl) - && !indirect_base1 - && TREE_CODE (base1) == SSA_NAME - && SSA_NAME_IS_DEFAULT_DEF (base1) - && TREE_CODE (SSA_NAME_VAR (base1)) == PARM_DECL) - || (TREE_CODE (arg1) == ADDR_EXPR - && indirect_base1 - && TREE_CODE (base1) == VAR_DECL - && auto_var_in_fn_p (base1, current_function_decl) - && !indirect_base0 - && TREE_CODE (base0) == SSA_NAME - && SSA_NAME_IS_DEFAULT_DEF (base0) - && TREE_CODE (SSA_NAME_VAR (base0)) == PARM_DECL)) - { - if (code == NE_EXPR) - return constant_boolean_node (1, type); - else if (code == EQ_EXPR) - return constant_boolean_node (0, type); - } /* If we have equivalent bases we might be able to simplify. */ - else if (indirect_base0 == indirect_base1 - && operand_equal_p (base0, base1, 0)) + if (indirect_base0 == indirect_base1 + && operand_equal_p (base0, base1, 0)) { /* We can fold this expression to a constant if the non-constant offset parts are equal. */ diff --git a/gcc/genmatch.c b/gcc/genmatch.c index b4ab7b5..cb23770 100644 --- a/gcc/genmatch.c +++ b/gcc/genmatch.c @@ -395,7 +395,9 @@ add_operator (enum tree_code code, const char *id, /* To have INTEGER_CST and friends as "predicate operators". */ && strcmp (tcc, "tcc_constant") != 0 /* And allow CONSTRUCTOR for vector initializers. */ - && !(code == CONSTRUCTOR)) + && !(code == CONSTRUCTOR) + /* Allow SSA_NAME as predicate operator. */ + && !(code == SSA_NAME)) return; /* Treat ADDR_EXPR as atom, thus don't allow matching its operand. */ if (code == ADDR_EXPR) diff --git a/gcc/match.pd b/gcc/match.pd index 2ee36de..ccc5165 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1743,6 +1743,21 @@ along with GCC; see the file COPYING3. If not see (if (cmp == GT_EXPR || cmp == GE_EXPR) { constant_boolean_node (above ? false : true, type); })))))))))))) +(for cmp (eq ne) + /* A local variable can never be pointed to by + the default SSA name of an incoming parameter. + SSA names are canonicalized to 2nd place. */ + (simplify + (cmp addr@0 SSA_NAME@1) + (if (SSA_NAME_IS_DEFAULT_DEF (@1) + && TREE_CODE (SSA_NAME_VAR (@1)) == PARM_DECL) + (with { tree base = get_base_address (TREE_OPERAND (@0, 0)); } + (if (TREE_CODE (base) == VAR_DECL + && auto_var_in_fn_p (base, current_function_decl)) + (if (cmp == NE_EXPR) + { constant_boolean_node (true, type); } + { constant_boolean_node (false, type); })))))) + /* Equality compare simplifications from fold_binary */ (for cmp (eq ne) |