diff mbox

Fix regrename compare-debug issue

Message ID 572A136A.1060100@redhat.com
State New
Headers show

Commit Message

Bernd Schmidt May 4, 2016, 3:21 p.m. UTC
When scanning addresses inside a debug insn, we shouldn't use normal 
base/index classes. This shows as a compare-debug issue on Alpha, where 
INDEX_REG_CLASS is NO_REGS, and this prevented a chain from being 
renamed with debugging turned on.

Uros has reported that this patch resolves the issues he was seeing on 
Alpha, and I've bootstrapped and tested it on x86_64-linux. Ok?


Bernd

Comments

Eric Botcazou May 5, 2016, 7:02 a.m. UTC | #1
> When scanning addresses inside a debug insn, we shouldn't use normal
> base/index classes. This shows as a compare-debug issue on Alpha, where
> INDEX_REG_CLASS is NO_REGS, and this prevented a chain from being
> renamed with debugging turned on.
> 
> Uros has reported that this patch resolves the issues he was seeing on
> Alpha, and I've bootstrapped and tested it on x86_64-linux. Ok?

OK, thanks.  It might worthwhile to add a sentence somewhere (maybe at the end 
of the head comment of the file) documenting the special treatment applied to 
debug insns during the pass.
Bernd Schmidt May 9, 2016, 9:44 a.m. UTC | #2
On 05/05/2016 09:02 AM, Eric Botcazou wrote:
>> When scanning addresses inside a debug insn, we shouldn't use normal
>> base/index classes. This shows as a compare-debug issue on Alpha, where
>> INDEX_REG_CLASS is NO_REGS, and this prevented a chain from being
>> renamed with debugging turned on.
>>
>> Uros has reported that this patch resolves the issues he was seeing on
>> Alpha, and I've bootstrapped and tested it on x86_64-linux. Ok?
>
> OK, thanks.  It might worthwhile to add a sentence somewhere (maybe at the end
> of the head comment of the file) documenting the special treatment applied to
> debug insns during the pass.

Committed with the extra hunk below.


Bernd

@@ -61,7 +61,10 @@
       5. If a renaming register has been found, it is substituted in 
the chain.

    Targets can parameterize the pass by specifying a preferred class 
for the
-  renaming register for a given (super)class of registers to be 
renamed.  */
+  renaming register for a given (super)class of registers to be renamed.
+
+  DEBUG_INSNs are treated specially, in particular registers occurring 
inside
+  them are treated as requiring ALL_REGS as a class.  */

  #if HOST_BITS_PER_WIDE_INT <= MAX_RECOG_OPERANDS
  #error "Use a different bitmap implementation for untracked_operands."
diff mbox

Patch

	* regrename.c (base_reg_class_for_rename): New static function.
	(scan_rtx_address, scan_rtx): Use it instead of base_reg_class.

Index: gcc/regrename.c
===================================================================
--- gcc/regrename.c	(revision 235808)
+++ gcc/regrename.c	(working copy)
@@ -1238,6 +1238,19 @@  scan_rtx_reg (rtx_insn *insn, rtx *loc,
     }
 }
 
+/* A wrapper around base_reg_class which returns ALL_REGS if INSN is a
+   DEBUG_INSN.  The arguments MODE, AS, CODE and INDEX_CODE are as for
+   base_reg_class.  */
+
+static reg_class
+base_reg_class_for_rename (rtx_insn *insn, machine_mode mode, addr_space_t as,
+			   rtx_code code, rtx_code index_code)
+{
+  if (DEBUG_INSN_P (insn))
+    return ALL_REGS;
+  return base_reg_class (mode, as, code, index_code);
+}
+
 /* Adapted from find_reloads_address_1.  CL is INDEX_REG_CLASS or
    BASE_REG_CLASS depending on how the register is being considered.  */
 
@@ -1343,12 +1356,16 @@  scan_rtx_address (rtx_insn *insn, rtx *l
 	  }
 
 	if (locI)
-	  scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode, as);
+	  {
+	    reg_class iclass = DEBUG_INSN_P (insn) ? ALL_REGS : INDEX_REG_CLASS;
+	    scan_rtx_address (insn, locI, iclass, action, mode, as);
+	  }
 	if (locB)
-	  scan_rtx_address (insn, locB,
-			    base_reg_class (mode, as, PLUS, index_code),
-			    action, mode, as);
-
+	  {
+	    reg_class bclass = base_reg_class_for_rename (insn, mode, as, PLUS,
+							  index_code);
+	    scan_rtx_address (insn, locB, bclass, action, mode, as);
+	  }
 	return;
       }
 
@@ -1366,10 +1383,13 @@  scan_rtx_address (rtx_insn *insn, rtx *l
       break;
 
     case MEM:
-      scan_rtx_address (insn, &XEXP (x, 0),
-			base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
-					MEM, SCRATCH),
-			action, GET_MODE (x), MEM_ADDR_SPACE (x));
+      {
+	reg_class bclass = base_reg_class_for_rename (insn, GET_MODE (x),
+						      MEM_ADDR_SPACE (x),
+						      MEM, SCRATCH);
+	scan_rtx_address (insn, &XEXP (x, 0), bclass, action, GET_MODE (x),
+			  MEM_ADDR_SPACE (x));
+      }
       return;
 
     case REG:
@@ -1416,10 +1436,14 @@  scan_rtx (rtx_insn *insn, rtx *loc, enum
       return;
 
     case MEM:
-      scan_rtx_address (insn, &XEXP (x, 0),
-			base_reg_class (GET_MODE (x), MEM_ADDR_SPACE (x),
-					MEM, SCRATCH),
-			action, GET_MODE (x), MEM_ADDR_SPACE (x));
+      {
+	reg_class bclass = base_reg_class_for_rename (insn, GET_MODE (x),
+						      MEM_ADDR_SPACE (x),
+						      MEM, SCRATCH);
+
+	scan_rtx_address (insn, &XEXP (x, 0), bclass, action, GET_MODE (x),
+			  MEM_ADDR_SPACE (x));
+      }
       return;
 
     case SET: