This moves some points-to related comparison simplification. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard. 2015-07-24 Richard Biener <rguent...@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. Index: gcc/genmatch.c =================================================================== *** gcc/genmatch.c (revision 226138) --- gcc/genmatch.c (working copy) *************** add_operator (enum tree_code code, const *** 395,401 **** /* To have INTEGER_CST and friends as "predicate operators". */ && strcmp (tcc, "tcc_constant") != 0 /* And allow CONSTRUCTOR for vector initializers. */ ! && !(code == CONSTRUCTOR)) return; /* Treat ADDR_EXPR as atom, thus don't allow matching its operand. */ if (code == ADDR_EXPR) --- 395,403 ---- /* To have INTEGER_CST and friends as "predicate operators". */ && strcmp (tcc, "tcc_constant") != 0 /* And allow CONSTRUCTOR for vector initializers. */ ! && !(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) Index: gcc/fold-const.c =================================================================== *** gcc/fold-const.c (revision 226138) --- gcc/fold-const.c (working copy) *************** fold_comparison (location_t loc, enum tr *** 8467,8499 **** } } - /* 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)) { /* We can fold this expression to a constant if the non-constant offset parts are equal. */ --- 8467,8475 ---- } } /* If we have equivalent bases we might be able to simplify. */ ! 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. */ Index: gcc/match.pd =================================================================== *** gcc/match.pd (revision 226138) --- gcc/match.pd (working copy) *************** (define_operator_list CBRT BUILT_IN_CBRT *** 1743,1748 **** --- 1743,1763 ---- (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)