This fixes PR51363 - we can simplify the condition in DOM to not use gimple_rhs_has_side_effects (a weird function which still contains the checking code I removed from gimple_has_side_effects - the LHS is never a side-effect considered by gimple_has_side_effects anyway, side-effects are things not explicitely encoded in the stmt itself).
Bootstrap & regtest running on x86_64-unknown-linux-gnu. Richard. 2011-12-05 Richard Guenther <rguent...@suse.de> PR tree-optimization/51363 * gimple.c (gimple_rhs_has_side_effects): Remove. * gimple.h (gimple_rhs_has_side_effects): Likewise. * tree-ssa-dom.c (optimize_stmt): Simplify conditional. Index: gcc/gimple.c =================================================================== *** gcc/gimple.c (revision 182010) --- gcc/gimple.c (working copy) *************** gimple_has_side_effects (const_gimple s) *** 2484,2552 **** return false; } - /* Return true if the RHS of statement S has side effects. - We may use it to determine if it is admissable to replace - an assignment or call with a copy of a previously-computed - value. In such cases, side-effects due to the LHS are - preserved. */ - - bool - gimple_rhs_has_side_effects (const_gimple s) - { - unsigned i; - - if (is_gimple_call (s)) - { - unsigned nargs = gimple_call_num_args (s); - tree fn; - - if (!(gimple_call_flags (s) & (ECF_CONST | ECF_PURE))) - return true; - - /* We cannot use gimple_has_volatile_ops here, - because we must ignore a volatile LHS. */ - fn = gimple_call_fn (s); - if (fn && (TREE_SIDE_EFFECTS (fn) || TREE_THIS_VOLATILE (fn))) - { - gcc_assert (gimple_has_volatile_ops (s)); - return true; - } - - for (i = 0; i < nargs; i++) - if (TREE_SIDE_EFFECTS (gimple_call_arg (s, i)) - || TREE_THIS_VOLATILE (gimple_call_arg (s, i))) - return true; - - return false; - } - else if (is_gimple_assign (s)) - { - /* Skip the first operand, the LHS. */ - for (i = 1; i < gimple_num_ops (s); i++) - if (TREE_SIDE_EFFECTS (gimple_op (s, i)) - || TREE_THIS_VOLATILE (gimple_op (s, i))) - { - gcc_assert (gimple_has_volatile_ops (s)); - return true; - } - } - else if (is_gimple_debug (s)) - return false; - else - { - /* For statements without an LHS, examine all arguments. */ - for (i = 0; i < gimple_num_ops (s); i++) - if (TREE_SIDE_EFFECTS (gimple_op (s, i)) - || TREE_THIS_VOLATILE (gimple_op (s, i))) - { - gcc_assert (gimple_has_volatile_ops (s)); - return true; - } - } - - return false; - } - /* Helper for gimple_could_trap_p and gimple_assign_rhs_could_trap_p. Return true if S can trap. When INCLUDE_MEM is true, check whether the memory operations could trap. When INCLUDE_STORES is true and --- 2484,2489 ---- Index: gcc/gimple.h =================================================================== *** gcc/gimple.h (revision 182010) --- gcc/gimple.h (working copy) *************** void gimple_cond_get_ops_from_tree (tree *** 948,954 **** gimple gimple_build_cond_from_tree (tree, tree, tree); void gimple_cond_set_condition_from_tree (gimple, tree); bool gimple_has_side_effects (const_gimple); - bool gimple_rhs_has_side_effects (const_gimple); bool gimple_could_trap_p (gimple); bool gimple_could_trap_p_1 (gimple, bool, bool); bool gimple_assign_rhs_could_trap_p (gimple); --- 948,953 ---- Index: gcc/tree-ssa-dom.c =================================================================== *** gcc/tree-ssa-dom.c (revision 182010) --- gcc/tree-ssa-dom.c (working copy) *************** optimize_stmt (basic_block bb, gimple_st *** 2154,2165 **** /* Check for redundant computations. Do this optimization only for assignments that have no volatile ops and conditionals. */ ! may_optimize_p = (!gimple_has_volatile_ops (stmt) ! && ((is_gimple_assign (stmt) ! && !gimple_rhs_has_side_effects (stmt)) || (is_gimple_call (stmt) ! && gimple_call_lhs (stmt) != NULL_TREE ! && !gimple_rhs_has_side_effects (stmt)) || gimple_code (stmt) == GIMPLE_COND || gimple_code (stmt) == GIMPLE_SWITCH)); --- 2154,2163 ---- /* Check for redundant computations. Do this optimization only for assignments that have no volatile ops and conditionals. */ ! may_optimize_p = (!gimple_has_side_effects (stmt) ! && (is_gimple_assign (stmt) || (is_gimple_call (stmt) ! && gimple_call_lhs (stmt) != NULL_TREE) || gimple_code (stmt) == GIMPLE_COND || gimple_code (stmt) == GIMPLE_SWITCH));