diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2020-10-12 04:08:28 -0400 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2020-10-12 05:48:10 -0400 |
commit | e1b4fbfea6ad24f47279b90aec27ef1512625c80 (patch) | |
tree | 52e8e8b4fc19b9a9c2c15cc01565e681dadef66a /gcc | |
parent | ab87b0add6a7c3464ee9067dd99e037e79f81984 (diff) | |
download | gcc-e1b4fbfea6ad24f47279b90aec27ef1512625c80.zip gcc-e1b4fbfea6ad24f47279b90aec27ef1512625c80.tar.gz gcc-e1b4fbfea6ad24f47279b90aec27ef1512625c80.tar.bz2 |
Ignore shifts larger than precision in operator_rshift::op1_range.
gcc/ChangeLog:
PR tree-optimization/97371
* range-op.cc (operator_rshift::op1_range): Ignore shifts larger than
or equal to type precision.
gcc/testsuite/ChangeLog:
* gcc.dg/pr97371.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/range-op.cc | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr97371.c | 8 |
2 files changed, 15 insertions, 0 deletions
diff --git a/gcc/range-op.cc b/gcc/range-op.cc index d1a11b3..ce6ae2d 100644 --- a/gcc/range-op.cc +++ b/gcc/range-op.cc @@ -1626,6 +1626,13 @@ operator_rshift::op1_range (irange &r, tree shift; if (op2.singleton_p (&shift)) { + // Ignore nonsensical shifts. + unsigned prec = TYPE_PRECISION (type); + if (wi::ge_p (wi::to_wide (shift), + wi::uhwi (prec, TYPE_PRECISION (TREE_TYPE (shift))), + UNSIGNED)) + return false; + // Folding the original operation may discard some impossible // ranges from the LHS. int_range_max lhs_refined; diff --git a/gcc/testsuite/gcc.dg/pr97371.c b/gcc/testsuite/gcc.dg/pr97371.c new file mode 100644 index 0000000..ffefad0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr97371.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -w" } */ + +int a, b; +void c() { + if (b >> 38) + a = b; +} |