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.
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