https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84878
--- Comment #2 from Peter Bergner <bergner at gcc dot gnu.org> ---
So we segv in ddg.c:add_cross_iteration_register_deps() at this code:
/* Create inter-loop true dependences and anti dependences. */
for (r_use = DF_REF_CHAIN (last_def); r_use != NULL; r_use = r_use->next)
{
rtx_insn *use_insn = DF_REF_INSN (r_use->ref);
^^^^ segv's
We currently have:
(gdb) pr def_insn
(insn 331 321 332 12 (parallel [
(set (reg:V4SI 239 [ vect__4.11 ])
(unspec:V4SI [
(reg:V4SF 134 [ vect_cst__39 ])
(const_int 0 [0])
] UNSPEC_VCTSXS))
(set (reg:SI 110 vscr)
(unspec:SI [
(const_int 0 [0])
] UNSPEC_SET_VSCR))
]) "bug.i":9 1812 {altivec_vctsxs}
(expr_list:REG_UNUSED (reg:V4SI 239 [ vect__4.11 ])
(nil)))
(gdb) p DF_REF_REGNO (last_def)
$4 = 110
So we're looking at the definition of the VSCR hard register, which is a global
register (ie, global_regs[110] == 1), but there are no following explicit uses
of the VSCR reg, so:
(gdb) p DF_REF_INSN_INFO(r_use->ref)
$5 = (df_insn_info *) 0x0
When we call DF_REF_INSN(r_use->ref) which deferences
DF_REF_INSN_INFO(r_use->ref), we segv.
The following patch cures the segv:
Index: gcc/ddg.c
===================================================================
--- gcc/ddg.c (revision 258802)
+++ gcc/ddg.c (working copy)
@@ -295,6 +295,11 @@ add_cross_iteration_register_deps (ddg_p
/* Create inter-loop true dependences and anti dependences. */
for (r_use = DF_REF_CHAIN (last_def); r_use != NULL; r_use = r_use->next)
{
+ /* PR84878: Some definitions of global hard registers may not have
+ any following uses or they may be artificial, so skip them. */
+ if (DF_REF_INSN_INFO (r_use->ref) == NULL)
+ continue;
+
rtx_insn *use_insn = DF_REF_INSN (r_use->ref);
if (BLOCK_FOR_INSN (use_insn) != g->bb)