[Bug c/36232] New: Optimizer removes condition check to terminate loop
This section of code is used in a bootloader to test DRAM. It loops over the DRAM performing various operations of reads and writes. When optimization (O2 or Os) is switched on the second loop in this example no longer terminates, but continues indefinitely because the loop condition has been removed from the optimized code -- Summary: Optimizer removes condition check to terminate loop Product: gcc Version: 4.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: nick dot spence at freescale dot com GCC build triplet: gcc version 4.1.2 20070626 (Red Hat 4.1.2-13) GCC host triplet: i386-redhat-linux GCC target triplet: i386-redhat-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36232
[Bug c/36232] Optimizer removes condition check to terminate loop
--- Comment #1 from nick dot spence at freescale dot com 2008-05-13 19:51 --- Created an attachment (id=15636) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=15636&action=view) Example code source file Compile with 'gcc -Os test.c' or 'gcc -O2 test.c' and examine assembly output. Note this code cannot be run in user space becuase it will generate a segmentation fault. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36232
[Bug c/36232] Optimizer removes condition check to terminate loop
--- Comment #2 from nick dot spence at freescale dot com 2008-05-13 19:52 --- Created an attachment (id=15637) --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=15637&action=view) Compiler intermediate file -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36232
[Bug c/36232] Optimizer removes condition check to terminate loop
--- Comment #3 from nick dot spence at freescale dot com 2008-05-13 19:56 --- The code has two loops, which compile correctly when no optimization, or -O1 are used, but the second loop becomes infinite if -Os or -O2 is used. .file "test.c" .section.rodata.str1.1,"aMS",@progbits,1 .LC0: .string "\n reads %d, 0x%08X" .text .globl main .type main, @function main: leal4(%esp), %ecx andl$-16, %esp pushl -4(%ecx) pushl %ebp movl%esp, %ebp pushl %esi pushl %ebx xorl%ebx, %ebx pushl %ecx subl$12, %esp .L2: movl$0, (%ebx) addl$4, %ebx cmpl$64, %ebx jne .L2 /* branch condition for first loop */ xorl%esi, %esi .L4: pushl %eax pushl %ebx subl$4, %ebx pushl %esi incl%esi pushl $.LC0 callprintf movl(%ebx), %eax addl$16, %esp jmp .L4/* branch condition for second loop was lost */ .size main, .-main .ident "GCC: (GNU) 4.1.2 20070626 (Red Hat 4.1.2-13)" .section.note.GNU-stack,"",@progbits -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36232
[Bug c/36232] Optimizer removes condition check to terminate loop
--- Comment #6 from nick dot spence at freescale dot com 2008-05-13 20:41 --- 1) Since most bootloaders are written in C your view is very interesting but probably not shared by everyone else working with embedded software. 2) If the compiler now treats this as an undefined condition it should report a warning instead of silently creating invalid code. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36232