public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Fix PR47612
@ 2011-04-12 20:33 Bernd Schmidt
  2011-04-12 23:45 ` Michael Matz
  0 siblings, 1 reply; 4+ messages in thread
From: Bernd Schmidt @ 2011-04-12 20:33 UTC (permalink / raw)
  To: GCC Patches; +Cc: joel

[-- Attachment #1: Type: text/plain, Size: 395 bytes --]

This fixes a problem on cc0 machines where we split a sequence of insns
at a point where we shouldn't - between a cc0 setter and a cc0 user.

The fix is simple enough; just make sure not to pick a cc0 setter as the
end of such a sequence. The patch below was regression tested on
m68k-rtems4.11 by Joel Sherrill; I'll commit it as obvious in a few days
unless someone tells me it isn't.


Bernd

[-- Attachment #2: dfp2.diff --]
[-- Type: text/plain, Size: 939 bytes --]

	* df-problems.c (can_move_insns_across): Don't pick a cc0 setter
	as the last insn of the sequence to be moved.

Index: df-problems.c
===================================================================
--- df-problems.c	(revision 172094)
+++ df-problems.c	(working copy)
@@ -4001,7 +4001,10 @@ can_move_insns_across (rtx from, rtx to,
 	  if (bitmap_intersect_p (merge_set, test_use)
 	      || bitmap_intersect_p (merge_use, test_set))
 	    break;
-	  max_to = insn;
+#ifdef HAVE_cc0
+	  if (!sets_cc0_p (insn))
+#endif
+	    max_to = insn;
 	}
       next = NEXT_INSN (insn);
       if (insn == to)
@@ -4038,7 +4041,11 @@ can_move_insns_across (rtx from, rtx to,
     {
       if (NONDEBUG_INSN_P (insn))
 	{
-	  if (!bitmap_intersect_p (test_set, local_merge_live))
+	  if (!bitmap_intersect_p (test_set, local_merge_live)
+#ifdef HAVE_cc0
+	      && !sets_cc0_p (insn)
+#endif
+	      )
 	    {
 	      max_to = insn;
 	      break;

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Fix PR47612
  2011-04-12 20:33 Fix PR47612 Bernd Schmidt
@ 2011-04-12 23:45 ` Michael Matz
  2011-04-12 23:53   ` Bernd Schmidt
  0 siblings, 1 reply; 4+ messages in thread
From: Michael Matz @ 2011-04-12 23:45 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches, joel

Hi,

On Tue, 12 Apr 2011, Bernd Schmidt wrote:

> This fixes a problem on cc0 machines where we split a sequence of insns
> at a point where we shouldn't - between a cc0 setter and a cc0 user.
> 
> The fix is simple enough; just make sure not to pick a cc0 setter as the
> end of such a sequence. The patch below was regression tested on
> m68k-rtems4.11 by Joel Sherrill; I'll commit it as obvious in a few days
> unless someone tells me it isn't.

I'm a big fan of commentary.  I'm an even larger fan of two-to-three 
sentence commentary for just a single conditional skip.  Even more so if 
it's related to cc0 targets.

And is there any chance to transform this:

+#ifdef HAVE_cc0
+         if (!sets_cc0_p (insn))
+#endif
+           max_to = insn;

into this:

+         if (!sets_cc0_p (insn))
            max_to = insn;

?  Yes, that implies making sets_cc0_p be always there and return false, 
and write the conditionals in the corrent way?

I'll also note that the first hunk of your change is in a loop commented 
with "Compute upper bound, bla ...", meaning to be a heuristic, and your 
second change is this:

-         if (!bitmap_intersect_p (test_set, local_merge_live))
+         if (!bitmap_intersect_p (test_set, local_merge_live)
+#ifdef HAVE_cc0
+             && !sets_cc0_p (insn)
+#endif
+             )

It seems to me, that those insn then shouldn't have been in test_set from 
the start, instead of fiddling with the users of test_set.  Hence, is my 
feeling of the patch being a hack-around of a deeper problem or it being 
the wrong place to hack wrong?


Ciao,
Michael.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Fix PR47612
  2011-04-12 23:45 ` Michael Matz
@ 2011-04-12 23:53   ` Bernd Schmidt
  2011-04-14 12:38     ` Michael Matz
  0 siblings, 1 reply; 4+ messages in thread
From: Bernd Schmidt @ 2011-04-12 23:53 UTC (permalink / raw)
  To: Michael Matz; +Cc: GCC Patches, joel

On 04/13/2011 01:45 AM, Michael Matz wrote:
> And is there any chance to transform this:
> 
> +#ifdef HAVE_cc0
> +         if (!sets_cc0_p (insn))
> +#endif
> +           max_to = insn;
> 
> into this:
> 
> +         if (!sets_cc0_p (insn))
>             max_to = insn;
> 
> ?  Yes, that implies making sets_cc0_p be always there and return false, 
> and write the conditionals in the corrent way?

The correct fix is to eliminate cc0 targets.

> I'll also note that the first hunk of your change is in a loop commented 
> with "Compute upper bound, bla ...", meaning to be a heuristic, and your 
> second change is this:

It's not a heuristic. Both of these loops are necessary to compute a
valid end point. !sets_cc0_p is just an additional condition that must
be satisfied in both of them.

> -         if (!bitmap_intersect_p (test_set, local_merge_live))
> +         if (!bitmap_intersect_p (test_set, local_merge_live)
> +#ifdef HAVE_cc0
> +             && !sets_cc0_p (insn)
> +#endif
> +             )
> 
> It seems to me, that those insn then shouldn't have been in test_set from 
> the start, instead of fiddling with the users of test_set.  Hence, is my 
> feeling of the patch being a hack-around of a deeper problem or it being 
> the wrong place to hack wrong?

I don't understand this sentence.


Bernd

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Fix PR47612
  2011-04-12 23:53   ` Bernd Schmidt
@ 2011-04-14 12:38     ` Michael Matz
  0 siblings, 0 replies; 4+ messages in thread
From: Michael Matz @ 2011-04-14 12:38 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches, joel

Hi,

On Wed, 13 Apr 2011, Bernd Schmidt wrote:

> > I'll also note that the first hunk of your change is in a loop commented 
> > with "Compute upper bound, bla ...", meaning to be a heuristic, and your 
> > second change is this:
> 
> It's not a heuristic. Both of these loops are necessary to compute a
> valid end point. !sets_cc0_p is just an additional condition that must
> be satisfied in both of them.

Yeah, sorry, I haven't read the whole context in that routine, and 
misread some thing, causing ...

> > +#ifdef HAVE_cc0
> > +             && !sets_cc0_p (insn)
> > +#endif
> > +             )
> > 
> > It seems to me, that those insn then shouldn't have been in test_set from 
> > the start, instead of fiddling with the users of test_set.  Hence, is my 
> > feeling of the patch being a hack-around of a deeper problem or it being 
> > the wrong place to hack wrong?
> 
> I don't understand this sentence.

... this.  I shouldn't look at patches when I'm only half-awake.


Ciao,
Michael.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-04-14 12:38 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-12 20:33 Fix PR47612 Bernd Schmidt
2011-04-12 23:45 ` Michael Matz
2011-04-12 23:53   ` Bernd Schmidt
2011-04-14 12:38     ` Michael Matz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).