On Tue, Nov 27, 2012 at 1:00 PM, Steven Bosscher wrote:
> Now that USE of r719 is a use of a dead register, rendering the
> REG_EQUAL invalid. From there on the problem is the same as the ones I
> had to "fix" in loop-unroll.c. First the webizer puts the USE in a
> different web and renames the USE to r1591:
>
> 2889 r719:DI=r1562:DI
> REG_EQUAL: r1591:DI+0x4
With this patch, the self-referencing EQ_USE is kept together with its DEF:
2889 r719:DI=r1562:DI
REG_EQUAL: r719:DI+0x4
Dominique, could you give this a try and see if it helps?
(But as I said up-thread: I'm not sure this is a proper fix, or just
another band-aid...)
Ciao!
Steven
* web.c (union_eq_uses): New function to keep self-referencing
notes intact.
(web_main): Call it.
Index: web.c
===================================================================
--- web.c (revision 193394)
+++ web.c (working copy)
@@ -148,6 +148,35 @@ union_match_dups (rtx insn, struct web_e
}
}
+/* If INSN has a REG_EQUAL note that references a DEF of INSN, union
+ them. FUN is the function that does the union. */
+
+static void
+union_eq_uses (rtx insn, struct web_entry *def_entry,
+ struct web_entry *use_entry,
+ bool (*fun) (struct web_entry *, struct web_entry *))
+{
+ struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
+ df_ref *def_link = DF_INSN_INFO_DEFS (insn_info);
+ df_ref *eq_use_link = DF_INSN_INFO_EQ_USES (insn_info);
+
+ if (! (def_link && eq_use_link))
+ return;
+
+ while (*eq_use_link)
+ {
+ df_ref *def_rec = def_link;
+ while (*def_rec)
+ {
+ if (DF_REF_REAL_REG (*eq_use_link) == DF_REF_REAL_REG (*def_rec))
+ (*fun) (use_entry + DF_REF_ID (*eq_use_link),
+ def_entry + DF_REF_ID (*def_rec));
+ def_rec++;
+ }
+ eq_use_link++;
+ }
+}
+
/* For each use, all possible defs reaching it must come in the same
register, union them.
FUN is the function that does the union.
@@ -390,6 +419,7 @@ web_main (void)
if (DF_REF_REGNO (use) >= FIRST_PSEUDO_REGISTER)
union_defs (use, def_entry, used, use_entry, unionfind_union);
}
+ union_eq_uses (insn, def_entry, use_entry, unionfind_union);
}
}