This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFC: SMS problem with emit_copy_of_insn_after copying REG_NOTEs


Hello all,

I'm preparing and testing SMS correction/improvements patch and while
testing it on the SPU with the vectorizer testcases I've got an ICE in
the  "gcc_assert ( MAX_RECOG_OPERANDS - i)" in function copy_insn_1 in
emit_rtl.c. The call traces back to the loop versionioning called in
modulo-sched.c before the SMSing actually starts. The specific
instruction it tries to copy when it fails is

(insn 32 31 33 4 (parallel [
           (set (reg:SI 162)
               (div:SI (reg:SI 164)
                   (reg:SI 156)))
           (set (reg:SI 163)
               (mod:SI (reg:SI 164)
                   (reg:SI 156)))
           (clobber (scratch:SI))
           (clobber (scratch:SI))
           (clobber (scratch:SI))
           (clobber (scratch:SI))
           (clobber (scratch:SI))
           (clobber (scratch:SI))
           (clobber (scratch:SI))
           (clobber (scratch:SI))
           (clobber (scratch:SI))
           (clobber (reg:SI 130 hbr))
       ]) 129 {divmodsi4} (insn_list:REG_DEP_TRUE 30
(insn_list:REG_DEP_TRUE 31 (nil)))
   (expr_list:REG_DEAD (reg:SI 164)
       (expr_list:REG_DEAD (reg:SI 156)
           (expr_list:REG_UNUSED (reg:SI 130 hbr)
               (expr_list:REG_UNUSED (scratch:SI)
                   (expr_list:REG_UNUSED (scratch:SI)
                       (expr_list:REG_UNUSED (scratch:SI)
                           (expr_list:REG_UNUSED (scratch:SI)
                               (expr_list:REG_UNUSED (scratch:SI)
                                   (expr_list:REG_UNUSED (scratch:SI)
                                       (expr_list:REG_UNUSED (scratch:SI)
                                           (expr_list:REG_UNUSED (scratch:SI)
                                               (expr_list:REG_UNUSED
(scratch:SI)
(expr_list:REG_UNUSED (reg:SI 163)
                                                       (nil)))))))))))))))

The error happens in the first call to copy_insn_1 in the loop below
(copied from emit_copy_of_insn_after from emit_rtl.c):


for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) if (REG_NOTE_KIND (link) != REG_LABEL) { if (GET_CODE (link) == EXPR_LIST) REG_NOTES (new) = copy_insn_1 (gen_rtx_EXPR_LIST (REG_NOTE_KIND (link), XEXP (link, 0), REG_NOTES (new))); else REG_NOTES (new) = copy_insn_1 (gen_rtx_INSN_LIST (REG_NOTE_KIND (link), XEXP (link, 0), REG_NOTES (new))); }

Tracing the execution of copy_insn_1, it seems that it goes over the
same REG_NOTES many times (it seems to be a quadratic time complexity
algorithm). This causes "copy_insn_n_scratches++" to be executed more
times than there are SCRATCH registers (and even REG_NOTES) leading to
the failure in the assert. There are 9 SCRATCH registers used in the
instruction and MAX_RECOG_OPERANDS is 30 for the SPU.

Since copy_insn_n_scratches is initialized in copy_insn and since we
go over regnotes over and   over again, I've modified in the loop
above the two calls to copy_insn_1 with the calls to copy_insn. This
caused the ICEs in the testsuite to disappear.

I wonder if this constitutes a legitimate fix or I'm missing something?

Thanks in advance,
Vladimir


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]