tree-vrp.c (extract_range_from_binary_expr): If flag_non_call_exceptions don't eliminate division by zero.
gcc/: * tree-vrp.c (extract_range_from_binary_expr): If flag_non_call_exceptions don't eliminate division by zero. * simplify-rtx.c (simplify_binary_operation_1): Likewise. gcc/testsuite/: * gcc.c-torture/execute/20101011-1.c: New test. * gcc.c-torture/execute/20101011-1.x: New test driver. From-SVN: r165884
This commit is contained in:
parent
67f67405cb
commit
0e1b8b109f
|
@ -1,3 +1,9 @@
|
|||
2010-10-23 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
* tree-vrp.c (extract_range_from_binary_expr): If
|
||||
flag_non_call_exceptions don't eliminate division by zero.
|
||||
* simplify-rtx.c (simplify_binary_operation_1): Likewise.
|
||||
|
||||
2010-10-23 Nathan Froyd <froydnj@codesourcery.com>
|
||||
|
||||
* cppbuiltin.c (define_builtin_macros_for_type_sizes): Define
|
||||
|
|
|
@ -2755,7 +2755,8 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
|
|||
else
|
||||
{
|
||||
/* 0/x is 0 (or x&0 if x has side-effects). */
|
||||
if (trueop0 == CONST0_RTX (mode))
|
||||
if (trueop0 == CONST0_RTX (mode)
|
||||
&& !cfun->can_throw_non_call_exceptions)
|
||||
{
|
||||
if (side_effects_p (op1))
|
||||
return simplify_gen_binary (AND, mode, op1, trueop0);
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-10-23 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
* gcc.c-torture/execute/20101011-1.c: New test.
|
||||
* gcc.c-torture/execute/20101011-1.x: New test driver.
|
||||
|
||||
2010-10-23 Tobias Burnus <burnus@net-b.de>
|
||||
|
||||
PR fortran/46122
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
/* With -fnon-call-exceptions 0 / 0 should not be eliminated. The .x
|
||||
file sets the option. */
|
||||
|
||||
#ifdef SIGNAL_SUPPRESS
|
||||
# define DO_TEST 0
|
||||
#elif defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) || defined (__POWERPC__) || defined (__ppc)
|
||||
/* On PPC division by zero does not trap. */
|
||||
# define DO_TEST 0
|
||||
#elif defined (__SPU__)
|
||||
/* On SPU division by zero does not trap. */
|
||||
# define DO_TEST 0
|
||||
#else
|
||||
# define DO_TEST 1
|
||||
#endif
|
||||
|
||||
#if DO_TEST
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
void
|
||||
sigfpe (int signum __attribute__ ((unused)))
|
||||
{
|
||||
exit (0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* When optimizing, the compiler is smart enough to constant fold the
|
||||
static unset variables i and j to produce 0 / 0, but it can't
|
||||
eliminate the assignment to the global k. */
|
||||
static int i;
|
||||
static int j;
|
||||
int k;
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
#ifdef DO_TEST
|
||||
signal (SIGFPE, sigfpe);
|
||||
k = i / j;
|
||||
abort ();
|
||||
#else
|
||||
exit (0);
|
||||
#endif
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
set additional_flags "-fnon-call-exceptions"
|
||||
return 0
|
|
@ -2456,6 +2456,22 @@ extract_range_from_binary_expr (value_range_t *vr,
|
|||
}
|
||||
}
|
||||
|
||||
/* For divisions, if flag_non_call_exceptions is true, we must
|
||||
not eliminate a division by zero. */
|
||||
if ((code == TRUNC_DIV_EXPR
|
||||
|| code == FLOOR_DIV_EXPR
|
||||
|| code == CEIL_DIV_EXPR
|
||||
|| code == EXACT_DIV_EXPR
|
||||
|| code == ROUND_DIV_EXPR)
|
||||
&& cfun->can_throw_non_call_exceptions
|
||||
&& (vr1.type != VR_RANGE
|
||||
|| symbolic_range_p (&vr1)
|
||||
|| range_includes_zero_p (&vr1)))
|
||||
{
|
||||
set_value_range_to_varying (vr);
|
||||
return;
|
||||
}
|
||||
|
||||
/* For divisions, if op0 is VR_RANGE, we can deduce a range
|
||||
even if op1 is VR_VARYING, VR_ANTI_RANGE, symbolic or can
|
||||
include 0. */
|
||||
|
|
Loading…
Reference in New Issue