https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80818

            Bug ID: 80818
           Summary: LRA clobbers live hard reg clobbered during
                    rematerialization
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: krebbel at gcc dot gnu.org
  Target Milestone: ---

Created attachment 41383
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41383&action=edit
Experimental patch

GCC revision: r248043

The live range for the following insn does not appear to be calculated
correctly:
(insn 1451 57711 1452 121 (parallel [
            (set (reg:SI 1360 [ _2122 ])
                (plus:SI (plus:SI (gtu:SI (reg:CCU 33 %cc)
                            (const_int 0 [0]))
                        (reg:SI 1404 [ _2207 ]))
                    (reg:SI 1427 [ _2244 ])))
            (clobber (reg:CC 33 %cc))
        ]) "t.f90":61 1661 {*addsi3_alc}
     (expr_list:REG_DEAD (reg:SI 1427 [ _2244 ])
        (expr_list:REG_DEAD (reg:SI 1404 [ _2207 ])
            (expr_list:REG_DEAD (reg:CCU 33 %cc)
                (expr_list:REG_UNUSED (reg:CC 33 %cc)
                    (nil))))))


The CC reg is read as part of an operand but also clobbered in that insn.

The following operand registers are being recorded by lra:
{early_clobber_alts = 0, biggest_mode = SImode, type = OP_OUT, subreg_p = 0,
early_clobber = 0, regno = 1360, next = 0x4090910}
{early_clobber_alts = 0, biggest_mode = SImode, type = OP_IN, subreg_p = 0,
early_clobber = 0, regno = 1404, next = 0x40908f0}
{early_clobber_alts = 0, biggest_mode = SImode, type = OP_IN, subreg_p = 0,
early_clobber = 0, regno = 1427, next = 0x40908d0}
{early_clobber_alts = 0, biggest_mode = CCUmode, type = OP_IN, subreg_p = 0,
early_clobber = 0, regno = 33, next = 0x0}

and these hard regs:

{early_clobber_alts = 18446744073709551615, biggest_mode = CCmode, type =
OP_OUT, subreg_p = 0, early_clobber = 1, regno = 33, next = 0x0}

Marking the r33 entry early_clobber does not appear to be correct to me and
makes r33 dead before that insn.


The attached patch is a quick hack which prevents the early_clobber flag to be
set if the hard reg also appears also as input reg in an operand.

Reply via email to