diff options
author | Richard Biener <rguenther@suse.de> | 2015-07-23 14:31:44 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-07-23 14:31:44 +0000 |
commit | d057c8669b2ca758096697826647bdc06f77c336 (patch) | |
tree | b825dc9fc48e85dddf5705132c0c5adb5a343656 | |
parent | dc891fe75e30646dea032b06ab484d814c7e05b6 (diff) | |
download | gcc-d057c8669b2ca758096697826647bdc06f77c336.zip gcc-d057c8669b2ca758096697826647bdc06f77c336.tar.gz gcc-d057c8669b2ca758096697826647bdc06f77c336.tar.bz2 |
generic-match-head.c: Include cgraph.h.
2015-07-23 Richard Biener <rguenther@suse.de>
* generic-match-head.c: Include cgraph.h.
* gimple-match-head.c: Likewise.
* tree-ssa-sccvn.c (free_scc_vn): Guard against newly created
SSA names.
* fold-const.c (fold_binary_loc): Move &A ==/!= &B simplification...
* match.pd: ...to a pattern here. Add &A ==/!= 0 simplification
pattern.
From-SVN: r226111
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/fold-const.c | 23 | ||||
-rw-r--r-- | gcc/generic-match-head.c | 2 | ||||
-rw-r--r-- | gcc/gimple-match-head.c | 1 | ||||
-rw-r--r-- | gcc/match.pd | 23 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 2 |
6 files changed, 37 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f5bb227..cc07d76 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,15 @@ 2015-07-23 Richard Biener <rguenther@suse.de> + * generic-match-head.c: Include cgraph.h. + * gimple-match-head.c: Likewise. + * tree-ssa-sccvn.c (free_scc_vn): Guard against newly created + SSA names. + * fold-const.c (fold_binary_loc): Move &A ==/!= &B simplification... + * match.pd: ...to a pattern here. Add &A ==/!= 0 simplification + pattern. + +2015-07-23 Richard Biener <rguenther@suse.de> + * gimple-fold.c (fold_gimple_cond): Do not require folding results to pass valid_gimple_rhs_p. * tree-cfg.h (fold_cond_expr_cond): Remove. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index fa321f4..886922f 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -11082,29 +11082,6 @@ fold_binary_loc (location_t loc, && code == NE_EXPR) return non_lvalue_loc (loc, fold_convert_loc (loc, type, arg0)); - /* If this is an equality comparison of the address of two non-weak, - unaliased symbols neither of which are extern (since we do not - have access to attributes for externs), then we know the result. */ - if (TREE_CODE (arg0) == ADDR_EXPR - && DECL_P (TREE_OPERAND (arg0, 0)) - && TREE_CODE (arg1) == ADDR_EXPR - && DECL_P (TREE_OPERAND (arg1, 0))) - { - int equal; - - if (decl_in_symtab_p (TREE_OPERAND (arg0, 0)) - && decl_in_symtab_p (TREE_OPERAND (arg1, 0))) - equal = symtab_node::get_create (TREE_OPERAND (arg0, 0)) - ->equal_address_to (symtab_node::get_create - (TREE_OPERAND (arg1, 0))); - else - equal = TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0); - if (equal != 2) - return constant_boolean_node (equal - ? code == EQ_EXPR : code != EQ_EXPR, - type); - } - /* Similarly for a BIT_XOR_EXPR; X ^ C1 == C2 is X == (C1 ^ C2). */ if (TREE_CODE (arg0) == BIT_XOR_EXPR && TREE_CODE (arg1) == INTEGER_CST diff --git a/gcc/generic-match-head.c b/gcc/generic-match-head.c index da7abc6..0a7038d 100644 --- a/gcc/generic-match-head.c +++ b/gcc/generic-match-head.c @@ -46,8 +46,10 @@ along with GCC; see the file COPYING3. If not see #include "builtins.h" #include "dumpfile.h" #include "target.h" +#include "cgraph.h" #include "generic-match.h" + /* Routine to determine if the types T1 and T2 are effectively the same for GENERIC. If T1 or T2 is not a type, the test applies to their TREE_TYPE. */ diff --git a/gcc/gimple-match-head.c b/gcc/gimple-match-head.c index 2b14238..2c66dcc 100644 --- a/gcc/gimple-match-head.c +++ b/gcc/gimple-match-head.c @@ -46,6 +46,7 @@ along with GCC; see the file COPYING3. If not see #include "builtins.h" #include "dumpfile.h" #include "target.h" +#include "cgraph.h" #include "gimple-match.h" diff --git a/gcc/match.pd b/gcc/match.pd index 9cf0278..9c181f6 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1754,7 +1754,28 @@ along with GCC; see the file COPYING3. If not see (simplify (cmp (convert?@3 (bit_xor @0 INTEGER_CST@1)) INTEGER_CST@2) (if (tree_nop_conversion_p (TREE_TYPE (@3), TREE_TYPE (@0))) - (cmp @0 (bit_xor @1 (convert @2)))))) + (cmp @0 (bit_xor @1 (convert @2))))) + + /* If this is an equality comparison of the address of two non-weak, + unaliased symbols neither of which are extern (since we do not + have access to attributes for externs), then we know the result. */ + (simplify + (cmp (convert? addr@0) (convert? addr@1)) + (if (decl_in_symtab_p (TREE_OPERAND (@0, 0)) + && decl_in_symtab_p (TREE_OPERAND (@1, 0))) + (with + { + int equal = symtab_node::get_create (TREE_OPERAND (@0, 0)) + ->equal_address_to (symtab_node::get_create (TREE_OPERAND (@1, 0))); + } + (if (equal != 2) + { constant_boolean_node (equal ? cmp == EQ_EXPR : cmp != EQ_EXPR, type); })))) + + (simplify + (cmp (convert? addr@0) integer_zerop) + (if (tree_single_nonzero_warnv_p (@0, NULL)) + { constant_boolean_node (cmp == NE_EXPR, type); }))) + /* bool_var != 0 becomes bool_var. */ (simplify diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index c20f1cc..ab4b110 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -4223,6 +4223,8 @@ free_scc_vn (void) { tree name = ssa_name (i); if (name + && SSA_NAME_VERSION (name) < vn_ssa_aux_table.length () + && vn_ssa_aux_table[SSA_NAME_VERSION (name)] && VN_INFO (name)->needs_insertion) release_ssa_name (name); } |