This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/59999] [4.9 Regression] Sign extension in loop regression blocks generation of zero overhead loop
- From: "rguenther at suse dot de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Thu, 06 Feb 2014 13:17:37 +0000
- Subject: [Bug rtl-optimization/59999] [4.9 Regression] Sign extension in loop regression blocks generation of zero overhead loop
- Auto-submitted: auto-generated
- References: <bug-59999-4 at http dot gcc dot gnu dot org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59999
--- Comment #18 from rguenther at suse dot de <rguenther at suse dot de> ---
On Thu, 6 Feb 2014, paulo@matos-sorge.com wrote:
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59999
>
> --- Comment #17 from Paulo J. Matos <paulo@matos-sorge.com> ---
> (In reply to rguenther@suse.de from comment #15)
> > On Thu, 6 Feb 2014, paulo@matos-sorge.com wrote:
> >
> > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59999
> > >
> > > --- Comment #14 from Paulo J. Matos <paulo@matos-sorge.com> ---
> > > Something like this which looks much simpler hits the same problem:
> > > extern int arr[];
> > >
> > > void
> > > foo32 (int limit)
> > > {
> > > short i;
> > > for (i = 0; (int)i < limit; i++)
> > > arr[i] += 1;
> > > }
> >
> > Exactly the same problem. C integral type promotion rules make
> > that i = (short)((int)i + 1) again. Note that (int)i + 1
> > does not overflow, (short) ((int)i + 1) invokes implementation-defined
> > behavior which in our case is modulo-2 reduction.
> >
> > Nothing guarantees that (short)i + 1 does not overflow.
>
> I am being thick... indeed I forgot to notice that i++ also invokes undefined
> behaviour. I guess then GCC sorts that out by casting i into unsigned short for
> the addition and all the remaining issues then unfold.
No, i++ doesn't invoke undefined behavior - that's the whole point
and GCC got this wrong until it was fixed (4.5 is still broken).
The whole point is that limit == SHORT_MAX + 1 and the loop being
endless is _valid_ (well, apart from arr[i] then overflowing - looks
like an opportunity to derive that i can _not_ overflow ... ;))