diff options
| author | Roman Lebedev <lebedev.ri@gmail.com> | 2022-01-10 20:49:41 +0300 |
|---|---|---|
| committer | Roman Lebedev <lebedev.ri@gmail.com> | 2022-01-10 20:51:26 +0300 |
| commit | 82fb4f4b223d78e86647f3576e41e3086ab42cd5 (patch) | |
| tree | 3bd0b9179c7d7718e67a38352f7f152b6e710fb8 /libcxx/include/__algorithm/includes.h | |
| parent | 07a0b0ee94880cc193f3c63ebe3c4662c3123606 (diff) | |
| download | llvm-82fb4f4b223d78e86647f3576e41e3086ab42cd5.zip llvm-82fb4f4b223d78e86647f3576e41e3086ab42cd5.tar.gz llvm-82fb4f4b223d78e86647f3576e41e3086ab42cd5.tar.bz2 | |
[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
Diffstat (limited to 'libcxx/include/__algorithm/includes.h')
0 files changed, 0 insertions, 0 deletions
