This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/40679] Optimizer handles loops with volatiles and post-incr. wrong
- From: "bastian dot schick at sciopta dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 8 Jul 2009 13:06:05 -0000
- Subject: [Bug tree-optimization/40679] Optimizer handles loops with volatiles and post-incr. wrong
- References: <bug-40679-17922@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #8 from bastian dot schick at sciopta dot com 2009-07-08 13:06 -------
(In reply to comment #6)
> (In reply to comment #2)
> > Replacing *tbl++ by tbl[i] gives this ARM code:
> > .L2:
> > mov r3, #10
> > str r3, [r2], #4
> > cmp r2, #0
> > bne .L2
> > bx lr
> >
> > See, gcc knows about the wrapping but still the *tbl++ version misses the
> > end-condition which is the bug.
>
> The difference is that in the tbl[i] version there will not be a wraparound at
> runtime because &tbl[i] for i == 64 is never computed, while in the *tbl++
> version the iteration with i == 63 will do tbl++ moving tbl from -4U to 0
> before the loop termination test, which triggers undefined behaviour.
Ok fine, but why does it generate correct code if not using volatile for the
pointer ?!
mvn r2, #251
.L2:
mov r3, #10
str r3, [r2, #-4]
add r2, r2, #4
cmp r2, #4
bne .L2
bx lr
Strange, no post-increment code is generated.
The 68k version still uses post-increment and voilà, endless-loop.
Also see the code for the tbl[i] version, the pointer still wraps.
I suspect following: The test for 0 is removed maybe because the post-increment
is defined to change flags( which it isn't). Since there is no test, the next
optimization changes a "jump not zero" to an "jump always".
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40679