[Bug target/50176] New: [4.6/4.7 Regression] 4.7 generates spill-fill dealing with char->int conversion

izamyatin at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Aug 24 14:56:00 GMT 2011


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

             Bug #: 50176
           Summary: [4.6/4.7 Regression] 4.7 generates spill-fill dealing
                    with char->int conversion
    Classification: Unclassified
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: izamyatin@gmail.com


Created attachment 25088
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=25088
testcase for the problem

I observe that for attached testcase (made from one of tests from EEMBC 2.0
suite) 4.7 generates spill-fill pair when (I suspect) dealing with char->int
conversion while 4.6 doesn't generate them.

Asm for 4.7 for lines 42-47 from the testcase:

.LVL7:
        # test_4_6.c:42
        .loc 1 42 0 discriminator 2
        movl    8(%esp), %edx
        # test_4_6.c:45
        .loc 1 45 0 discriminator 2
        movl    0(,%edi,4), %esi
        # test_4_6.c:42
        .loc 1 42 0 discriminator 2
        movzbl  (%edx,%eax), %edx    <---- edx contains cb frome line 42
        # test_4_6.c:40
        .loc 1 40 0 discriminator 2
        addl    $1, %eax
        # test_4_6.c:45
        .loc 1 45 0 discriminator 2
        addl    %ebx, %esi
        # test_4_6.c:42
        .loc 1 42 0 discriminator 2
        movb    %dl, 3(%esp)          <----- spill, line 42
.LVL8:
        # test_4_6.c:45
        .loc 1 45 0 discriminator 2
        movzbl  (%esi), %edx
        # test_4_6.c:47
        .loc 1 47 0 discriminator 2
        movzbl  3(%esp), %esi         <----- fill, line 47
        # test_4_6.c:45
        .loc 1 45 0 discriminator 2
        movb    %dl, (%ecx)
        # test_4_6.c:47
        .loc 1 47 0 discriminator 2
        movl    0(,%esi,4), %edx     <------- using cb, line 47
        addl    0(,%edi,4), %edx
        sarl    $16, %edx
        # test_4_6.c:46
        .loc 1 46 0 discriminator 2
        movzbl  (%ebx,%edx), %edx
        # test_4_6.c:49
        .loc 1 49 0 discriminator 2
        addl    0(,%esi,4), %ebx      <----- using cb, line 49


 Meanwhile, 4.6 does not have such problem:

.LVL7:
        # test_4_6.c:42
        .loc 1 42 0 discriminator 2
        movl    4(%esp), %edx
        movzbl  (%edx,%eax), %esi <-- esi=cb and is used later without spills
.LVL8:
        # test_4_6.c:40
        .loc 1 40 0 discriminator 2
        addl    $1, %eax
        # test_4_6.c:45
        .loc 1 45 0 discriminator 2
        movl    0(,%edi,4), %edx
        addl    %ebx, %edx
        movzbl  (%edx), %edx
        movb    %dl, (%ecx)
        # test_4_6.c:47
        .loc 1 47 0 discriminator 2
        movl    0(,%esi,4), %edx    <---- using cb, line 47
        addl    0(,%edi,4), %edx
        sarl    $16, %edx
        # test_4_6.c:46
        .loc 1 46 0 discriminator 2
        movzbl  (%ebx,%edx), %edx
        # test_4_6.c:49
        .loc 1 49 0 discriminator 2
        addl    0(,%esi,4), %ebx   <---- using cb, line 49

 After expanding 4.7 contains:

(insn 52 51 53 6 (set (reg:QI 83 [ D.2723 ])
        (mem:QI (plus:SI (reg/v/f:SI 75 [ inptr1 ])
                (reg/v:SI 117 [ col ])) [0 MEM[base: inptr1_19, index: col_90,
offset: 0B]+0 S1 A8])) test_4_6.c:42 -1
     (nil))

 and 4.6 contains

(insn 52 51 53 6 (parallel [
            (set (reg/v:SI 86 [ cb ])
                (zero_extend:SI (mem:QI (plus:SI (reg/v/f:SI 76 [ inptr1 ])
                            (reg/v:SI 78 [ col ])) [0 MEM[base: inptr1_19, 
index: col_22, offset: 0B]+0 S1 A8])))
            (clobber (reg:CC 17 flags))
        ]) test_4_6.c:42 -1
     (nil))


Options are: -c -g -m32 -O2 test.c


GCC 4.6 is 

Target: x86_64-unknown-linux-gnu
Configured with: ../gcc/configure --prefix=/export/users/izamyati/prefix
Thread model: posix
gcc version 4.6.0 20110215 (experimental) (GCC)

GCC 4.7 is 

Target: x86_64-unknown-linux-gnu
Configured with: ../configure --disable-bootstrap --enable-languages=c,c++
--prefix=/export/users/izamyati/prefix_4_7
Thread model: posix
gcc version 4.7.0 20110824 (experimental) (GCC)



More information about the Gcc-bugs mailing list