This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Make CSE path following use the CFG

On 12/12/06, Eric Botcazou <> wrote:
Confirmed, testcase attached, compile p.adb at -O -mtune=pentium.

Yup, got it.

and the latter doesn't trap because of the new REG_EQUAL note.

I didn't even realize that this could happen.

What do you think of the attached patch?

	* cse.c (cse_insn): When adding a REG_EQUAL note to an insn
	that may trap, check if the note makes the insn non-trapping,
	and remove redundante CFG edges if it does.

Index: cse.c
--- cse.c	(revision 119741)
+++ cse.c	(working copy)
@@ -4974,12 +4969,26 @@ cse_insn (rtx insn, rtx libcall_insn)
 	  /* We only want a REG_EQUAL note if src_const != src.  */
 	  if (! rtx_equal_p (src, src_const))
+	      rtx note;
 	      /* Make sure that the rtx is not shared.  */
 	      src_const = copy_rtx (src_const);
 	      /* Record the actual constant value in a REG_EQUAL note,
-		 making a new one if one does not already exist.  */
-	      set_unique_reg_note (insn, REG_EQUAL, src_const);
+		 making a new one if one does not already exist.  This
+		 must always succeed.  */
+	      note = set_unique_reg_note (insn, REG_EQUAL, src_const);
+	      gcc_assert (note);
+	      /* With non-call exceptions, if this was an insn that could
+		 trap, we may have made it non-throwing now.  For example
+		 we may made a float extend non-trapping thanks to a new
+		 REG_EQUAL note.  */
+	      if (flag_non_call_exceptions
+		  && insn == BB_END (BLOCK_FOR_INSN (insn))
+		  && may_trap_p (PATTERN (insn))
+		  && !may_trap_p (XEXP (note, 0)))
+		purge_dead_edges (BLOCK_FOR_INSN (insn));

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]