This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Where does the C standard describe overflow of signedintegers?
- From: Paul Schlie <schlie at comcast dot net>
- To: Georg Bauhaus <bauhaus at futureapps dot de>
- Cc: Robert Dewar <dewar at adacore dot com>,<gcc at gcc dot gnu dot org>
- Date: Fri, 15 Jul 2005 11:03:26 -0400
- Subject: Re: Where does the C standard describe overflow of signedintegers?
> From: Georg Bauhaus <bauhaus@futureapps.de>
>> Paul Schlie wrote:
>>> From: Robert Dewar <dewar@adacore.com>
>>>> Paul Schlie wrote:
>>>> I don't contest that it may, I simply don't believe it should.
>>> you can't seriously mean that with respect to uninitialized
>>> variables. this would mean you could not put local variables in
>>> registers. the effect on code quality woul be awful!
>> Why would anyone care about the performance of an access to an
>> un-initialized variable? [..] although do
>> see substantial value in producing compiled code which is strictly
>> consistent with the specified program and native target behavior,
>> regardless of its portability.
>
> You can have both, correctness and uninitialised local
> variables. For an impression of the difference in performance,
> and for a way to ensure correctness, I tried this
> (switch register/volatile in the declaration lines in comp
> and r to see the effects).
- which predominantly illustrates the effect of volatile semantics?
int x, y, z;
(vs.)
int x=1, y=2, z=3;
would illustrate the effect of potentially uninitialised local variables,
along with the accesses specified to the uninitialised elements of buffer.
in that circumstance, what optimizations would you advocate as beneficial?
> #include <stddef.h>
> #include <assert.h>
>
> #define BUFFER_SIZE 1000 // must be > 0
> #define ITERATIONS 100000 // must be > 0
>
> static inline int comp(const short, const short, const short);
>
> /* pre: a has elements, that is hi > 0. Frequently called */
> int r(short a[], size_t hi)
> {
> //register int x, y, z;
> volatile int x=1, y=2, z=3;
>
> assert(hi > 0);
>
> for (size_t c=0; c < hi + 2; ++c) {
> if (a[c]) {
> jfssoae:
> x = c + 3, y = z = a[c];
> if (comp(x, y, z)) z = x - y;
> }
> }
> return x + y + z;
> }
>
> static inline int comp(const short x, const short y, const short z)
> {
> //register int result = (x + y) == (x + z);
> volatile int result = (x + y) == (x + z);
> return result;
> }
>
> int main()
> {
> short buffer[BUFFER_SIZE];
> int result;
>
> assert(ITERATIONS > 0);
>
> for (int runs = 0; runs < ITERATIONS; ++runs) {
> result = r(buffer, BUFFER_SIZE);
> }
> return result;
> }
>