This commit defines a dataflow analysis for integer ranges, which

uses a newly-added InferIntRangeInterface to compute the lower and

upper bounds on the results of an operation from the bounds on the

arguments. The range inference is a flow-insensitive dataflow analysis

that can be used to simplify code, such as by statically identifying

bounds checks that cannot fail in order to eliminate them.

The InferIntRangeInterface has one method, inferResultRanges(), which

takes a vector of inferred ranges for each argument to an op

implementing the interface and a callback allowing the implementation

to define the ranges for each result. These ranges are stored as

ConstantIntRanges, which hold the lower and upper bounds for a

value. Bounds are tracked separately for the signed and unsigned

interpretations of a value, which ensures that the impact of

arithmetic overflows is correctly tracked during the analysis.

The commit also adds a -test-int-range-inference pass to test the

analysis until it is integrated into SCCP or otherwise exposed.

Finally, this commit fixes some bugs relating to the handling of

region iteration arguments and terminators in the data flow analysis

framework.

Depends on D124020

Depends on D124021

What about this is arithmetic specific? Can we have this in a more general place?