diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2022-07-09 17:43:47 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2022-07-10 09:51:48 +0200 |
commit | c106825b936446c346d49ef10952e40370753b9d (patch) | |
tree | 519b54e869fafe79f056e806c3f01b8ff762b68a /libcpp/directives.cc | |
parent | a8cfc36b9964e5b62433269182232e59d82d6a23 (diff) | |
download | gcc-c106825b936446c346d49ef10952e40370753b9d.zip gcc-c106825b936446c346d49ef10952e40370753b9d.tar.gz gcc-c106825b936446c346d49ef10952e40370753b9d.tar.bz2 |
Cleanups to irange::nonzero bit code.
In discussions with Andrew we realized varying_p() was returning true
for a range of the entire domain with a non-empty nonzero mask. This
is confusing as varying_p() should only return true when absolutely no
information is available. A nonzero mask that has any cleared bits is
extra information and must return false for varying_p(). This patch
fixes this oversight. Now a range of the entire domain with nonzero
bits, is internally set to VR_RANGE (with the appropriate end points
set). VR_VARYING ranges must have a null nonzero mask.
Also, the union and intersect code were not quite right in the presence of
nonzero masks. Sometimes we would drop masks to -1 unnecessarily. I
was trying to be too smart in avoiding extra work when the mask was
NULL, but there's also an implicit mask in the range that must be
taken into account. For example, [0,0] may have no nonzero bits set
explicitly, but the mask is really 0x0. This will all be simpler when
we drop trees, because the nonzero bits will always be set, even if
-1.
Finally, I've added unit tests to the nonzero mask code. This should
help us maintain sanity going forward.
There should be no visible changes, as the main consumer of this code
is the SSA_NAME_RANGE_INFO patchset which has yet to be committed.
Tested on x86-64 Linux.
gcc/ChangeLog:
* value-range.cc (irange::operator=): Call verify_range.
(irange::irange_set): Normalize kind after everything else has
been set.
(irange::irange_set_anti_range): Same.
(irange::set): Same.
(irange::verify_range): Disallow nonzero masks for VARYING.
(irange::irange_union): Call verify_range.
Handle nonzero masks better.
(irange::irange_intersect): Same.
(irange::set_nonzero_bits): Calculate mask if either range has an
explicit mask.
(irange::intersect_nonzero_bits): Same.
(irange::union_nonzero_bits): Same.
(range_tests_nonzero_bits): New.
(range_tests): Call range_tests_nonzero_bits.
* value-range.h (class irange): Remove set_nonzero_bits method
with trees.
(irange::varying_compatible_p): Set nonzero mask.
Diffstat (limited to 'libcpp/directives.cc')
0 files changed, 0 insertions, 0 deletions