From: Richard Biener Date: Fri, 24 Jul 2015 08:31:07 +0000 (+0000) Subject: genmatch.c (add_operator): Allow SSA_NAME as predicate. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=96a111a3dfb5def92156e41ea48f7677f34ce3c2;p=gcc.git genmatch.c (add_operator): Allow SSA_NAME as predicate. 2015-07-24 Richard Biener * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 47f7237d224..515f8ad3d3d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-07-24 Richard Biener + + * 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 * gimple-fold.c (replace_stmt_with_simplification): Special-case diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 886922fcbcf..54a6b13df29 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 b4ab7b56e72..cb2377095fe 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 2ee36dec1ed..ccc5165f320 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)