diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2021-07-28 13:14:22 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2021-07-30 15:10:48 -0400 |
commit | ebbcdd7fae1f802763850e4afedfdfa09cf10e1a (patch) | |
tree | cf21f2d2140b00303b24119cd93ad5190d43c009 | |
parent | d242acc396d645267cd1ccbdb4d0d73cc9b1ef48 (diff) | |
download | gcc-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.
-rw-r--r-- | gcc/range-op.cc | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr61839_2.c | 3 |
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. */ |