[PATCH] D70043: [ConstantRange] Add `mulWithNoWrap()` method

Roman Lebedev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 5 14:17:46 PST 2019


lebedev.ri added a comment.

In D70043#1771089 <https://reviews.llvm.org/D70043#1771089>, @nikic wrote:

> > Baseline ConstantRange::mul() does not have an exhaustive test,
> >  and if i add one (TestUnsignedBinOpExhaustive()+/*CorrectnessOnly=*/true),
> >  it doesn't pass.
>
> For my own sanity: This doesn't mean that the multiply() implementation is incorrect, just that this testing function is a bit overly aggressive in CorrectnessOnly mode. It expects the result to be a superset of the minimal unsigned bounding range.


Sure, of course, otherwise the `EXPECT_TRUE(CR.contains(N));` would complain.

> We might want to change the function to actually only check correctness via `EXPECT_TRUE(CR.contains(N))`.

Note that we already do that check, otherwise we wouldn't know that the result is at least conservatively correct.

> Looking a bit into what causes the failures for mulWithNoWrap when testing not only correctness for the unsigned case. I think there are two main causes:
> 
> - Something like `[0, 1] * [-8, -5]` produces `[-8, 0]`, while the testing code expects `[0, -5]`. This actual result is consistent with the "smallest range" preferred range mode, so this is just a testing deficiency.
> - Something like `[0, 2] * [-8, -5]` produces full-set, while the testing code expects `[0, -5]`. The reason here is that the result can be in the ranges `[0, 0]`, `[-8, -5]` or `[2 * -8, 2 * -5]`, where the last range is unsigned (and signed) wrapping, so the result could actually be the same as for the previous case. However, we don't recognize that the `2 * [-8, -5]` case is fully excluded.
> 
>   So I guess it would be pretty hard to make this work non-approximately...




Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D70043/new/

https://reviews.llvm.org/D70043





More information about the llvm-commits mailing list