Hi,

While debugging an issue related to my movmem rule, I noticed that fwprop seems to be doing some really strange.

The problem occurs when setting the argument to the block copy instruction. The full C code is:
int **
t25 (int *d, int **s)
{
  memcpy (d, *s, 16);
  return s;
}

Before fwprop I have the following chain:
(insn 7 4 8 2 (parallel [
            (set (reg/f:QI 24 [ *s_1(D) ])
                (mem/f:QI (reg/v/f:QI 23 [ s ]) [2 *s_1(D)+0 S1 A16]))
            (clobber (reg:CC 13 CC))
        ]) memcpy.i:4 6 {*movqi}
     (nil))

(insn 8 7 9 2 (parallel [
            (set (reg:QI 25)
                (const_int 16 [0x10]))
            (clobber (reg:CC 13 CC))
        ]) memcpy.i:4 6 {*movqi}
     (nil))

(insn 9 8 10 2 (parallel [
            (set (reg/f:QI 26 [ d ])
                (reg/v/f:QI 22 [ d ]))
            (clobber (reg:CC 13 CC))
        ]) memcpy.i:4 6 {*movqi}
     (nil))

(insn 10 9 11 2 (parallel [
            (set (reg/f:QI 27 [ *s_1(D) ])
                (reg/f:QI 24 [ *s_1(D) ]))
            (clobber (reg:CC 13 CC))
        ]) memcpy.i:4 6 {*movqi}
     (nil))

(insn 11 10 12 2 (parallel [
            (set (reg:QI 25)
                (const_int 0 [0]))
            (set (mem:BLK (reg/v/f:QI 22 [ d ]) [0 A16])
                (mem:BLK (reg/f:QI 24 [ *s_1(D) ]) [0 A16]))
            (set (reg/f:QI 26 [ d ])
                (plus:QI (reg/v/f:QI 22 [ d ])
                    (reg:QI 25)))
            (set (reg/f:QI 27 [ *s_1(D) ])
                (plus:QI (reg/f:QI 24 [ *s_1(D) ])
                    (reg:QI 25)))
        ]) memcpy.i:4 21 {bc2}
     (nil))


After fwprop I have:
(insn 2 5 3 2 (parallel [
            (set (reg/v/f:QI 22 [ d ])
                (reg:QI 1 AL [ d ]))
            (clobber (reg:CC 13 CC))
        ]) memcpy.i:3 6 {*movqi}
     (expr_list:REG_DEAD (reg:QI 1 AL [ d ])
        (expr_list:REG_UNUSED (reg:CC 13 CC)
            (nil))))

(insn 3 2 4 2 (parallel [
            (set (reg/v/f:QI 23 [ s ])
                (reg:QI 0 AH [ s ]))
            (clobber (reg:CC 13 CC))
        ]) memcpy.i:3 6 {*movqi}
     (expr_list:REG_DEAD (reg:QI 0 AH [ s ])
        (expr_list:REG_UNUSED (reg:CC 13 CC)
            (nil))))

(note 4 3 7 2 NOTE_INSN_FUNCTION_BEG)

(insn 7 4 8 2 (parallel [
            (set (reg/f:QI 24 [ *s_1(D) ])
                (mem/f:QI (reg/v/f:QI 23 [ s ]) [2 *s_1(D)+0 S1 A16]))
            (clobber (reg:CC 13 CC))
        ]) memcpy.i:4 6 {*movqi}
     (expr_list:REG_UNUSED (reg:CC 13 CC)
        (nil)))

(insn 8 7 11 2 (parallel [
            (set (reg:QI 25)
                (const_int 16 [0x10]))
            (clobber (reg:CC 13 CC))
        ]) memcpy.i:4 6 {*movqi}
     (expr_list:REG_UNUSED (reg:CC 13 CC)
        (nil)))

(insn 11 8 16 2 (parallel [
            (set (reg:QI 25)
                (const_int 0 [0]))
            (set (mem:BLK (reg/v/f:QI 22 [ d ]) [0 A16])
                (mem:BLK (reg/f:QI 24 [ *s_1(D) ]) [0 A16]))
            (set (reg/f:QI 26 [ d ])
                (plus:QI (reg/v/f:QI 22 [ d ])
                    (reg:QI 25)))
            (set (reg/f:QI 27 [ *s_1(D) ])
                (plus:QI (reg/f:QI 24 [ *s_1(D) ])
                    (reg:QI 25)))
        ]) memcpy.i:4 21 {bc2}
     (expr_list:REG_DEAD (reg/f:QI 24 [ *s_1(D) ])
        (expr_list:REG_DEAD (reg/v/f:QI 22 [ d ])
            (expr_list:REG_UNUSED (reg/f:QI 27 [ *s_1(D) ])
                (expr_list:REG_UNUSED (reg/f:QI 26 [ d ])
                    (expr_list:REG_UNUSED (reg:QI 25)
                        (nil)))))))


I understand that fwprop can delete insn 9 and 10, but shouldn't it then update insn 11 so that references to reg:QI 26 and reg:QI 27 now reference reg:QI 22 and reg:QI 24 respectively?

Cheers,
--
PMatos

Reply via email to