fwprop not propagating

Paulo J. Matos paulo@matos-sorge.com
Wed May 9 14:58:00 GMT 2012


Forget about this question. Doesn't make sense at all.

I wonder if the thing I drank during lunch was really water...


On 09/05/12 14:40, Paulo J. Matos wrote:
> 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



More information about the Gcc mailing list