Message ID | 20230921023138.1789221-1-guojiufu@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | check undefine_p for one more vr | expand |
> Am 21.09.2023 um 05:10 schrieb Jiufu Guo <guojiufu@linux.ibm.com>: > > Hi, > > The root cause of PR111355 and PR111482 is missing to check if vr0 > is undefined_p before call vr0.lower_bound. > > In the pattern "(X + C) / N", > > (if (INTEGRAL_TYPE_P (type) > && get_range_query (cfun)->range_of_expr (vr0, @0)) > (if (...) > (plus (op @0 @2) { wide_int_to_tree (type, plus_op1 (c)); }) > (if (TYPE_UNSIGNED (type) && c.sign_mask () < 0 ... > && wi::geu_p (vr0.lower_bound (), -c)) > > In "(if (...)", there is code to prevent vr0's undefined_p, > But in the "else" part, vr0's undefined_p is not checked before > "wi::geu_p (vr0.lower_bound (), -c)". > > Bootstrap & regtest pass on ppc64{,le}. > Is this ok for trunk? Ok Richard > BR, > Jeff (Jiufu Guo) > > > PR tree-optimization/111355 > > gcc/ChangeLog: > > * match.pd ((X + C) / N): Update pattern. > > gcc/testsuite/ChangeLog: > > * gcc.dg/pr111355.c: New test. > > --- > gcc/match.pd | 2 +- > gcc/testsuite/gcc.dg/pr111355.c | 8 ++++++++ > 2 files changed, 9 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.dg/pr111355.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index 39c9c81966a..5fdfba14d47 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -1033,7 +1033,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > || (vr0.nonnegative_p () && vr3.nonnegative_p ()) > || (vr0.nonpositive_p () && vr3.nonpositive_p ()))) > (plus (op @0 @2) { wide_int_to_tree (type, plus_op1 (c)); }) > - (if (TYPE_UNSIGNED (type) && c.sign_mask () < 0 > + (if (!vr0.undefined_p () && TYPE_UNSIGNED (type) && c.sign_mask () < 0 > && exact_mod (-c) > /* unsigned "X-(-C)" doesn't underflow. */ > && wi::geu_p (vr0.lower_bound (), -c)) > diff --git a/gcc/testsuite/gcc.dg/pr111355.c b/gcc/testsuite/gcc.dg/pr111355.c > new file mode 100644 > index 00000000000..8bacbc69d31 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr111355.c > @@ -0,0 +1,8 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -Wno-div-by-zero" } */ > + > +/* Make sure no ICE. */ > +int main() { > + unsigned b; > + return b ? 1 << --b / 0 : 0; > +} > -- > 2.25.1 >
Hi, Richard Biener <rguenther@suse.de> writes: >> Am 21.09.2023 um 05:10 schrieb Jiufu Guo <guojiufu@linux.ibm.com>: >> >> Hi, >> >> The root cause of PR111355 and PR111482 is missing to check if vr0 >> is undefined_p before call vr0.lower_bound. >> >> In the pattern "(X + C) / N", >> >> (if (INTEGRAL_TYPE_P (type) >> && get_range_query (cfun)->range_of_expr (vr0, @0)) >> (if (...) >> (plus (op @0 @2) { wide_int_to_tree (type, plus_op1 (c)); }) >> (if (TYPE_UNSIGNED (type) && c.sign_mask () < 0 ... >> && wi::geu_p (vr0.lower_bound (), -c)) >> >> In "(if (...)", there is code to prevent vr0's undefined_p, >> But in the "else" part, vr0's undefined_p is not checked before >> "wi::geu_p (vr0.lower_bound (), -c)". >> >> Bootstrap & regtest pass on ppc64{,le}. >> Is this ok for trunk? > > Ok Thanks! Committed via r14-4192. BR, Jeff (Jiufu Guo) > > Richard > >> BR, >> Jeff (Jiufu Guo) >> >> >> PR tree-optimization/111355 >> >> gcc/ChangeLog: >> >> * match.pd ((X + C) / N): Update pattern. >> >> gcc/testsuite/ChangeLog: >> >> * gcc.dg/pr111355.c: New test. >> >> --- >> gcc/match.pd | 2 +- >> gcc/testsuite/gcc.dg/pr111355.c | 8 ++++++++ >> 2 files changed, 9 insertions(+), 1 deletion(-) >> create mode 100644 gcc/testsuite/gcc.dg/pr111355.c >> >> diff --git a/gcc/match.pd b/gcc/match.pd >> index 39c9c81966a..5fdfba14d47 100644 >> --- a/gcc/match.pd >> +++ b/gcc/match.pd >> @@ -1033,7 +1033,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) >> || (vr0.nonnegative_p () && vr3.nonnegative_p ()) >> || (vr0.nonpositive_p () && vr3.nonpositive_p ()))) >> (plus (op @0 @2) { wide_int_to_tree (type, plus_op1 (c)); }) >> - (if (TYPE_UNSIGNED (type) && c.sign_mask () < 0 >> + (if (!vr0.undefined_p () && TYPE_UNSIGNED (type) && c.sign_mask () < 0 >> && exact_mod (-c) >> /* unsigned "X-(-C)" doesn't underflow. */ >> && wi::geu_p (vr0.lower_bound (), -c)) >> diff --git a/gcc/testsuite/gcc.dg/pr111355.c b/gcc/testsuite/gcc.dg/pr111355.c >> new file mode 100644 >> index 00000000000..8bacbc69d31 >> --- /dev/null >> +++ b/gcc/testsuite/gcc.dg/pr111355.c >> @@ -0,0 +1,8 @@ >> +/* { dg-do compile } */ >> +/* { dg-options "-O3 -Wno-div-by-zero" } */ >> + >> +/* Make sure no ICE. */ >> +int main() { >> + unsigned b; >> + return b ? 1 << --b / 0 : 0; >> +} >> -- >> 2.25.1 >>
diff --git a/gcc/match.pd b/gcc/match.pd index 39c9c81966a..5fdfba14d47 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1033,7 +1033,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) || (vr0.nonnegative_p () && vr3.nonnegative_p ()) || (vr0.nonpositive_p () && vr3.nonpositive_p ()))) (plus (op @0 @2) { wide_int_to_tree (type, plus_op1 (c)); }) - (if (TYPE_UNSIGNED (type) && c.sign_mask () < 0 + (if (!vr0.undefined_p () && TYPE_UNSIGNED (type) && c.sign_mask () < 0 && exact_mod (-c) /* unsigned "X-(-C)" doesn't underflow. */ && wi::geu_p (vr0.lower_bound (), -c)) diff --git a/gcc/testsuite/gcc.dg/pr111355.c b/gcc/testsuite/gcc.dg/pr111355.c new file mode 100644 index 00000000000..8bacbc69d31 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr111355.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -Wno-div-by-zero" } */ + +/* Make sure no ICE. */ +int main() { + unsigned b; + return b ? 1 << --b / 0 : 0; +}