Patchwork fixed two issues in handling debug_insn.

login
register
mail settings
Submitter Bingfeng Mei
Date July 16, 2010, 12:15 p.m.
Message ID <7FB04A5C213E9943A72EE127DB74F0ADA6897ACFF2@SJEXCHCCR02.corp.ad.broadcom.com>
Download mbox | patch
Permalink /patch/59094/
State New
Headers show

Comments

Bingfeng Mei - July 16, 2010, 12:15 p.m.
Hello,

I fixed two issues in handling debug_insn. The first is in ddg.c. 
Number of nodes should exclude those of debug_insns to determine
whether a loop is a empty one. 

The second is in loop-doloop.c. The original code checks validity
of the previous instruction, but will fail if the previous instruction(s)
is debug_insn. 

Both issues were found on our private port with our modulo scheduler.
I didn't try to reproduce for other targets since they are obvious.
I tested the patch on x86_64, which passed tests and is bootstrapped. 

OK for trunk? (maybe 4.5 too?)

Cheers,
Bingfeng


2010-07-16  Bingfeng Mei  <bmei@broadcom.com>
	* ddg.c (create_ddg): Exclude nodes of debug_insn in counting nodes
        of a loop.
        * loop-doloop.c (doloop_condition_get): Skip possible debug_insn.
Jakub Jelinek - July 16, 2010, 12:24 p.m.
On Fri, Jul 16, 2010 at 05:15:21AM -0700, Bingfeng Mei wrote:

> --- loop-doloop.c       (revision 162258)
> +++ loop-doloop.c       (working copy)
> @@ -104,11 +104,15 @@
>    if (GET_CODE (pattern) != PARALLEL)
>      {
>        rtx cond;
> +      rtx prev_insn = PREV_INSN (doloop_pat);
> 
> -      /* We expect the decrement to immediately precede the branch.  */
> +      /* We expect the decrement to immediately precede the branch.
> +         Need to skip possible debug_insn */
> +      while (prev_insn != NULL_RTX && DEBUG_INSN_P (prev_insn))
> +        prev_insn = PREV_INSN (prev_insn);
> 
> -      if ((PREV_INSN (doloop_pat) == NULL_RTX)
> -          || !INSN_P (PREV_INSN (doloop_pat)))
> +      if ((prev_insn == NULL_RTX)
> +          || !INSN_P (prev_insn))
>          return 0;
> 
>        cmp = pattern;

Why don't you just do
      rtx prev_insn = prev_nondebug_insn (doloop_pat);

      if (prev_insn == NULL_RTX || !INSN_P (prev_insn))
	return 0;

?

	Jakub

Patch

Index: ddg.c
===================================================================
--- ddg.c       (revision 162258)
+++ ddg.c       (working copy)
@@ -488,7 +488,7 @@ 
     }

   /* There is nothing to do for this BB.  */
-  if (num_nodes <= 1)
+  if ((num_nodes - g->num_debug) <= 1)
     {
       free (g);
       return NULL;
Index: loop-doloop.c
===================================================================
--- loop-doloop.c       (revision 162258)
+++ loop-doloop.c       (working copy)
@@ -104,11 +104,15 @@ 
   if (GET_CODE (pattern) != PARALLEL)
     {
       rtx cond;
+      rtx prev_insn = PREV_INSN (doloop_pat);

-      /* We expect the decrement to immediately precede the branch.  */
+      /* We expect the decrement to immediately precede the branch.
+         Need to skip possible debug_insn */
+      while (prev_insn != NULL_RTX && DEBUG_INSN_P (prev_insn))
+        prev_insn = PREV_INSN (prev_insn);

-      if ((PREV_INSN (doloop_pat) == NULL_RTX)
-          || !INSN_P (PREV_INSN (doloop_pat)))
+      if ((prev_insn == NULL_RTX)
+          || !INSN_P (prev_insn))
         return 0;

       cmp = pattern;