[Bug target/23102] extra XORs generated on i686

dann at godzilla dot ics dot uci dot edu gcc-bugzilla@gcc.gnu.org
Wed Aug 3 18:21:00 GMT 2005


------- Additional Comments From dann at godzilla dot ics dot uci dot edu  2005-08-03 18:21 -------
These insns in the .32.flow2 RTL dump: 
(insn:HI 12 7 14 0 (set (mem/s:SI (plus:SI (reg/v/f:SI 0 ax [orig:58 screen ] [58])
                (const_int 3144 [0xc48])) [7 <variable>.selection_count+0 S4 A32])
        (const_int 0 [0x0])) 34 {*movsi_1} (insn_list:REG_DEP_TRUE 6 (nil))
    (nil))

(insn:HI 14 12 15 0 (set (mem/s:SI (plus:SI (reg/v/f:SI 0 ax [orig:58 screen ] [58])
                (const_int 3124 [0xc34])) [7 <variable>.startHCol+0 S4 A32])
        (const_int 0 [0x0])) 34 {*movsi_1} (nil)
    (nil))

(insn:HI 15 14 17 0 (set (mem/s:SI (plus:SI (reg/v/f:SI 0 ax [orig:58 screen ] [58])
                (const_int 3120 [0xc30])) [7 <variable>.startHRow+0 S4 A32])
        (const_int 0 [0x0])) 34 {*movsi_1} (nil)
    (nil))
[snip]
are transformed by this peephole2: 
(define_peephole2
  [(match_scratch:SI 1 "r")
   (set (match_operand:SI 0 "memory_operand" "")
        (const_int 0))]
  "! optimize_size
   && ! TARGET_USE_MOV0
   && TARGET_SPLIT_LONG_MOVES
   && get_attr_length (insn) >= ix86_cost->large_insn
   && peep2_regno_dead_p (0, FLAGS_REG)"
  [(parallel [(set (match_dup 1) (const_int 0))
	      (clobber (reg:CC FLAGS_REG))])
   (set (match_dup 0) (match_dup 1))]
  "")

into: 

(insn 46 45 43 0 (set (mem/s:SI (plus:SI (reg/v/f:SI 0 ax [orig:58 screen ] [58])
                (const_int 3144 [0xc48])) [7 <variable>.selection_count+0 S4 A32])
        (reg:SI 1 dx)) -1 (nil)
    (expr_list:REG_DEAD (reg:SI 1 dx)
        (nil)))

(insn 43 46 44 0 (parallel [
            (set (reg:SI 2 cx)
                (const_int 0 [0x0]))
            (clobber (reg:CC 17 flags))
        ]) -1 (nil)
    (expr_list:REG_UNUSED (reg:CC 17 flags)
        (nil)))

(insn 44 43 41 0 (set (mem/s:SI (plus:SI (reg/v/f:SI 0 ax [orig:58 screen ] [58])
                (const_int 3124 [0xc34])) [7 <variable>.startHCol+0 S4 A32])
        (reg:SI 2 cx)) -1 (nil)
    (expr_list:REG_DEAD (reg:SI 2 cx)
        (nil)))

(insn 41 44 42 0 (parallel [
            (set (reg:SI 1 dx)
                (const_int 0 [0x0]))
            (clobber (reg:CC 17 flags))
        ]) -1 (nil)
    (expr_list:REG_UNUSED (reg:CC 17 flags)
        (nil)))

(insn 42 41 39 0 (set (mem/s:SI (plus:SI (reg/v/f:SI 0 ax [orig:58 screen ] [58])
                (const_int 3120 [0xc30])) [7 <variable>.startHRow+0 S4 A32])
        (reg:SI 1 dx)) -1 (nil)
    (expr_list:REG_DEAD (reg:SI 1 dx)
        (nil)))

(insn 39 42 40 0 (parallel [
            (set (reg:SI 2 cx)
                (const_int 0 [0x0]))
            (clobber (reg:CC 17 flags))
        ]) -1 (nil)
    (expr_list:REG_UNUSED (reg:CC 17 flags)
        (nil)))
[snip]

Can the result of a peephole2 be used in matching another peephole2? 
If yes in that case another peephole2 can be written to match 
(set REGXXX 0) ;; this is generated by a previous peephole2
(set (mem.... ) (const_int 0))

and change that to
(set (mem ....) REGXXXX)







-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23102



More information about the Gcc-bugs mailing list