On Sat, Apr 5, 2025 at 4:56 AM Andrew Pinski <quic_apin...@quicinc.com> wrote:
>
> After EVRP was switched to the ranger (r12-2305-g398572c1544d8b), we are 
> better handling the case
> where __builtin_unreachable comes after a loop. Instead of removing 
> __builtin_unreachable and having
> the loop become an infinite one; it is kept around longer and allows GCC to 
> unroll the loop 2 times instead
> of 3 times. When GCC unrolled the loop 3 times, GCC would produce a bogus 
> Warray-bounds warning for the 3rd
> iteration.
> This adds the testcase to make sure we don't regress on this case. It is 
> originally extracted from LLVM source
> code too.

Ping? It would be useful to have this testcase so we don't regress the
warning; especially since this is extracted from LLVM (with asserts
turned off which IIRC is the default way of building LLVM these days).

Thanks,
Andrew

>
>         PR tree-optimization/100038
>
> gcc/testsuite/ChangeLog:
>
>         * g++.dg/tree-ssa/pr100038.C: New test.
>
> Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
> ---
>  gcc/testsuite/g++.dg/tree-ssa/pr100038.C | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
>  create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr100038.C
>
> diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr100038.C 
> b/gcc/testsuite/g++.dg/tree-ssa/pr100038.C
> new file mode 100644
> index 00000000000..7024c4db2b2
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/tree-ssa/pr100038.C
> @@ -0,0 +1,17 @@
> +// { dg-do compile }
> +// { dg-options "-O2 -Wextra -Wall -Warray-bounds" }
> +
> +struct SparseBitVectorElement {
> +  long Bits[2];
> +  int find_first() const;
> +};
> +
> +// we should not get an `array subscript 2 is above array bounds of`
> +// warning here because we have an unreachable at that point
> +
> +int SparseBitVectorElement::find_first() const {
> +  for (unsigned i = 0; i < 2; ++i)
> +    if (Bits[i]) // { dg-bogus "is above array bounds of" }
> +      return i;
> +  __builtin_unreachable();
> +}
> --
> 2.43.0
>

Reply via email to