[gcc r15-11486] middle-end/125156 - preserve edge flags in cleanup_control_expr_graph

Richard Biener via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:99e00f7ee0e60c13a38d4c68197afd83862173fa

commit r15-11486-g99e00f7ee0e60c13a38d4c68197afd83862173fa
Author: Richard Biener <[email protected]>
Date:   Mon May 4 11:18:24 2026 +0200

    middle-end/125156 - preserve edge flags in cleanup_control_expr_graph
    
    cleanup_control_expr_graph when setting EDGE_FALLTHRU cleared all
    existing edge flags such as EDGE_IRREDUCIBLE_LOOP rather than
    just the no longer relevant EDGE_TRUE_VALUE and EDGE_FALSE_VALUE flags.
    
            PR middle-end/125156
            * tree-cfgcleanup.cc (cleanup_control_expr_graph): Clear
            EDGE_TRUE_VALUE and EDGE_FALSE_VALUE edge flags only.
    
            * gcc.dg/torture/pr125156.c: New testcase.
    
    (cherry picked from commit 7b804275b251cabc9699717713f3870b89ab3395)

Diff:
---
 gcc/testsuite/gcc.dg/torture/pr125156.c | 26 ++++++++++++++++++++++++++
 gcc/tree-cfgcleanup.cc                  |  3 ++-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/gcc.dg/torture/pr125156.c b/gcc/testsuite/gcc.dg/torture/pr125156.c
new file mode 100644
index 000000000000..bb232b1a436c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr125156.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+
+#include <stdint.h>
+
+int64_t g1, g8;
+
+void g14()
+{
+  int16_t v5;
+  goto lbl_cont30;
+lbl_bf2:
+  g8 = 0;
+lbl_b5:
+  g1 = g1 - 8366249724514421075;
+  switch (v5)
+case 5:
+case 2:
+    goto lbl_b5;
+    goto lbl_bf2;
+lbl_cont30:
+    switch (v5)
+      {
+      case 0: goto lbl_bf2;
+      case 5: goto lbl_b5;
+      }
+}
diff --git a/gcc/tree-cfgcleanup.cc b/gcc/tree-cfgcleanup.cc
index 9a8a668e12b8..bae3215e29ec 100644
--- a/gcc/tree-cfgcleanup.cc
+++ b/gcc/tree-cfgcleanup.cc
@@ -200,7 +200,8 @@ cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi)
 
   bitmap_set_bit (cfgcleanup_altered_bbs, bb->index);
   gsi_remove (&gsi, true);
-  taken_edge->flags = EDGE_FALLTHRU;
+  taken_edge->flags &= ~(EDGE_TRUE_VALUE|EDGE_FALSE_VALUE);
+  taken_edge->flags |= EDGE_FALLTHRU;
 
   return retval;
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.