aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2021-07-28 13:14:22 -0400
committerAndrew MacLeod <amacleod@redhat.com>2021-07-30 15:10:48 -0400
commitebbcdd7fae1f802763850e4afedfdfa09cf10e1a (patch)
treecf21f2d2140b00303b24119cd93ad5190d43c009 /gcc
parentd242acc396d645267cd1ccbdb4d0d73cc9b1ef48 (diff)
downloadgcc-ebbcdd7fae1f802763850e4afedfdfa09cf10e1a.zip
gcc-ebbcdd7fae1f802763850e4afedfdfa09cf10e1a.tar.gz
gcc-ebbcdd7fae1f802763850e4afedfdfa09cf10e1a.tar.bz2
Change integral divide by zero to produce UNDEFINED.
Instead of VARYING, we can get better results by treating divide by zero as producing an undefined result. gcc/ * range-op.cc (operator_div::wi_fold): Return UNDEFINED for [0, 0] divisor. gcc/testsuite/ * gcc.dg/tree-ssa/pr61839_2.c: Adjust.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/range-op.cc9
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr61839_2.c3
2 files changed, 2 insertions, 10 deletions
diff --git a/gcc/range-op.cc b/gcc/range-op.cc
index b1fb25c..6922888 100644
--- a/gcc/range-op.cc
+++ b/gcc/range-op.cc
@@ -1785,13 +1785,6 @@ operator_div::wi_fold (irange &r, tree type,
const wide_int &lh_lb, const wide_int &lh_ub,
const wide_int &rh_lb, const wide_int &rh_ub) const
{
- // If we know we will divide by zero...
- if (rh_lb == 0 && rh_ub == 0)
- {
- r.set_varying (type);
- return;
- }
-
const wide_int dividend_min = lh_lb;
const wide_int dividend_max = lh_ub;
const wide_int divisor_min = rh_lb;
@@ -1818,7 +1811,7 @@ operator_div::wi_fold (irange &r, tree type,
// If we're definitely dividing by zero, there's nothing to do.
if (wi_zero_p (type, divisor_min, divisor_max))
{
- r.set_varying (type);
+ r.set_undefined ();
return;
}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr61839_2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr61839_2.c
index cfec54d..f1b8feb 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr61839_2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr61839_2.c
@@ -45,9 +45,8 @@ int bar2 ()
return 0;
}
-
/* Dont optimize 972195717 / 0 in function foo. */
-/* { dg-final { scan-tree-dump-times "972195717 / " 1 "evrp" } } */
+/* { dg-final { scan-tree-dump-times "972195717 / " 0 "evrp" } } */
/* Dont optimize 972195717 % 0 in function bar. */
/* { dg-final { scan-tree-dump-times "972195717 % " 1 "evrp" } } */
/* May optimize in function bar2, but EVRP doesn't perform this yet. */