This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR68031


The following fixes the SSA name walking of the tree_nonnegative
predicate to stop when the SSA name is registered for update.  Otherwise
we might end up looking at stale data.

This would also have fixed PR67915.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2015-10-21  Richard Biener  <rguenther@suse.de>

	PR middle-end/68031
	* fold-const.c: Include tree-ssa-operands.h and tree-into-ssa.h.
	(tree_ssa_name_nonnegative_warnv_p): Fold into ...
	(tree_single_nonnegative_warnv_p): ... here.  For SSA names
	make sure they are not registered for update.

	* gcc.dg/torture/pr68031.c: New testcase.

Index: gcc/fold-const.c
===================================================================
*** gcc/fold-const.c	(revision 229031)
--- gcc/fold-const.c	(working copy)
*************** along with GCC; see the file COPYING3.
*** 79,84 ****
--- 79,86 ----
  #include "optabs-query.h"
  #include "gimple-fold.h"
  #include "params.h"
+ #include "tree-ssa-operands.h"
+ #include "tree-into-ssa.h"
  
  #ifndef LOAD_EXTEND_OP
  #define LOAD_EXTEND_OP(M) UNKNOWN
*************** tree_binary_nonnegative_warnv_p (enum tr
*** 12995,13019 ****
    return false;
  }
  
- /* Return true if SSA name T is known to be non-negative.  If the return
-    value is based on the assumption that signed overflow is undefined,
-    set *STRICT_OVERFLOW_P to true; otherwise, don't change
-    *STRICT_OVERFLOW_P.  DEPTH is the current nesting depth of the query.  */
- 
- static bool
- tree_ssa_name_nonnegative_warnv_p (tree t, bool *strict_overflow_p, int depth)
- {
-   /* Limit the depth of recursion to avoid quadratic behavior.
-      This is expected to catch almost all occurrences in practice.
-      If this code misses important cases that unbounded recursion
-      would not, passes that need this information could be revised
-      to provide it through dataflow propagation.  */
-   if (depth < PARAM_VALUE (PARAM_MAX_SSA_NAME_QUERY_DEPTH))
-     return gimple_stmt_nonnegative_warnv_p (SSA_NAME_DEF_STMT (t),
- 					    strict_overflow_p, depth);
-   return tree_simple_nonnegative_warnv_p (TREE_CODE (t), TREE_TYPE (t));
- }
- 
  /* Return true if T is known to be non-negative.  If the return
     value is based on the assumption that signed overflow is undefined,
     set *STRICT_OVERFLOW_P to true; otherwise, don't change
--- 13015,13020 ----
*************** tree_ssa_name_nonnegative_warnv_p (tree
*** 13022,13027 ****
--- 13023,13032 ----
  bool
  tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p, int depth)
  {
+   if (TREE_CODE (t) == SSA_NAME
+       && name_registered_for_update_p (t))
+     return false;
+ 
    if (TYPE_UNSIGNED (TREE_TYPE (t)))
      return true;
  
*************** tree_single_nonnegative_warnv_p (tree t,
*** 13040,13047 ****
        return RECURSE (TREE_OPERAND (t, 1)) && RECURSE (TREE_OPERAND (t, 2));
  
      case SSA_NAME:
!       return tree_ssa_name_nonnegative_warnv_p (t, strict_overflow_p, depth);
  
      default:
        return tree_simple_nonnegative_warnv_p (TREE_CODE (t), TREE_TYPE (t));
      }
--- 13045,13060 ----
        return RECURSE (TREE_OPERAND (t, 1)) && RECURSE (TREE_OPERAND (t, 2));
  
      case SSA_NAME:
!       /* Limit the depth of recursion to avoid quadratic behavior.
! 	 This is expected to catch almost all occurrences in practice.
! 	 If this code misses important cases that unbounded recursion
! 	 would not, passes that need this information could be revised
! 	 to provide it through dataflow propagation.  */
!       if (depth < PARAM_VALUE (PARAM_MAX_SSA_NAME_QUERY_DEPTH))
! 	return gimple_stmt_nonnegative_warnv_p (SSA_NAME_DEF_STMT (t),
! 						strict_overflow_p, depth);
  
+       /* Fallthru.  */
      default:
        return tree_simple_nonnegative_warnv_p (TREE_CODE (t), TREE_TYPE (t));
      }
Index: gcc/testsuite/gcc.dg/torture/pr68031.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr68031.c	(revision 0)
--- gcc/testsuite/gcc.dg/torture/pr68031.c	(working copy)
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ 
+ void _mktm_r (long lcltime,  int *res)
+ {
+   long rem = lcltime % ((60L * 60L) * 24L);
+   if (rem < 0)
+     return;
+   while (rem >= ((60L * 60L) * 24L))
+       rem -= ((60L * 60L) * 24L);
+   *res = (int) (rem % 60L);
+ }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]