https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81275

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
To get rid of the warning just with -fsanitize=threads we could do:
--- gcc/tree-eh.c.jj    2017-07-14 13:04:47.000000000 +0200
+++ gcc/tree-eh.c       2017-07-25 17:09:58.279461377 +0200
@@ -1598,7 +1598,8 @@ decide_copy_try_finally (int ndests, boo
          gimple *stmt = gsi_stmt (gsi);
          if (!is_gimple_debug (stmt)
              && !gimple_clobber_p (stmt)
-             && !gimple_call_builtin_p (stmt, BUILT_IN_STACK_RESTORE))
+             && !gimple_call_builtin_p (stmt, BUILT_IN_STACK_RESTORE)
+             && !gimple_call_internal_p (stmt, IFN_TSAN_FUNC_EXIT))
            return false;
        }
       return true;

at the expense of (-O0) having more __tsan_func_exit calls but on the other
side perhaps simpler code.
But that doesn't solve the #c2 testcase where we'd warn anyway.
The problem is that for:
          switch (a) <default: <D.2312>, case 0: <D.2310>>
          <D.2310>:
          switch (b) <default: <D.2311>>
          <D.2311>:
          D.2315 = 0;
          return D.2315;
          goto <D.2313>;
          <D.2312>:
          D.2315 = 0;
          return D.2315;
          <D.2313>:
this ends with a label and thus gimple_seq_may_fallthru returns true, even when
the only goto to that label is dead.  I guess we need to improve switch
expansion for these pathological cases.

Reply via email to