On 06/17/2015 07:11 PM, Sandra Loosemore wrote:

Index: gcc/regrename.c
===================================================================
--- gcc/regrename.c     (revision 224532)
+++ gcc/regrename.c     (working copy)
@@ -942,19 +942,22 @@ regrename_do_replace (struct du_head *he
        int reg_ptr = REG_POINTER (*chain->loc);

        if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
-       INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC ();
+       validate_change (chain->insn, &(INSN_VAR_LOCATION_LOC (chain->insn)),
+                        gen_rtx_UNKNOWN_VAR_LOC (), true);
        else
        {
-         *chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg);
+         validate_change (chain->insn, chain->loc,
+                          gen_raw_REG (GET_MODE (*chain->loc), reg), true);
          if (regno >= FIRST_PSEUDO_REGISTER)
            ORIGINAL_REGNO (*chain->loc) = regno;
          REG_ATTRS (*chain->loc) = attr;

With a patch I'm working on that uses the renamer more often, I found that this is causing compare-debug failures. Validating changes to debug_insns (the INSN_VAR_LOCATION_LOC in particular) can apparently fail.

The following fix was bootstrapped and tested with -frename-registers enabled at -O1 on x86_64-linux. Ok?


Bernd

	* regrename.c (regrename_do_replace): Do not validate changes to
	debug insns.

Index: gcc/regrename.c
===================================================================
--- gcc/regrename.c	(revision 229049)
+++ gcc/regrename.c	(working copy)
@@ -946,10 +951,7 @@ regrename_do_replace (struct du_head *he
       struct reg_attrs *attr = REG_ATTRS (*chain->loc);
       int reg_ptr = REG_POINTER (*chain->loc);
 
-      if (DEBUG_INSN_P (chain->insn) && REGNO (*chain->loc) != base_regno)
-	validate_change (chain->insn, &(INSN_VAR_LOCATION_LOC (chain->insn)),
-			 gen_rtx_UNKNOWN_VAR_LOC (), true);
-      else
+      if (!DEBUG_INSN_P (chain->insn))
 	{
 	  validate_change (chain->insn, chain->loc, 
 			   gen_raw_REG (GET_MODE (*chain->loc), reg), true);
@@ -963,6 +965,16 @@ regrename_do_replace (struct du_head *he
   if (!apply_change_group ())
     return false;
 
+  for (chain = head->first; chain; chain = chain->next_use)
+    if (DEBUG_INSN_P (chain->insn))
+      {
+	if (REGNO (*chain->loc) != base_regno)
+	  INSN_VAR_LOCATION_LOC (chain->insn) = gen_rtx_UNKNOWN_VAR_LOC ();
+	else
+	  *chain->loc = gen_raw_REG (GET_MODE (*chain->loc), reg);
+	df_insn_rescan (chain->insn);
+      }
+
   mode = GET_MODE (*head->first->loc);
   head->regno = reg;
   head->nregs = hard_regno_nregs[reg][mode];

Reply via email to