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

Reply via email to