Patchwork [PR,debug/45656] Don't let BB-trailing debug insns break cc0 cse

login
register
mail settings
Submitter Alexandre Oliva
Date Oct. 7, 2010, 5:43 a.m.
Message ID <or39siy2un.fsf@livre.localdomain>
Download mbox | patch
Permalink /patch/66997/
State New
Headers show

Comments

Alexandre Oliva - Oct. 7, 2010, 5:43 a.m.
On Oct  2, 2010, Eric Botcazou <ebotcazou@adacore.com> wrote:

> In other words, why the "insn == BB_END (bb)" in the first condition?

Thinko, I suppose.  Thanks for catching it.

Here's a corrected patch.  Regstrapped on x86_64-linux-gnu and
i686-pc-linux-gnu, and verified the testcase on cris-elf.  Ok?
Eric Botcazou - Oct. 7, 2010, 1:28 p.m.
> Here's a corrected patch.  Regstrapped on x86_64-linux-gnu and
> i686-pc-linux-gnu, and verified the testcase on cris-elf.  Ok?

OK for mainline (and 4.5 branch if deemed necessary), thanks.
Alexandre Oliva - Oct. 11, 2010, 12:59 p.m.
On Oct  7, 2010, Eric Botcazou <ebotcazou@adacore.com> wrote:

>> Here's a corrected patch.  Regstrapped on x86_64-linux-gnu and
>> i686-pc-linux-gnu, and verified the testcase on cris-elf.  Ok?

> OK for mainline (and 4.5 branch if deemed necessary), thanks.

I noticed it applies to 4.5, which implies it fixes a bug there, so I
regstrapped it and installed it.  Thanks,

Patch

for  gcc/ChangeLog
from  Alexandre Oliva  <aoliva@redhat.com>

	PR debug/45656
	* cse.c (cse_extended_basic_block): Preserve cc0 info across
	debug isnsn.  Skip them when searching for cc0 setter.
	(set_live_p): Skip debug insns when searching for cc0 user.

Index: gcc/cse.c
===================================================================
--- gcc/cse.c.orig	2010-10-05 15:51:55.001627815 -0300
+++ gcc/cse.c	2010-10-06 02:05:47.390551468 -0300
@@ -6348,29 +6348,31 @@  cse_extended_basic_block (struct cse_bas
 		recorded_label_ref = true;
 
 #ifdef HAVE_cc0
-	      /* If the previous insn set CC0 and this insn no longer
-		 references CC0, delete the previous insn.  Here we use
-		 fact that nothing expects CC0 to be valid over an insn,
-		 which is true until the final pass.  */
-	      {
-		rtx prev_insn, tem;
-
-		prev_insn = PREV_INSN (insn);
-		if (prev_insn && NONJUMP_INSN_P (prev_insn)
-		    && (tem = single_set (prev_insn)) != 0
-		    && SET_DEST (tem) == cc0_rtx
-		    && ! reg_mentioned_p (cc0_rtx, PATTERN (insn)))
-		  delete_insn (prev_insn);
-	      }
-
-	      /* If this insn is not the last insn in the basic block,
-		 it will be PREV_INSN(insn) in the next iteration.  If
-		 we recorded any CC0-related information for this insn,
-		 remember it.  */
-	      if (insn != BB_END (bb))
+	      if (NONDEBUG_INSN_P (insn))
 		{
-		  prev_insn_cc0 = this_insn_cc0;
-		  prev_insn_cc0_mode = this_insn_cc0_mode;
+		  /* If the previous insn sets CC0 and this insn no
+		     longer references CC0, delete the previous insn.
+		     Here we use fact that nothing expects CC0 to be
+		     valid over an insn, which is true until the final
+		     pass.  */
+		  rtx prev_insn, tem;
+
+		  prev_insn = prev_nonnote_nondebug_insn (insn);
+		  if (prev_insn && NONJUMP_INSN_P (prev_insn)
+		      && (tem = single_set (prev_insn)) != NULL_RTX
+		      && SET_DEST (tem) == cc0_rtx
+		      && ! reg_mentioned_p (cc0_rtx, PATTERN (insn)))
+		    delete_insn (prev_insn);
+
+		  /* If this insn is not the last insn in the basic
+		     block, it will be PREV_INSN(insn) in the next
+		     iteration.  If we recorded any CC0-related
+		     information for this insn, remember it.  */
+		  if (insn != BB_END (bb))
+		    {
+		      prev_insn_cc0 = this_insn_cc0;
+		      prev_insn_cc0_mode = this_insn_cc0_mode;
+		    }
 		}
 #endif
 	    }
@@ -6713,7 +6715,7 @@  set_live_p (rtx set, rtx insn ATTRIBUTE_
 #ifdef HAVE_cc0
   else if (GET_CODE (SET_DEST (set)) == CC0
 	   && !side_effects_p (SET_SRC (set))
-	   && ((tem = next_nonnote_insn (insn)) == 0
+	   && ((tem = next_nonnote_nondebug_insn (insn)) == NULL_RTX
 	       || !INSN_P (tem)
 	       || !reg_referenced_p (cc0_rtx, PATTERN (tem))))
     return false;