Loop iv debugging patch

Michael Hayes mhayes@redhat.com
Wed Jan 10 17:13:00 GMT 2001


This patch adds some debugging routines to the loop optimiser
to dump an iv class or all the iv classes for a loop.

2001-01-11  Michael Hayes  <mhayes@redhat.com>

	* loop.h (total_biv_increment): Constify iv_class pointer.
	(struct induction): Replace `mem_mode' with `mem' rtx.
	* unroll.c (total_biv_increment): Constify iv_class pointer.
	* loop.c (loop_giv_reduce_benefit): Derive mem mode from mem rtx.
	(find_mem_givs, combine_givs_p): Likewise.
	(debug_ivs, debug_iv_class, loop_ivs_dump, loop_iv_class_dump): New.
	
Index: loop.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/loop.c,v
retrieving revision 1.319
diff -c -3 -p -r1.319 loop.c
*** loop.c	2001/01/07 10:38:29	1.319
--- loop.c	2001/01/11 01:04:59
*************** static void record_biv PARAMS ((struct l
*** 199,204 ****
--- 199,206 ----
  				int, int));
  static void check_final_value PARAMS ((const struct loop *,
  				       struct induction *));
+ static void loop_ivs_dump PARAMS((const struct loop *, FILE *, int));
+ static void loop_iv_class_dump PARAMS((const struct iv_class *, FILE *, int));
  static void loop_biv_dump PARAMS((const struct induction *, FILE *, int));
  static void loop_giv_dump PARAMS((const struct induction *, FILE *, int));
  static void record_giv PARAMS ((const struct loop *, struct induction *,
*************** static rtx loop_insn_emit_before PARAMS(
*** 256,261 ****
--- 258,265 ----
  static rtx loop_insn_sink_or_swim PARAMS((const struct loop *, rtx));
  
  static void loop_dump_aux PARAMS ((const struct loop *, FILE *, int));
+ void debug_ivs PARAMS ((const struct loop *));
+ void debug_iv_class PARAMS ((const struct iv_class *));
  void debug_biv PARAMS ((const struct induction *));
  void debug_giv PARAMS ((const struct induction *));
  void debug_loop PARAMS ((const struct loop *));
*************** loop_giv_reduce_benefit (loop, bl, v, te
*** 4131,4146 ****
        && GET_CODE (v->mult_val) == CONST_INT)
      {
        if (HAVE_POST_INCREMENT
! 	  && INTVAL (v->mult_val) == GET_MODE_SIZE (v->mem_mode))
  	benefit += add_cost * bl->biv_count;
        else if (HAVE_PRE_INCREMENT
! 	       && INTVAL (v->mult_val) == GET_MODE_SIZE (v->mem_mode))
  	benefit += add_cost * bl->biv_count;
        else if (HAVE_POST_DECREMENT
! 	       && -INTVAL (v->mult_val) == GET_MODE_SIZE (v->mem_mode))
  	benefit += add_cost * bl->biv_count;
        else if (HAVE_PRE_DECREMENT
! 	       && -INTVAL (v->mult_val) == GET_MODE_SIZE (v->mem_mode))
  	benefit += add_cost * bl->biv_count;
      }
  #endif
--- 4135,4150 ----
        && GET_CODE (v->mult_val) == CONST_INT)
      {
        if (HAVE_POST_INCREMENT
! 	  && INTVAL (v->mult_val) == GET_MODE_SIZE (GET_MODE (v->mem)))
  	benefit += add_cost * bl->biv_count;
        else if (HAVE_PRE_INCREMENT
! 	       && INTVAL (v->mult_val) == GET_MODE_SIZE (GET_MODE (v->mem)))
  	benefit += add_cost * bl->biv_count;
        else if (HAVE_POST_DECREMENT
! 	       && -INTVAL (v->mult_val) == GET_MODE_SIZE (GET_MODE (v->mem)))
  	benefit += add_cost * bl->biv_count;
        else if (HAVE_PRE_DECREMENT
! 	       && -INTVAL (v->mult_val) == GET_MODE_SIZE (GET_MODE (v->mem)))
  	benefit += add_cost * bl->biv_count;
      }
  #endif
*************** find_mem_givs (loop, x, insn, not_every_
*** 4718,4724 ****
  			add_val, ext_val, benefit, DEST_ADDR,
  			not_every_iteration, maybe_multiple, &XEXP (x, 0));
  
! 	    v->mem_mode = GET_MODE (x);
  	  }
        }
        return;
