vrp: Fix up gcc.target/aarch64/pr90838.c [PR97312, PR94801]
authorJakub Jelinek <jakub@redhat.com>
Fri, 9 Oct 2020 08:19:16 +0000 (10:19 +0200)
committerJakub Jelinek <jakub@redhat.com>
Fri, 9 Oct 2020 08:19:16 +0000 (10:19 +0200)
commit781634daea8cb788efb33994f4a19df76598542e
treead884bc76509088a42cd3c583ca2f97941fe5cbe
parent600cf1128e49f086522bfddc54490b4e39e30383
vrp: Fix up gcc.target/aarch64/pr90838.c [PR97312, PR94801]

> Perhaps another way out of this would be document and enforce that
> __builtin_c[lt]z{,l,ll} etc calls are undefined at zero, but C[TL]Z ifn
> calls are defined there based on *_DEFINED_VALUE_AT_ZERO (*) == 2

The following patch implements that, i.e. __builtin_c?z* now take full
advantage of them being UB at zero, while the ifns are well defined at zero
if *_DEFINED_VALUE_AT_ZERO (*) == 2.  That is what fixes PR94801.

Furthermore, to fix PR97312, if it is well defined at zero and the value at
zero is prec, we don't lower the maximum unless the argument is known to be
non-zero.
For gimple-range.cc I guess we could improve it if needed e.g. by returning
a [0,7][32,32] range for .CTZ of e.g. [0,137], but for now it (roughly)
matches what vr-values.c does.

2020-10-09  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/94801
PR target/97312
* vr-values.c (vr_values::extract_range_basic) <CASE_CFN_CLZ,
CASE_CFN_CTZ>: When stmt is not an internal-fn call or
C?Z_DEFINED_VALUE_AT_ZERO is not 2, assume argument is not zero
and thus use [0, prec-1] range unless it can be further improved.
For CTZ, don't update maxi from upper bound if it was previously prec.
* gimple-range.cc (gimple_ranger::range_of_builtin_call) <CASE_CFN_CLZ,
CASE_CFN_CTZ>: Likewise.

* gcc.dg/tree-ssa/pr94801.c: New test.
gcc/gimple-range.cc
gcc/testsuite/gcc.dg/tree-ssa/pr94801.c [new file with mode: 0644]
gcc/vr-values.c