------- Comment #28 from danglin at gcc dot gnu dot org 2006-07-28 21:51
-------
I've been trying to figure out why we end up with the strange intialization for
the
parity loop. I see this rtl in the loop2 dump:
;; Start of basic block 7, registers live: (nil)
(code_label 57 56 108 7 47 "" [1 uses])
(note 108 57 58 7 [bb 7] NOTE_INSN_BASIC_BLOCK)
(insn 58 108 111 7 (set (reg:SI 129)
(and:SI (subreg:SI (reg:DI 113) 4)
(const_int 1 [0x1]))) 126 {andsi3} (nil)
(nil))
(insn 111 58 112 7 (set (reg:SI 136)
(ne:SI (reg:SI 129)
(const_int 0 [0x0]))) 4 {scc} (nil)
(nil))
(insn 112 111 67 7 (set (reg/v:SI 108 [ count ])
(plus:SI (reg/v:SI 108 [ count ])
(reg:SI 136))) 114 {addsi3} (nil)
(nil))
(insn 67 112 68 7 (set (reg/v:SI 109 [ i ])
(plus:SI (reg/v:SI 109 [ i ])
(const_int 1 [0x1]))) 114 {addsi3} (nil)
(nil))
(insn 68 67 69 7 (set (reg:SI 130)
(const_int 64 [0x40])) 37 {*pa.md:2482} (nil)
(nil))
(jump_insn 69 68 71 7 (set (pc)
(if_then_else (ne (reg/v:SI 109 [ i ])
(reg:SI 130))
(label_ref 27)
(pc))) 25 {*pa.md:1710} (nil)
(expr_list:REG_EQUAL (if_then_else (ne (reg/v:SI 109 [ i ])
(const_int 64 [0x40]))
(label_ref 27)
(pc))
(expr_list:REG_BR_PROB (const_int 9844 [0x2674])
(nil))))
;; End of basic block 7, registers live:
(nil)
;; Start of basic block 8, registers live: (nil)
(note 71 69 73 8 [bb 8] NOTE_INSN_BASIC_BLOCK)
(insn 73 71 74 8 (set (reg:DI 25 %r25 [ D.1497 ])
(reg:DI 110 [ D.1497 ])) 77 {*pa.md:4458} (nil)
(insn_list:REG_LIBCALL 75 (nil)))
(call_insn/u 74 73 75 8 (parallel [
(set (reg:SI 28 %r28)
(call (mem:SI (symbol_ref/v:SI ("@__paritydi2") [flags 0x41]) [
0 S4 A32])
(const_int 64 [0x40])))
(clobber (reg:SI 1 %r1))
(clobber (reg:SI 2 %r2))
(use (const_int 0 [0x0]))
]) 210 {call_val_symref} (nil)
(expr_list:REG_EH_REGION (const_int -1 [0xffffffff])
(nil))
(expr_list:REG_DEP_TRUE (use (reg:DI 25 %r25 [ D.1497 ]))
(nil)))
This gets transformed to the following rtl in the loop2_init dump:
;; Start of basic block 7, registers live: (nil)
(code_label 57 56 108 7 47 "" [0 uses])
(note 108 57 58 7 [bb 7] NOTE_INSN_BASIC_BLOCK)
(insn 58 108 111 7 (set (reg:SI 129)
(and:SI (subreg:SI (reg:DI 113) 4)
(const_int 1 [0x1]))) 126 {andsi3} (nil)
(nil))
(insn 111 58 112 7 (set (reg:SI 136)
(ne:SI (reg:SI 129)
(const_int 0 [0x0]))) 4 {scc} (nil)
(nil))
(insn 112 111 67 7 (set (reg/v:SI 108 [ count ])
(plus:SI (reg/v:SI 108 [ count ])
(reg:SI 136))) 114 {addsi3} (nil)
(nil))
(insn 67 112 68 7 (set (reg/v:SI 109 [ i ])
(plus:SI (reg/v:SI 109 [ i ])
(const_int 1 [0x1]))) 114 {addsi3} (nil)
(nil))
(insn 68 67 69 7 (set (reg:SI 130)
(const_int 64 [0x40])) 37 {*pa.md:2482} (nil)
(nil))
(jump_insn 69 68 116 7 (set (pc)
(if_then_else (ne (reg/v:SI 109 [ i ])
(reg:SI 130))
(label_ref:SI 116)
(pc))) -1 (nil)
(expr_list:REG_EQUAL (if_then_else (ne (reg/v:SI 109 [ i ])
(const_int 64 [0x40]))
(label_ref:SI 116)
(pc))
(expr_list:REG_BR_PROB (const_int 9844 [0x2674])
(nil))))
;; End of basic block 7, registers live:
(nil)
;; Start of basic block 13, registers live: (nil)
(code_label 116 69 115 13 55 "" [1 uses])
(note 115 116 71 13 [bb 13] NOTE_INSN_BASIC_BLOCK)
;; End of basic block 13, registers live:
(nil)
;; Start of basic block 8, registers live: (nil)
(note 71 115 73 8 [bb 8] NOTE_INSN_BASIC_BLOCK)
(insn 73 71 74 8 (set (reg:DI 25 %r25 [ D.1497 ])
(reg:DI 110 [ D.1497 ])) 77 {*pa.md:4458} (nil)
(insn_list:REG_LIBCALL 75 (nil)))
(call_insn/u 74 73 75 8 (parallel [
(set (reg:SI 28 %r28)
(call (mem:SI (symbol_ref/v:SI ("@__paritydi2") [flags 0x41]) [
0 S4 A32])
(const_int 64 [0x40])))
(clobber (reg:SI 1 %r1))
(clobber (reg:SI 2 %r2))
(use (const_int 0 [0x0]))
]) 210 {call_val_symref} (nil)
(expr_list:REG_EH_REGION (const_int -1 [0xffffffff])
(nil))
(expr_list:REG_DEP_TRUE (use (reg:DI 25 %r25 [ D.1497 ]))
(nil)))
As a result, jump_insn 69 no longer does anything. All references
to code_label 27 are now gone and this appears to allow stuff that
was originally in the loop to end up as a loop initializers.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26244