diff options
author | Jeff Law <law@redhat.com> | 2017-03-27 21:22:25 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2017-03-27 21:22:25 -0600 |
commit | 865169874b1aa348baada12802a0ab96e641f5f3 (patch) | |
tree | ea0b4f860253c327ab9e18c57e63b77337cc0e72 /gcc/tree-ssa-dom.c | |
parent | 980999836f645cc9d3444ea41fceb06f8fd78ead (diff) |
re PR target/80162 (ICE on invalid code (address of register variable))
PR tree-optimization/80162
* tree-ssa-dom.c (derive_equivalences_from_bit_ior): Fix typo in
function name. Limit recursion depth.
(record_temporary_equivalences): Corresponding changes.
PR tree-optimization/80162
* gcc.c-torture/compile/pr80216.c: New test.
From-SVN: r246517
Diffstat (limited to 'gcc/tree-ssa-dom.c')
-rw-r--r-- | gcc/tree-ssa-dom.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index c6ffc38e1a8..d2263bb13e6 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -692,11 +692,18 @@ back_propagate_equivalences (tree lhs, edge e, } /* Record NAME has the value zero and if NAME was set from a BIT_IOR_EXPR - recurse into both operands recording their values as zero too. */ + recurse into both operands recording their values as zero too. + RECURSION_DEPTH controls how far back we recurse through the operands + of the BIT_IOR_EXPR. */ static void -derive_equivalencs_from_bit_ior (tree name, const_and_copies *const_and_copies) +derive_equivalences_from_bit_ior (tree name, + const_and_copies *const_and_copies, + int recursion_limit) { + if (recursion_limit == 0) + return; + if (TREE_CODE (name) == SSA_NAME) { tree value = fold_convert (TREE_TYPE (name), integer_zero_node); @@ -710,10 +717,12 @@ derive_equivalencs_from_bit_ior (tree name, const_and_copies *const_and_copies) if (is_gimple_assign (def_stmt) && gimple_assign_rhs_code (def_stmt) == BIT_IOR_EXPR) { - derive_equivalencs_from_bit_ior (gimple_assign_rhs1 (def_stmt), - const_and_copies); - derive_equivalencs_from_bit_ior (gimple_assign_rhs2 (def_stmt), - const_and_copies); + derive_equivalences_from_bit_ior (gimple_assign_rhs1 (def_stmt), + const_and_copies, + recursion_limit - 1); + derive_equivalences_from_bit_ior (gimple_assign_rhs2 (def_stmt), + const_and_copies, + recursion_limit - 1); } } } @@ -751,7 +760,7 @@ record_temporary_equivalences (edge e, enum tree_code code = eq->cond.ops.binary.op; if ((code == EQ_EXPR && eq->value == boolean_true_node) || (code == NE_EXPR && eq->value == boolean_false_node)) - derive_equivalencs_from_bit_ior (op0, const_and_copies); + derive_equivalences_from_bit_ior (op0, const_and_copies, 4); /* TODO: We could handle BIT_AND_EXPR in a similar fashion recording that the operands have a nonzero value. */ |