[Bug c/36232] New: Optimizer removes condition check to terminate loop

2008-05-13 Thread nick dot spence at freescale dot com
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

2008-05-13 Thread nick dot spence at freescale dot com


--- 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

2008-05-13 Thread nick dot spence at freescale dot com


--- 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

2008-05-13 Thread nick dot spence at freescale dot com


--- 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

2008-05-13 Thread nick dot spence at freescale dot com


--- 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