This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: shift+test optimization error
- From: leon zadorin <leonleon77 at gmail dot com>
- To: Bob Rorschach <rfr at franz dot com>
- Cc: gcc-help <gcc-help at gcc dot gnu dot org>
- Date: Thu, 19 Jan 2017 19:03:04 +1100
- Subject: Re: shift+test optimization error
- Authentication-results: sourceware.org; auth=none
- References: <22059.1484782701@gemini.franz.com>
On Thu, Jan 19, 2017 at 10:38 AM, Bob Rorschach <rfr@franz.com> wrote:
[...]
> long ov = ((long)(1)) << ((iv & 0x3f) + 1);
> if (ov == 1)
> ov = 0;
[...]
> for(i=60;i<65;i++)
> printf("%d=>0x%lx\n",i&63,badexample(i&63));
[...]
> The "if (ov==1)..." test is failing when the compilation is optimized,
> but not when compiled without optimization, as shown below.
> The 63=>0x1 line should be 63=>0x0.
[...]
> code below. The shift argument is 64, which acts like an argument of
> 0 on the 64-bit x86, but the test is only looking for a shift
Last time I checked in C, as well as in C++, standards -- shifting by
the number of bits greater *or equal* to the size of the type is
undefined behavior...
e.g. something like "An expression is shifted by a negative number or
by an amount greater than or equal to the width of the promoted
expression (6.5.7)." from
https://www.securecoding.cert.org/confluence/display/c/CC.+Undefined+Behavior#CC.UndefinedBehavior-ub_51
The exact place in C++14 and or latest C standards escape me right
now, but the thesis of this UB stands correct I think...
what is sizeof(long) on your target?