I'm happy to finally contribute the range-ops part of the ranger work.
This is the infrastructure for folding unary and binary ranges of
tree_codes into a resulting range. It is the ranger counterpart of
extract_range_from_*_expr in tree-vrp.c (not the similarly called
callers in vr-values.c).
It is divided into four parts. The first 3 patches are supporting
infrastructure for range-ops, but are technically independent and are
useful on their own. They are:
patch 01: VR_UNDEFINED and VR_VARYING now have a type.
patch 02: Enforce canonicalization in value_range.
patch 03: Abstract overflow handling, pointer_plus_expr
symbolics, and plus/minus into their own functions.
We've discussed and agreed on the general approach of the first two
before. The final one is just shuffling things around so we can share
value_range overflow handling, plus/minus, and pointer_plus symbolics
with the ranger. There are no changes to functionality in patch 03.
Note, that even though these 3 patches are technically independent, they
keep touching the same bits over and over, so it's easier to scaffold
them. That is, patch 2 depends on 1 and patch 3 depends on 1 and 2. It
was a pain just to get them organized without just submitting a huge patch.
Finally, there is patch 04 which is range-ops itself. I will discuss
this in detail in the appropriate patch, but the general gist is that
(if we agree), we will be running range-ops and extract_range_from_*expr
during stage1, while comparing that the results agree. Once everyone is
in agreement, we can rip out the extract_range_from_* bits from
tree-vrp.c There will be a flag (-franges={vrp,range-ops,checking} and
the default will be checking (run both and compare).
Let's get this party started!
Aldy