I'd like for combine to perform the following simplification:

(insn 14 13 16 0 /home/hp/combined/combined/gcc/config/cris/arit.c:228 
(parallel [
            (set (reg/v:SI 27 [ b.67 ])
                (abs:SI (reg/v:SI 47 [ b ])))
            (clobber (reg:CC 19 dccr))
        ]) 158 {abssi2} (insn_list:REG_DEP_TRUE 7 (nil))
    (expr_list:REG_UNUSED (reg:CC 19 dccr)
        (nil)))

(jump_insn 17 16 19 0 /home/hp/combined/combined/gcc/config/cris/arit.c:178 
(parallel [
            (set (pc)
                (if_then_else (ge (abs:SI (reg/v:SI 47 [ b ]))
                        (const_int 0 [0x0]))
                    (label_ref 24)
                    (pc)))
            (clobber (reg:CC 19 dccr))
        ]) 1 {cris_cbranchsi4} (insn_list:REG_DEP_TRUE 14 (nil))
    (expr_list:REG_UNUSED (reg:CC 19 dccr)
        (expr_list:REG_BR_PROB (const_int 7900 [0x1edc])
            (nil))))

into:

(insn 14 13 16 0 /home/hp/combined/combined/gcc/config/cris/arit.c:228 
(parallel [
            (set (reg/v:SI 27 [ b.67 ])
                (abs:SI (reg/v:SI 47 [ b ])))
            (clobber (reg:CC 19 dccr))
        ]) 158 {abssi2} (insn_list:REG_DEP_TRUE 7 (nil))
    (expr_list:REG_UNUSED (reg:CC 19 dccr)
        (nil)))

(jump_insn 17 16 19 0 /home/hp/combined/combined/gcc/config/cris/arit.c:178
            (set (pc) (label_ref 24)) 1 {jump}
  (insn_list:REG_DEP_TRUE 14 (nil)))

(beware, edited RTL.)  However, it doesn't, as trading two for
two-with-a-lesser-cost is currently not done; comments mention
fear of recursion or oscillation.  That shouldn't happen if the
rtx cost is considered and is nearly sane.

If you think this optimization is misplaced, I see no pass
*after* combine, that is expected to this perform
simplification.  Maybe the SSA optimizations before this pass
should cover it, but they don't, at least not with 108225
compiling libgcc/_divsi3.o for cris-axis-linux-gnu (there's an
abs in a caller, with a < 0 test in an inlined function).  This
function is the top pessimized for my non-cc0 CRIS wip.  Anyway,
arguments like "no, do it in SSA" miss the point and will be
ignored; things have different shape at the RTL level and may
not be apparent in SSA.  (Yes, SSA might have a flow exposed
here, if so, it should probably be fixed *too*.)

Note also that the cc0-equivalent of the above is simplified by
combine:

(insn 14 13 16 0 /home/hp/combined/combined/gcc/config/cris/arit.c:228 (set 
(reg/v:SI 27 [ b.67 ])
        (abs:SI (reg/v:SI 47 [ b ]))) 148 {abssi2} (insn_list:REG_DEP_TRUE 7 
(nil))
    (nil))

(insn 17 16 18 0 /home/hp/combined/combined/gcc/config/cris/arit.c:178 (set 
(cc0)
        (reg/v:SI 27 [ b.67 ])) 1 {tstsi} (insn_list:REG_DEP_TRUE 14 (nil))
    (nil))

(jump_insn 18 17 20 0 /home/hp/combined/combined/gcc/config/cris/arit.c:178 
(set (pc)
        (if_then_else (ge (abs:SI (reg/v:SI 47 [ b ]))
                (const_int 0 [0x0]))
            (label_ref 26)
            (pc))) 162 {bge} (nil)
    (expr_list:REG_BR_PROB (const_int 7900 [0x1edc])
        (nil)))

is simplified to:

(insn 14 13 16 0 /home/hp/combined/combined/gcc/config/cris/arit.c:228 (set 
(reg/v:SI 27 [ b.67 ])
        (abs:SI (reg/v:SI 47 [ b ]))) 148 {abssi2} (insn_list:REG_DEP_TRUE 7 
(nil))
    (nil))

(jump_insn 18 17 20 0 /home/hp/combined/combined/gcc/config/cris/arit.c:178 
(set (pc)
        (label_ref 26)) 162 {bge} (nil)
    (expr_list:REG_BR_PROB (const_int 7900 [0x1edc])
        (nil)))

(right after substitutions) and combine allows this, being a
three-for-two (with-lesser-cost) transformation.

The actual code should be simple; I just want to check that
there's consensus on the actual change before doing it.

Thoughts?

brgds, H-P

Reply via email to