llvm-project/polly/lib/Support
Roman Lebedev 82fb4f4b22
[SCEV] Sequential/in-order `UMin` expression
As discussed in https://github.com/llvm/llvm-project/issues/53020 / https://reviews.llvm.org/D116692,
SCEV is forbidden from reasoning about 'backedge taken count'
if the branch condition is a poison-safe logical operation,
which is conservatively correct, but is severely limiting.

Instead, we should have a way to express those
poison blocking properties in SCEV expressions.

The proposed semantics is:
```
Sequential/in-order min/max SCEV expressions are non-commutative variants
of commutative min/max SCEV expressions. If none of their operands
are poison, then they are functionally equivalent, otherwise,
if the operand that represents the saturation point* of given expression,
comes before the first poison operand, then the whole expression is not poison,
but is said saturation point.
```
* saturation point - the maximal/minimal possible integer value for the given type

The lowering is straight-forward:
```
compare each operand to the saturation point,
perform sequential in-order logical-or (poison-safe!) ordered reduction
over those checks, and if reduction returned true then return
saturation point else return the naive min/max reduction over the operands
```
https://alive2.llvm.org/ce/z/Q7jxvH (2 ops)
https://alive2.llvm.org/ce/z/QCRrhk (3 ops)
Note that we don't need to check the last operand: https://alive2.llvm.org/ce/z/abvHQS
Note that this is not commutative: https://alive2.llvm.org/ce/z/FK9e97

That allows us to handle the patterns in question.

Reviewed By: nikic, reames

Differential Revision: https://reviews.llvm.org/D116766
2022-01-10 20:51:26 +03:00
..
DumpFunctionPass.cpp [Polly] Don't prune non-external function itself from dump. 2021-08-28 17:06:53 -05:00
DumpModulePass.cpp [Polly] Add support for -polly-dump-before(-file) with the NPM. 2021-05-17 20:58:37 -05:00
GICHelper.cpp [Polly] Do not inline dumpIslObj methods. NFC. 2021-10-12 23:52:36 -05:00
ISLTools.cpp [Polly][Isl] Fix -Wsign-compare after D113101 2021-11-11 00:17:52 -08:00
Mainpage.h
PollyPasses.def [Polly] Port DeadCodeElim to the NewPM. 2021-03-24 01:01:29 -05:00
RegisterPasses.cpp [Polly] Remove support for code generated by gfortran+DragonEgg. 2021-10-14 14:12:06 -05:00
SCEVAffinator.cpp [SCEV] Sequential/in-order `UMin` expression 2022-01-10 20:51:26 +03:00
SCEVValidator.cpp [SCEV] Sequential/in-order `UMin` expression 2022-01-10 20:51:26 +03:00
ScopHelper.cpp [SCEV] Sequential/in-order `UMin` expression 2022-01-10 20:51:26 +03:00
ScopLocation.cpp Fix polly build after StringRef change. 2020-01-28 19:44:20 -08:00
VirtualInstruction.cpp [Polly] Support for InlineAsm. 2021-09-26 03:26:43 -05:00