On 11/06/2015 03:48 AM, Bernd Schmidt wrote:
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?
Essentially we're keeping the validate_change that Sandra & Chung added on the real insns to address the problem on the nios2 port. The patch just drops the DEBUG_INSN changes from the change group.

For the DEBUG_INSNS in the chain, we update those independently after we apply the change group.

I think the change is fine for the trunk, though I'm still curious about how the code as-is resulted in a comparison failure.

jeff


Reply via email to