[Bug rtl-optimization/3507] appalling optimisation with sub/cmp on multiple targets

ubizjak at gmail dot com via Gcc-bugs <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3507

Uroš Bizjak <ubizjak at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |law at gcc dot gnu.org

--- Comment #66 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Ivan Sorokin from comment #60)
> Another similar case. On this function:
> 
> unsigned wrap(unsigned index, unsigned limit)
> {
>     if (index >= limit)
>         index -= limit;
>     return index;
> }

This is actually PR97603.

We expand the above testcase to:

(insn 7 4 8 2 (set (reg:CC 17 flags)
        (compare:CC (reg/v:SI 99 [ index ])
            (reg/v:SI 100 [ limit ]))) "pr3507-1.c":3:8 15 {*cmpsi_1}
     (nil))
(jump_insn 8 7 9 2 (set (pc)
        (if_then_else (ltu (reg:CC 17 flags)
                (const_int 0 [0]))
            (label_ref 11)
            (pc))) "pr3507-1.c":3:8 1490 {*jcc}
     (int_list:REG_BR_PROB 536870913 (nil))
 -> 11)

(note 9 8 10 4 [bb 4] NOTE_INSN_BASIC_BLOCK)
(insn 10 9 11 4 (parallel [
            (set (reg/v:SI 99 [ index ])
                (minus:SI (reg/v:SI 99 [ index ])
                    (reg/v:SI 100 [ limit ])))
            (clobber (reg:CC 17 flags))
        ]) "pr3507-1.c":4:15 393 {*subsi_1}
     (nil))

which is the same as for testcase from PR97603:

(insn 7 4 8 2 (set (reg:CCGC 17 flags)
        (compare:CCGC (reg/v:SI 99 [ a ])
            (reg/v:SI 100 [ b ]))) "pr97603.c":5:8 15 {*cmpsi_1}
     (nil))
(jump_insn 8 7 9 2 (set (pc)
        (if_then_else (ge (reg:CCGC 17 flags)
                (const_int 0 [0]))
            (label_ref 13)
            (pc))) "pr97603.c":5:8 1490 {*jcc}
     (int_list:REG_BR_PROB 524845001 (nil))
 -> 13)

(note 9 8 10 4 [bb 4] NOTE_INSN_BASIC_BLOCK)
(insn 10 9 11 4 (parallel [
            (set (reg:SI 98 [ <retval> ])
                (minus:SI (reg/v:SI 99 [ a ])
                    (reg/v:SI 100 [ b ])))
            (clobber (reg:CC 17 flags))
        ]) "pr97603.c":6:18 393 {*subsi_1}
     (nil))

Please note that (insn 7) and (insn 10) could be merged to:

(define_insn "*sub<mode>_3"
  [(set (reg FLAGS_REG)
        (compare (match_operand:SWI 1 "nonimmediate_operand" "0,0,r,r,m")
                 (match_operand:SWI 2 "<general_operand>"
"<r><i>,<m>,r<i>,<m>,r<i>")))
   (set (match_operand:SWI 0 "nonimmediate_operand" "=<r>m,<r>,r,r,r")
        (minus:SWI (match_dup 1) (match_dup 2)))]
  "ix86_match_ccmode (insn, CCmode)
   && ix86_binary_operator_ok (MINUS, <MODE>mode, operands, TARGET_APX_NDD)"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.