diff mbox

Fix -freorder-blocks-and-partition EH handling (PR middle-end/45566)

Message ID 20110121152414.GI2724@tyan-ft48-01.lab.bos.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Jan. 21, 2011, 3:24 p.m. UTC
Hi!

If with hot/cold section partitioning the first section of a function
contains only nothrowing insns and this_action == -1 insns, but the
second section starts (after optionally some nothrowing) with
a this_action != -1 insn, convert_to_eh_region_ranges ICEs.
The problem is that last_action in that case is -3, therefore the if
(first_no_action_insn_before_switch) isn't then performed and on following
insns last_action_insn is no longer equal to
last_no_action_insn_before_switch.
While looking at resulting assembly I've also noticed that it was
incorrectly generating two sets of .LEHB0/.LEHB1 labels.

Both issues fixed thusly, bootstrapped/regtested on x86_64-linux and
i686-linux, ok for trunk?

2011-01-21  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/45566
	* except.c (convert_to_eh_region_ranges): Emit queued no-region
	notes from other section in hot/cold partitioning even if
	last_action is -3.  Increment call_site_base.

	* g++.dg/tree-prof/partition3.C: New test.


	Jakub

Comments

Richard Henderson Jan. 21, 2011, 6:46 p.m. UTC | #1
On 01/21/2011 07:24 AM, Jakub Jelinek wrote:
> 	PR middle-end/45566
> 	* except.c (convert_to_eh_region_ranges): Emit queued no-region
> 	notes from other section in hot/cold partitioning even if
> 	last_action is -3.  Increment call_site_base.
> 
> 	* g++.dg/tree-prof/partition3.C: New test.

Ok.


r~
diff mbox

Patch

--- gcc/except.c.jj	2011-01-18 12:20:18.000000000 +0100
+++ gcc/except.c	2011-01-21 13:11:07.000000000 +0100
@@ -2421,30 +2421,33 @@  convert_to_eh_region_ranges (void)
 	if (last_action != this_action
 	    || last_landing_pad != this_landing_pad)
 	  {
+	    /* If there is a queued no-action region in the other section
+	       with hot/cold partitioning, emit it now.  */
+	    if (first_no_action_insn_before_switch)
+	      {
+		gcc_assert (this_action != -1
+			    && last_action == (first_no_action_insn
+					       ? -1 : -3));
+		call_site = add_call_site (NULL_RTX, 0, 0);
+		note = emit_note_before (NOTE_INSN_EH_REGION_BEG,
+					 first_no_action_insn_before_switch);
+		NOTE_EH_HANDLER (note) = call_site;
+		note = emit_note_after (NOTE_INSN_EH_REGION_END,
+					last_no_action_insn_before_switch);
+		NOTE_EH_HANDLER (note) = call_site;
+		gcc_assert (last_action != -3
+			    || (last_action_insn
+				== last_no_action_insn_before_switch));
+		first_no_action_insn_before_switch = NULL_RTX;
+		last_no_action_insn_before_switch = NULL_RTX;
+		call_site_base++;
+	      }
 	    /* If we'd not seen a previous action (-3) or the previous
 	       action was must-not-throw (-2), then we do not need an
 	       end note.  */
 	    if (last_action >= -1)
 	      {
 		/* If we delayed the creation of the begin, do it now.  */
-		if (first_no_action_insn_before_switch)
-		  {
-		    call_site = add_call_site (NULL_RTX, 0, 0);
-		    note
-		      = emit_note_before (NOTE_INSN_EH_REGION_BEG,
-					  first_no_action_insn_before_switch);
-		    NOTE_EH_HANDLER (note) = call_site;
-		    if (first_no_action_insn)
-		      {
-			note
-			  = emit_note_after (NOTE_INSN_EH_REGION_END,
-					     last_no_action_insn_before_switch);
-			NOTE_EH_HANDLER (note) = call_site;
-		      }
-		    else
-		      gcc_assert (last_action_insn
-				  == last_no_action_insn_before_switch);
-		  }
 		if (first_no_action_insn)
 		  {
 		    call_site = add_call_site (NULL_RTX, 0, cur_sec);
--- gcc/testsuite/g++.dg/tree-prof/partition3.C.jj	2011-01-21 13:17:08.000000000 +0100
+++ gcc/testsuite/g++.dg/tree-prof/partition3.C	2011-01-21 13:16:05.000000000 +0100
@@ -0,0 +1,18 @@ 
+// PR middle-end/45566
+// { dg-require-effective-target freorder }
+// { dg-options "-O -fnon-call-exceptions -freorder-blocks-and-partition" }
+
+int k;
+
+int
+main ()
+{
+  try
+  {
+    if (k)
+      throw 6;
+  }
+  catch (...)
+  {
+  }
+}
--- gcc/testsuite/g++.dg/tree-prof/tree-prof.exp.jj	2009-02-20 15:41:27.000000000 +0100
+++ gcc/testsuite/g++.dg/tree-prof/tree-prof.exp	2011-01-21 13:16:57.000000000 +0100
@@ -16,7 +16,7 @@ 
 # <http://www.gnu.org/licenses/>.
 
 # Test the functionality of programs compiled with profile-directed block
-# ordering using -fprofile-generate followed by -fbranch-use.
+# ordering using -fprofile-generate followed by -fprofile-use.
 
 load_lib target-supports.exp