This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/30364] [4.1/4.2/4.3 Regression] Wrong variable ranges due to constant folding
- From: "pinskia at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 5 Jan 2007 20:32:38 -0000
- Subject: [Bug middle-end/30364] [4.1/4.2/4.3 Regression] Wrong variable ranges due to constant folding
- References: <bug-30364-7904@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #7 from pinskia at gcc dot gnu dot org 2007-01-05 20:32 -------
>From C99, 5.1.2.3/14:
14 EXAMPLE 6 To illustrate the grouping behavior of expressions, in the
following fragment
int a, b;
/* ... */
a = a + 32760 + b + 5;
the expression statement behaves exactly the same as
a = (((a + 32760) + b) + 5);
due to the associativity and precedence of these operators. Thus, the result of
the sum (a + 32760) is
next added to b, and that result is then added to 5 which results in the value
assigned to a. On a machine in
which overflows produce an explicit trap and in which the range of values
representable by an int is
[−32768, +32767], the implementation cannot rewrite this expression as
a = ((a + b) + 32765);
since if the values for a and b were, respectively, −32754 and −15,
the sum a + b would produce a trap
while the original expression would not; nor can the expression be rewritten
either as
a = ((a + 32765) + b);
or
a = (a + (b + 32765));
since the values for a and b might have been, respectively, 4 and −8 or
−17 and 12. However, on a machine
in which overflow silently generates some value and where positive and negative
overflows cancel, the
above expression statement can be rewritten by the implementation in any of the
above ways because the
same result will occur.
That is most explict thing about overflow and groupping. In C, every
expression has an implicate parenthesises.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30364