[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; }