From 5b6f04276e3d1f20817ed37b2e26e43bd12cc0d2 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 28 Jan 2022 10:55:29 +0100 Subject: [PATCH] tree-optimization/104263 - avoid retaining abnormal edges for non-call/goto stmts This removes a premature optimization from gimple_purge_dead_abnormal_call_edges which, after eliding the last setjmp (or computed goto) statement from a function and thus clearing cfun->calls_setjmp, leaves us with the abnormal edges from other calls that are elided for example via inlining or DCE. That's a CFG / IL combination that should be impossible (not addressing the fact that with cfun->calls_setjmp and cfun->has_nonlocal_label cleared we should not have any abnormal edge at all). For the testcase in the PR this means that IPA inlining will remove the abormal edges from the block after inlining the call the edge was coming from. 2022-01-28 Richard Biener PR tree-optimization/104263 * tree-cfg.cc (gimple_purge_dead_abnormal_call_edges): Purge edges also when !cfun->has_nonlocal_label and !cfun->calls_setjmp. * gcc.dg/tree-ssa/inline-13.c: New testcase. --- gcc/testsuite/gcc.dg/tree-ssa/inline-13.c | 27 +++++++++++++++++++++++ gcc/tree-cfg.cc | 4 ---- 2 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/inline-13.c diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-13.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-13.c new file mode 100644 index 000000000000..94d8a9c709e6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-13.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-early-inlining -fdump-tree-fixup_cfg3" } */ + +int n; + +static int +bar (void) +{ + int a; + + n = 0; + a = 0; + + return n; +} + +__attribute__ ((pure, returns_twice)) int +foo (void) +{ + n = bar () + 1; + foo (); + + return 0; +} + +/* Abnormal edges should be properly elided after IPA inlining of bar. */ +/* { dg-final { scan-tree-dump-times "bb" 1 "fixup_cfg3" } } */ diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc index 77178a6bf693..efd10332c537 100644 --- a/gcc/tree-cfg.cc +++ b/gcc/tree-cfg.cc @@ -8915,10 +8915,6 @@ gimple_purge_dead_abnormal_call_edges (basic_block bb) edge_iterator ei; gimple *stmt = last_stmt (bb); - if (!cfun->has_nonlocal_label - && !cfun->calls_setjmp) - return false; - if (stmt && stmt_can_make_abnormal_goto (stmt)) return false; -- 2.47.2