https://gcc.gnu.org/g:07a14a490b8f57dfe2a5b853fb4b88e9e124a92b

commit r16-238-g07a14a490b8f57dfe2a5b853fb4b88e9e124a92b
Author: Andrew Pinski <quic_apin...@quicinc.com>
Date:   Sat Apr 5 04:47:59 2025 -0700

    Add testcase for bogus Warray-bounds warning dealing with 
__builtin_unreachable [PR100038]
    
    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>

Diff:
---
 gcc/testsuite/g++.dg/tree-ssa/pr100038.C | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

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 000000000000..7024c4db2b21
--- /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();
+}

Reply via email to