A returns_twice call may have associated abnormal edges that correspond
to the "second return" from the call. If the call is duplicated, the
copies of those edges also need to be abnormal, but e.g. tracer does not
enforce that. Just prohibit the (unlikely to be useful) duplication.

gcc/ChangeLog:

        * tree-cfg.c (gimple_can_duplicate_bb_p): Reject blocks with
        calls that may return twice.
---
 gcc/tree-cfg.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index b7fe313b7..a99f1acb4 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -6304,12 +6304,15 @@ gimple_can_duplicate_bb_p (const_basic_block bb)
     {
       gimple *g = gsi_stmt (gsi);
 
-      /* An IFN_GOMP_SIMT_ENTER_ALLOC/IFN_GOMP_SIMT_EXIT call must be
+      /* Prohibit duplication of returns_twice calls, otherwise associated
+        abnormal edges also need to be duplicated properly.
+        An IFN_GOMP_SIMT_ENTER_ALLOC/IFN_GOMP_SIMT_EXIT call must be
         duplicated as part of its group, or not at all.
         The IFN_GOMP_SIMT_VOTE_ANY and IFN_GOMP_SIMT_XCHG_* are part of such a
         group, so the same holds there.  */
       if (is_gimple_call (g)
-         && (gimple_call_internal_p (g, IFN_GOMP_SIMT_ENTER_ALLOC)
+         && (gimple_call_flags (g) & ECF_RETURNS_TWICE
+             || gimple_call_internal_p (g, IFN_GOMP_SIMT_ENTER_ALLOC)
              || gimple_call_internal_p (g, IFN_GOMP_SIMT_EXIT)
              || gimple_call_internal_p (g, IFN_GOMP_SIMT_VOTE_ANY)
              || gimple_call_internal_p (g, IFN_GOMP_SIMT_XCHG_BFLY)
-- 
2.33.1

  • [RFC PATCH] tree-s... Alexander Monakov via Gcc-patches
    • Re: [RFC PATC... Richard Biener via Gcc-patches
      • Re: [RFC ... Alexander Monakov via Gcc-patches
        • Re: [... Алексей Нурмухаметов via Gcc-patches
          • R... Richard Biener via Gcc-patches
            • ... Alexander Monakov via Gcc-patches
              • ... Richard Biener via Gcc-patches
                • ... Alexander Monakov via Gcc-patches
                • ... Alexander Monakov via Gcc-patches
                • ... Richard Biener via Gcc-patches
                • ... Alexander Monakov via Gcc-patches
                • ... Richard Biener via Gcc-patches
                • ... Alexander Monakov via Gcc-patches
                • ... Richard Biener via Gcc-patches

Reply via email to