This is the mail archive of the gcc-patches@gcc.gnu.org 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] add recognizing to cse_change_cc_mode


Hi,

I've fixed the issue pointed out by Paolo in:
http://gcc.gnu.org/ml/gcc-patches/2004-11/msg00806.html

Because I called apply_change_group within a gcc_assert it would
disappear when compiled without debug enabled.

cc1 built with the change.

OK?

-Andreas-

2004-11-10  Andreas Krebbel  <krebbel1@de.ibm.com>

	* gcc/cse.c (struct change_cc_mode_args): New structure.
	(cse_change_cc_mode_insn): New function.
	(cse_change_cc_mode): Use validate_change to perfom changes.
	(cse_change_cc_mode_insns, cse_condition_code_reg): 
	Call cse_change_cc_mode_insn.

Index: gcc/cse.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cse.c,v
retrieving revision 1.320
diff -p -c -r1.320 cse.c
*** gcc/cse.c	2 Nov 2004 17:59:41 -0000	1.320
--- gcc/cse.c	10 Nov 2004 12:07:39 -0000
*************** struct qty_table_elem
*** 263,268 ****
--- 263,276 ----
  /* The table of all qtys, indexed by qty number.  */
  static struct qty_table_elem *qty_table;
  
+ /* Structure used to pass arguments via for_each_rtx to function
+    cse_change_cc_mode.  */
+ struct change_cc_mode_args
+ {
+   rtx insn;
+   rtx newreg;
+ };
+ 
  #ifdef HAVE_cc0
  /* For machines that have a CC0, we do not record its value in the hash
     table since its use is guaranteed to be the insn immediately following
*************** static bool insn_live_p (rtx, int *);
*** 655,660 ****
--- 663,669 ----
  static bool set_live_p (rtx, rtx, int *);
  static bool dead_libcall_p (rtx, int *);
  static int cse_change_cc_mode (rtx *, void *);
+ static void cse_change_cc_mode_insn (rtx, rtx);
  static void cse_change_cc_mode_insns (rtx, rtx, rtx);
  static enum machine_mode cse_cc_succs (basic_block, rtx, rtx, bool);
  
*************** delete_trivially_dead_insns (rtx insns, 
*** 7315,7334 ****
  static int
  cse_change_cc_mode (rtx *loc, void *data)
  {
!   rtx newreg = (rtx) data;
  
    if (*loc
        && REG_P (*loc)
!       && REGNO (*loc) == REGNO (newreg)
!       && GET_MODE (*loc) != GET_MODE (newreg))
      {
!       *loc = newreg;
        return -1;
      }
    return 0;
  }
  
  /* Change the mode of any reference to the register REGNO (NEWREG) to
     GET_MODE (NEWREG), starting at START.  Stop before END.  Stop at
     any instruction which modifies NEWREG.  */
  
--- 7324,7370 ----
  static int
  cse_change_cc_mode (rtx *loc, void *data)
  {
!   struct change_cc_mode_args* args = (struct change_cc_mode_args*)data;
  
    if (*loc
        && REG_P (*loc)
!       && REGNO (*loc) == REGNO (args->newreg)
!       && GET_MODE (*loc) != GET_MODE (args->newreg))
      {
!       validate_change (args->insn, loc, args->newreg, 1);
!       
        return -1;
      }
    return 0;
  }
  
  /* Change the mode of any reference to the register REGNO (NEWREG) to
+    GET_MODE (NEWREG) in INSN.  */
+ 
+ static void
+ cse_change_cc_mode_insn (rtx insn, rtx newreg)
+ {
+   struct change_cc_mode_args args;
+   int success;
+ 
+   if (!INSN_P (insn))
+     return;
+ 
+   args.insn = insn;
+   args.newreg = newreg;
+   
+   for_each_rtx (&PATTERN (insn), cse_change_cc_mode, &args);
+   for_each_rtx (&REG_NOTES (insn), cse_change_cc_mode, &args);
+   
+   /* If the following assertion was triggered, there is most probably
+      something wrong with the cc_modes_compatible back end function.
+      CC modes only can be considered compatible if the insn - with the mode
+      replaced by any of the compatible modes - can still be recognized.  */
+   success = apply_change_group ();
+   gcc_assert (success);
+ }
+ 
+ /* Change the mode of any reference to the register REGNO (NEWREG) to
     GET_MODE (NEWREG), starting at START.  Stop before END.  Stop at
     any instruction which modifies NEWREG.  */
  
*************** cse_change_cc_mode_insns (rtx start, rtx
*** 7345,7352 ****
        if (reg_set_p (newreg, insn))
  	return;
  
!       for_each_rtx (&PATTERN (insn), cse_change_cc_mode, newreg);
!       for_each_rtx (&REG_NOTES (insn), cse_change_cc_mode, newreg);
      }
  }
  
--- 7381,7387 ----
        if (reg_set_p (newreg, insn))
  	return;
  
!       cse_change_cc_mode_insn (insn, newreg);
      }
  }
  
*************** cse_cc_succs (basic_block bb, rtx cc_reg
*** 7455,7460 ****
--- 7490,7497 ----
  			{
  			  gcc_assert (can_change_mode);
  			  mode = comp_mode;
+ 
+ 			  /* The modified insn will be re-recognized later.  */
  			  PUT_MODE (cc_src, mode);
  			}
  		    }
*************** cse_condition_code_reg (void)
*** 7634,7645 ****
  	    {
  	      rtx newreg = gen_rtx_REG (mode, REGNO (cc_reg));
  
! 	      /* Change the mode of CC_REG in CC_SRC_INSN to
! 		 GET_MODE (NEWREG).  */
! 	      for_each_rtx (&PATTERN (cc_src_insn), cse_change_cc_mode,
! 			    newreg);
! 	      for_each_rtx (&REG_NOTES (cc_src_insn), cse_change_cc_mode,
! 			    newreg);
  
  	      /* Do the same in the following insns that use the
  		 current value of CC_REG within BB.  */
--- 7671,7677 ----
  	    {
  	      rtx newreg = gen_rtx_REG (mode, REGNO (cc_reg));
  
! 	      cse_change_cc_mode_insn (cc_src_insn, newreg);
  
  	      /* Do the same in the following insns that use the
  		 current value of CC_REG within BB.  */


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