--- 4722,4728 ----
  			add_val, ext_val, benefit, DEST_ADDR,
  			not_every_iteration, maybe_multiple, &XEXP (x, 0));
  
! 	    v->mem = x;
  	  }
        }
        return;
*************** combine_givs_p (g1, g2)
*** 6446,6452 ****
       the expression of G2 in terms of G1 can be used.  */
    if (ret != NULL_RTX
        && g2->giv_type == DEST_ADDR
!       && memory_address_p (g2->mem_mode, ret)
        /* ??? Looses, especially with -fforce-addr, where *g2->location
  	 will always be a register, and so anything more complicated
  	 gets discarded.  */
--- 6450,6456 ----
       the expression of G2 in terms of G1 can be used.  */
    if (ret != NULL_RTX
        && g2->giv_type == DEST_ADDR
!       && memory_address_p (GET_MODE (g2->mem), ret)
        /* ??? Looses, especially with -fforce-addr, where *g2->location
  	 will always be a register, and so anything more complicated
  	 gets discarded.  */
*************** loop_insn_sink_or_swim (loop, pattern)
*** 9507,9512 ****
--- 9511,9606 ----
  }
  
  static void
+ loop_ivs_dump (loop, file, verbose)
+      const struct loop *loop;
+      FILE *file;
+      int verbose;
+ {
+   struct iv_class *bl;
+   int iv_num = 0;
+ 
+   if (! loop || ! file)
+     return;
+ 
+   for (bl = LOOP_IVS (loop)->list; bl; bl = bl->next)
+     iv_num++;
+ 
+   fprintf (file, "Loop %d: %d IV classes\n", loop->num, iv_num);
+ 
+   for (bl = LOOP_IVS (loop)->list; bl; bl = bl->next)
+     {
+       loop_iv_class_dump (bl, file, verbose);
+       fputc ('\n', file);
+     }
+ }
+ 
+ 
+ static void
+ loop_iv_class_dump (bl, file, verbose)
+      const struct iv_class *bl;
+      FILE *file;
+      int verbose ATTRIBUTE_UNUSED;
+ {
+   struct induction *v;
+   rtx incr;
+   int i;
+ 
+   if (! bl || ! file)
+     return;
+ 
+   fprintf (file, "IV class for reg %d, benefit %d\n",
+ 	   bl->regno, bl->total_benefit);
+ 
+   fprintf (file, " Init insn %d", INSN_UID (bl->init_insn));
+   if (bl->initial_value)
+     {
+       fprintf (file, ", init val: ");
+       print_simple_rtl (file, bl->initial_value);
+     }
+   if (bl->initial_test)
+     {
+       fprintf (file, ", init test: ");
+       print_simple_rtl (file, bl->initial_test);
+     }
+   fputc ('\n', file);
+ 
+   if (bl->final_value)
+     {
+       fprintf (file, " Final val: ");
+       print_simple_rtl (file, bl->final_value);
+       fputc ('\n', file);
+     }
+ 
+   if ((incr = biv_total_increment (bl)))
+     {
+       fprintf (file, " Total increment: ");
+       print_simple_rtl (file, incr);
+       fputc ('\n', file);
+     }
+ 
+   /* List the increments.  */
+   for (i = 0, v = bl->biv; v; v = v->next_iv, i++)
+     {
+       fprintf (file, " Inc%d: insn %d, incr: ", i, INSN_UID (v->insn));
+       print_simple_rtl (file, v->add_val);
+       fputc ('\n', file);
+     }
+ 
+   /* List the givs.  */
+   for (i = 0, v = bl->giv; v; v = v->next_iv, i++)
+     {
+       fprintf (file, " Giv%d: insn %d, benefit %d, ", 
+ 	       i, INSN_UID (v->insn), v->benefit);
+       if (v->giv_type == DEST_ADDR)
+ 	  print_simple_rtl (file, v->mem);
+       else
+ 	  print_simple_rtl (file, single_set (v->insn));
+       fputc ('\n', file);
+     }
+ }
+ 
+ 
+ static void
  loop_biv_dump (v, file, verbose)
       const struct induction *v;
       FILE *file;
*************** loop_giv_dump (v, file, verbose)
*** 9593,9598 ****
--- 9687,9708 ----
      }
  
    fputc ('\n', file);  
+ }
+ 
+ 
+ void
+ debug_ivs (loop)
+      const struct loop *loop;
+ {
+   loop_ivs_dump (loop, stderr, 1);
+ }
+ 
+ 
+ void
+ debug_iv_class (bl)
+      const struct iv_class *bl;
+ {
+   loop_iv_class_dump (bl, stderr, 1);
  }
  
  
Index: loop.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/loop.h,v
retrieving revision 1.48
diff -c -3 -p -r1.48 loop.h
*** loop.h	2001/01/07 10:38:29	1.48
--- loop.h	2001/01/11 01:05:00
*************** struct induction
*** 87,93 ****
  				/* For a biv, this is the place where add_val
  				   was found.  */
    enum machine_mode mode;	/* The mode of this biv or giv */
!   enum machine_mode mem_mode;	/* For DEST_ADDR, mode of the memory object.  */
    rtx mult_val;			/* Multiplicative factor for src_reg.  */
    rtx add_val;			/* Additive constant for that product.  */
    int benefit;			/* Gain from eliminating this insn.  */
--- 87,93 ----
  				/* For a biv, this is the place where add_val
  				   was found.  */
    enum machine_mode mode;	/* The mode of this biv or giv */
!   rtx mem;			/* For DEST_ADDR, the memory object.  */
    rtx mult_val;			/* Multiplicative factor for src_reg.  */
    rtx add_val;			/* Additive constant for that product.  */
    int benefit;			/* Gain from eliminating this insn.  */
*************** rtx express_from PARAMS ((struct inducti
*** 398,404 ****
  rtx extend_value_for_giv PARAMS ((struct induction *, rtx));
  
  void unroll_loop PARAMS ((struct loop *, int, int));
! rtx biv_total_increment PARAMS ((struct iv_class *));
  unsigned HOST_WIDE_INT loop_iterations PARAMS ((struct loop *));
  int precondition_loop_p PARAMS ((const struct loop *,
  				 rtx *, rtx *, rtx *,
--- 398,404 ----
  rtx extend_value_for_giv PARAMS ((struct induction *, rtx));
  
  void unroll_loop PARAMS ((struct loop *, int, int));
! rtx biv_total_increment PARAMS ((const struct iv_class *));
  unsigned HOST_WIDE_INT loop_iterations PARAMS ((struct loop *));
  int precondition_loop_p PARAMS ((const struct loop *,
  				 rtx *, rtx *, rtx *,
*************** rtx loop_insn_hoist PARAMS((const struct
*** 416,418 ****
--- 416,419 ----
  
  /* Forward declarations for non-static functions declared in doloop.c.  */
  int doloop_optimize PARAMS ((const struct loop *));
+ rtx doloop_condition_get PARAMS ((rtx));
Index: unroll.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/unroll.c,v
retrieving revision 1.121
diff -c -3 -p -r1.121 unroll.c
*** unroll.c	2001/01/07 10:38:29	1.121
--- unroll.c	2001/01/11 01:05:11
*************** fold_rtx_mult_add (mult1, mult2, add1, m
*** 2377,2383 ****
  
  rtx
  biv_total_increment (bl)
!      struct iv_class *bl;
  {
    struct induction *v;
    rtx result;
--- 2377,2383 ----
  
  rtx
  biv_total_increment (bl)
!      const struct iv_class *bl;
  {
    struct induction *v;
    rtx result;


More information about the Gcc-patches mailing list