aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2020-10-12 10:41:21 -0400
committerAldy Hernandez <aldyh@redhat.com>2020-10-12 12:52:46 -0400
commit82118acc18e416b9c82c82ce7737f5e6246d6574 (patch)
tree793d21605efeec162a33c87ed58bd3213708387e
parent3175d40fc52fb8eb3c3b18cc343d773da24434fb (diff)
downloadgcc-82118acc18e416b9c82c82ce7737f5e6246d6574.zip
gcc-82118acc18e416b9c82c82ce7737f5e6246d6574.tar.gz
gcc-82118acc18e416b9c82c82ce7737f5e6246d6574.tar.bz2
operator_trunc_mod::wi_fold: Return VARYING for mod by zero.
gcc/ChangeLog: PR tree-optimization/97378 * range-op.cc (operator_trunc_mod::wi_fold): Return VARYING for mod by zero. gcc/testsuite/ChangeLog: * gcc.dg/pr97378.c: New test.
-rw-r--r--gcc/range-op.cc6
-rw-r--r--gcc/testsuite/gcc.dg/pr97378.c15
2 files changed, 18 insertions, 3 deletions
diff --git a/gcc/range-op.cc b/gcc/range-op.cc
index ce6ae2d..6108de3 100644
--- a/gcc/range-op.cc
+++ b/gcc/range-op.cc
@@ -1359,7 +1359,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_undefined ();
+ r.set_varying (type);
return;
}
@@ -2624,10 +2624,10 @@ operator_trunc_mod::wi_fold (irange &r, tree type,
signop sign = TYPE_SIGN (type);
unsigned prec = TYPE_PRECISION (type);
- // Mod 0 is undefined. Return undefined.
+ // Mod 0 is undefined.
if (wi_zero_p (type, rh_lb, rh_ub))
{
- r.set_undefined ();
+ r.set_varying (type);
return;
}
diff --git a/gcc/testsuite/gcc.dg/pr97378.c b/gcc/testsuite/gcc.dg/pr97378.c
new file mode 100644
index 0000000..27e4a1f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr97378.c
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+int a, b, c;
+void d() {
+e : {
+ long f;
+ long *g = &f;
+ if ((a != 0) - (b = 0))
+ ;
+ else
+ a &= (*g %= a *= c) >= (*g || f);
+ goto e;
+}
+}