[SCEV] Use context to strengthen flags of BinOps
authorMax Kazantsev <mkazantsev@azul.com>
Wed, 3 Aug 2022 06:10:56 +0000 (13:10 +0700)
committerMax Kazantsev <mkazantsev@azul.com>
Wed, 3 Aug 2022 07:08:57 +0000 (14:08 +0700)
commit34ae308c73e4d76dbdab25a6206d3fbc5ebafdf5
tree905baf7d3cbe2e7de7aaa11e4778529fd4264090
parent817dd5e3fd6bdad584728843c72892f0fae058cd
[SCEV] Use context to strengthen flags of BinOps

Sometimes SCEV cannot infer nuw/nsw from something as simple as
```
  len in [0, MAX_INT]
...
  iv = phi(0, iv.next)
  guard(iv <s len)
  guard(iv <u len)
  iv.next = iv + 1
```
just because flag strenthening only relies on definition and does not use local facts.
This patch adds support for the simplest case: inference of flags of `add(x, constant)`
if we can contextually prove that `x <= max_int - constant`.

In case if it has negative CT impact, we can add an option to switch it off. I woudln't
expect that though.

Differential Revision: https://reviews.llvm.org/D129643
Reviewed By: apilipenko
12 files changed:
llvm/include/llvm/Analysis/ScalarEvolution.h
llvm/lib/Analysis/ScalarEvolution.cpp
llvm/test/Transforms/IndVarSimplify/AArch64/widen-loop-comp.ll
llvm/test/Transforms/IndVarSimplify/X86/iv-widen.ll
llvm/test/Transforms/IndVarSimplify/X86/pr35406.ll
llvm/test/Transforms/IndVarSimplify/bbi-63564.ll
llvm/test/Transforms/IndVarSimplify/cycled_phis.ll
llvm/test/Transforms/IndVarSimplify/eliminate-comparison.ll
llvm/test/Transforms/IndVarSimplify/finite-exit-comparisons.ll
llvm/test/Transforms/IndVarSimplify/loop-predication.ll
llvm/test/Transforms/IndVarSimplify/trivial-guard.ll
llvm/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll