2013-05-22 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 May 2013 11:16:32 +0000 (11:16 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 22 May 2013 11:16:32 +0000 (11:16 +0000)
PR middle-end/57349
* profile.c (branch_prob): Do not split blocks that are
abnormally receiving from ECF_RETURNS_TWICE functions.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@199193 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/profile.c

index 16cd2d9..ffb3c67 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-22  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/57349
+       * profile.c (branch_prob): Do not split blocks that are
+       abnormally receiving from ECF_RETURNS_TWICE functions.
+
 2013-05-22  Richard Sandiford  <rsandifo@linux.vnet.ibm.com>
 
        * recog.c (offsettable_address_addr_space_p): Fix calculation of
index 6f05581..b833398 100644 (file)
@@ -1085,18 +1085,20 @@ branch_prob (void)
                 or __builtin_setjmp_dispatcher calls.  These are very
                 special and don't expect anything to be inserted before
                 them.  */
-             if (!is_gimple_call (first)
-                 || (fndecl = gimple_call_fndecl (first)) == NULL
-                 || DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL
-                 || (DECL_FUNCTION_CODE (fndecl) != BUILT_IN_SETJMP_RECEIVER
-                     && (DECL_FUNCTION_CODE (fndecl)
-                         != BUILT_IN_SETJMP_DISPATCHER)))
-               {
-                 if (dump_file)
-                   fprintf (dump_file, "Splitting bb %i after labels\n",
-                            bb->index);
-                 split_block_after_labels (bb);
-               }
+             if (is_gimple_call (first)
+                 && (((fndecl = gimple_call_fndecl (first)) != NULL
+                      && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
+                      && (DECL_FUNCTION_CODE (fndecl)
+                          == BUILT_IN_SETJMP_RECEIVER
+                          || (DECL_FUNCTION_CODE (fndecl)
+                              == BUILT_IN_SETJMP_DISPATCHER)))
+                     || gimple_call_flags (first) & ECF_RETURNS_TWICE))
+               continue;
+
+             if (dump_file)
+               fprintf (dump_file, "Splitting bb %i after labels\n",
+                        bb->index);
+             split_block_after_labels (bb);
            }
        }
     }