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));
  

Reply via email to