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: unassig...@gcc.gnu.org ReportedBy: izamya...@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)