This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug rtl-optimization/11873] inefficient use of registers induces size and time overhead



------- Comment #4 from rask at gcc dot gnu dot org  2007-11-09 23:51 -------
This has improved (-O2 -fomit-frame-pointer):

test:
        movl    4(%esp), %eax   # 32    *movsi_1/1      [length = 4]
        movl    8(%esp), %edx   # 44    *movsi_1/1      [length = 4]
        orl     %eax, %edx      # 6     *iorsi_1/1      [length = 2]
        addl    $1, %eax        # 35    *addsi_1/1      [length = 3]
        cmpl    $1, %edx        # 38    *cmpsi_1_insn/1 [length = 3]
        sbbl    %edx, %edx      # 39    x86_movsicc_0_m1        [length = 2]
        notl    %edx            # 40    *one_cmplsi2_1  [length = 2]
        andl    %edx, %eax      # 41    *andsi_1/1      [length = 2]
        ret                     # 47    return_internal [length = 1]
        .ident  "GCC: (GNU) 4.3.0 20071102 (experimental)"

With -Os -fomit-frame-pointer we get:

test:
        movl    4(%esp), %edx   # 32    *movsi_1/1      [length = 4]
        xorl    %eax, %eax      # 48    *movsi_xor      [length = 2]
        movl    8(%esp), %ecx   # 43    *movsi_1/1      [length = 4]
        orl     %edx, %ecx      # 7     *iorsi_3        [length = 2]
        je      .L3             # 8     *jcc_1          [length = 2]
        leal    1(%edx), %eax   # 44    *lea_1          [length = 3]
.L3:
        ret                     # 47    return_internal [length = 1]

With -O2/-Os -fomit-frame-pointer -march=pentiumpro:

test:
        movl    4(%esp), %edx   # 32    *movsi_1/1      [length = 4]
        xorl    %eax, %eax      # 46    *movsi_xor      [length = 2]
        leal    1(%edx), %ecx   # 41    *lea_1          [length = 3]
        orl     8(%esp), %edx   # 36    *iorsi_3        [length = 4]
        cmovne  %ecx, %eax      # 38    *movsicc_noc/1  [length = 3]
        ret                     # 44    return_internal [length = 1]

I would probably code it like so:

        movl    4(%esp), %eax           ; 4
        movl    8(%esp), %edx           ; 4
        orl     %eax,   %edx            ; 2
        addl    $-1,    %edx            ; 3
        adcl    $0,     %eax            ; 3
        ret                             ; 1


-- 


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]