In the latest reload.c, the function combine_reloads() includes 
a wrong evaluation order of expressions to check if there is any 
available hard register.

In the following statements in combine_reloads(),
the candidate register must be checked whether it is a
hard register or not before invoking the function 
reg_overlap_mentioned_for_reload_p(). Otherwise,
reg_overlap_mentioned_for_reload_p() will fail and die
when it is invoked and the candidate register is a pseudo register.


File: reload.c
Revision: 1.268, Thu Feb 24 22:06:06 2005 UTC (5 weeks, 1 day ago) by dje 

1837:  /* See if some hard register that dies in this insn and is not used in
1838:     the output is the right class.  Only works if the register we pick
1839:     up can fully hold our output reload.  */
1840:  for (note = REG_NOTES (this_insn); note; note = XEXP (note, 1))
1841:    if (REG_NOTE_KIND (note) == REG_DEAD
1842:   && REG_P (XEXP (note, 0))
1843:   && ! reg_overlap_mentioned_for_reload_p (XEXP (note, 0),
1844:                                            rld[output_reload].out)
1845:   && REGNO (XEXP (note, 0)) < FIRST_PSEUDO_REGISTER

-- 
           Summary: Wrong evaluation order of expressions in
                    combine_reloads() in reload.c
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: rtl-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: kumura at r2 dot dion dot ne dot jp
                CC: gcc-bugs at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20728

Reply via email to