diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2022-10-04 17:03:54 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2022-10-05 14:21:01 +0200 |
commit | ae56d600d223e996054483d7d7033ec8e258d39d (patch) | |
tree | 7eb1988c235b85688e6f63ff80f694a41d9c070e /gcc | |
parent | 853ce8eea4ff97850a987167e603387b3d0f1401 (diff) | |
download | gcc-ae56d600d223e996054483d7d7033ec8e258d39d.zip gcc-ae56d600d223e996054483d7d7033ec8e258d39d.tar.gz gcc-ae56d600d223e996054483d7d7033ec8e258d39d.tar.bz2 |
[PR tree-optimization/107052] range-ops: Pass nonzero masks through cast.
Track nonzero masks through a cast in range-ops.
PR tree-optimization/107052
gcc/ChangeLog:
* range-op.cc (operator_cast::fold_range): Set nonzero mask.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/range-op.cc | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/gcc/range-op.cc b/gcc/range-op.cc index 4f647ab..6fa27a8 100644 --- a/gcc/range-op.cc +++ b/gcc/range-op.cc @@ -2515,6 +2515,14 @@ operator_cast::fold_range (irange &r, tree type ATTRIBUTE_UNUSED, if (r.varying_p ()) return true; } + + // Pass nonzero mask through the cast. + if (!truncating_cast_p (inner, outer)) + { + wide_int nz = inner.get_nonzero_bits (); + nz = wide_int::from (nz, TYPE_PRECISION (type), TYPE_SIGN (inner.type ())); + r.set_nonzero_bits (nz); + } return true; } |