]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Add testcase for bogus Warray-bounds warning dealing with __builtin_unreachable ...
authorAndrew Pinski <quic_apinski@quicinc.com>
Sat, 5 Apr 2025 11:47:59 +0000 (04:47 -0700)
committerAndrew Pinski <quic_apinski@quicinc.com>
Mon, 28 Apr 2025 17:14:13 +0000 (10:14 -0700)
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_apinski@quicinc.com>
gcc/testsuite/g++.dg/tree-ssa/pr100038.C [new file with mode: 0644]

diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr100038.C b/gcc/testsuite/g++.dg/tree-ssa/pr100038.C
new file mode 100644 (file)
index 0000000..7024c4d
--- /dev/null
@@ -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();
+}