diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-11-20 00:02:21 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-11-20 00:02:21 +0100 |
commit | d3f293348768667c07770e433ff00af51fee73a2 (patch) | |
tree | e6772219b45c168901b54fe55de7384f1d27efbf /libstdc++-v3 | |
parent | d0d8b5d83614d8f0d0e40c0520d4f40ffa01f8d9 (diff) | |
download | gcc-d3f293348768667c07770e433ff00af51fee73a2.zip gcc-d3f293348768667c07770e433ff00af51fee73a2.tar.gz gcc-d3f293348768667c07770e433ff00af51fee73a2.tar.bz2 |
ranger: Improve a % b operand ranges [PR91029]
As mentioned in the PR, the previous PR91029 patch was testing
op2 >= 0 which is unnecessary, even negative op2 values will work the same,
furthermore, from if a % b > 0 we can deduce a > 0 rather than just a >= 0
(0 % b would be 0), and it actually valid even for other constants than 0,
a % b > 5 means a > 5 (a % b has the same sign as a and a in [0, 5] would
result in a % b in [0, 5]. Also, we can deduce a range for the other
operand, if we know
a % b >= 20, then b must be (in absolute value for signed modulo) > 20,
for a % [0, 20] the result would be [0, 19].
2020-11-19 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/91029
* range-op.cc (operator_trunc_mod::op1_range): Don't require signed
types, nor require that op2 >= 0. Implement (a % b) >= x && x > 0
implies a >= x and (a % b) <= x && x < 0 implies a <= x.
(operator_trunc_mod::op2_range): New method.
* gcc.dg/tree-ssa/pr91029-1.c: New test.
* gcc.dg/tree-ssa/pr91029-2.c: New test.
Diffstat (limited to 'libstdc++-v3')
0 files changed, 0 insertions, 0 deletions