https://gcc.gnu.org/g:c25dbfc56075ffb8fbe8e1437e15266b9082bbd7

commit r17-3860-gc25dbfc56075ffb8fbe8e1437e15266b9082bbd7
Author: Aldy Hernandez <[email protected]>
Date:   Tue Sep 1 20:44:26 2026 +0000

    Add testcase for backward threading from never-executed entry edges 
[PR105679]
    
    r13-1891-g49ba4fdeb648c1 made the backward threader reject paths
    whose entry edge is probably never executed, but landed without a
    testcase.  Add one retroactively.
    
    [Also AI generated.]
    
    Assisted-by: Claude Fable 5 (Anthropic)
    
    gcc/testsuite/ChangeLog:
    
            PR tree-optimization/105679
            PR tree-optimization/126906
            * gcc.dg/tree-ssa/pr105679.c: New test.

Diff:
---
 gcc/testsuite/gcc.dg/tree-ssa/pr105679.c | 33 ++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr105679.c 
b/gcc/testsuite/gcc.dg/tree-ssa/pr105679.c
new file mode 100644
index 000000000000..5f7b6cf0d1de
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr105679.c
@@ -0,0 +1,33 @@
+/* PR tree-optimization/105679 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Warray-bounds -fno-strict-overflow -fsanitize=shift 
-fsanitize-coverage=trace-pc -fdump-tree-threadfull1-details" } */
+
+/* Reduced with cvise from attachment 53010: the Linux kernel hit spurious
+   -Warray-bounds warnings with -fsanitize=shift.  The sanitizer's
+   shift-out-of-bounds check for 1 << irq gives the irq > 31 branch a precise
+   never-executed count; the backward threader nevertheless used that block as
+   a thread entry, isolating a never-executed path on which irq > 31 indexes
+   the 2-element array and drawing the bogus warning.  The bare shift statement
+   only exists to feed the sanitizer.
+
+   r13-1891 (the PR105679 fix) rejects paths whose entry edge is probably never
+   executed.  This test FAILs before that commit and PASSes with it.  */
+
+struct many_objects
+{
+  int array[2];
+} instance;
+
+int entry;
+
+int
+work (unsigned int irq)
+{
+  1 << irq;
+  entry = instance.array[irq]; /* { dg-bogus "above array bounds" } */
+  if (irq)
+    return 0;
+  return 1;
+}
+
+/* { dg-final { scan-tree-dump "path entry is probably never executed" 
"threadfull1" } } */

Reply via email to