aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2022-10-04 17:03:54 +0200
committerAldy Hernandez <aldyh@redhat.com>2022-10-05 14:21:01 +0200
commitae56d600d223e996054483d7d7033ec8e258d39d (patch)
tree7eb1988c235b85688e6f63ff80f694a41d9c070e /gcc
parent853ce8eea4ff97850a987167e603387b3d0f1401 (diff)
downloadgcc-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.cc8
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;
}