This is the mail archive of the gcc-bugs@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]

regmove question



I was looking at a bug caused by regmove tonight.  Either I'm grossly
mis-understanding regmove, or we have a noteworthy bug.

In .combine we have:

(insn 11 10 13 (set (reg:DF 25)
        (minus:DF (reg/v/u:DF 23)
            (reg/v/u:DF 22))) 403 {ffshi_1+1} (insn_list 4 (insn_list 6 (nil)))
    (nil))

(note 13 11 14 "" NOTE_INSN_DELETED)

(insn 14 13 15 (set (reg:DF 26)
        (mult:DF (reg/v/u:DF 22)
            (reg/v/u:DF 23))) 403 {ffshi_1+1} (nil)
    (expr_list:REG_DEAD (reg/v/u:DF 22)
        (nil)))

(insn 15 14 16 (set (reg:DF 28)
        (plus:DF (reg:DF 26)
            (reg/v/u:DF 23))) 403 {ffshi_1+1} (insn_list 14 (nil))
    (expr_list:REG_DEAD (reg:DF 26)
        (expr_list:REG_DEAD (reg/v/u:DF 23)
            (nil))))

(insn 16 15 19 (set (reg/v:DF 24)
        (div:DF (reg:DF 25)
            (reg:DF 28))) 403 {ffshi_1+1} (insn_list 11 (insn_list 15 (nil)))
    (expr_list:REG_DEAD (reg:DF 25)
        (expr_list:REG_DEAD (reg:DF 28)
            (nil))))


in .regmove we have:

(note 11 10 13 "" NOTE_INSN_DELETED)

(note 13 11 14 "" NOTE_INSN_DELETED)

(insn 14 13 15 (set (reg/v/u:DF 22)
        (mult:DF (reg/v/u:DF 22)
            (reg/v/u:DF 23))) 403 {ffshi_1+1} (nil)
    (nil))

(insn 15 14 30 (set (reg/v/u:DF 22)
        (plus:DF (reg/v/u:DF 22)
            (reg/v/u:DF 23))) 403 {ffshi_1+1} (insn_list 14 (nil))
    (nil))

(insn 30 15 16 (set (reg/v/u:DF 23)
        (minus:DF (reg/v/u:DF 23)
            (reg/v/u:DF 22))) 403 {ffshi_1+1} (nil)
    (nil))

(insn 16 30 19 (set (reg/v/u:DF 23)
        (div:DF (reg/v/u:DF 23)
            (reg/v/u:DF 22))) 403 {ffshi_1+1} (insn_list 11 (insn_list 15 (nil)))
    (expr_list:REG_DEAD (reg/v/u:DF 22)
        (nil)))


Note how reg22 is clobbered by insn 14 and insn 15 in the regmove dump
and that it's clobbered *before* insn 30 which needs the original value.

I don't see any code in regmove which handles this case.  Am I missing something
stupid?

The testcase for this is execute/990829-1.c -O2 on i686-pc-linux-gnu.

Thoughts?
jeff




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