This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/33296] nearest(huge(1.0),1.0) gives an error
- From: "fxcoudert at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 11 Sep 2007 09:55:33 -0000
- Subject: [Bug fortran/33296] nearest(huge(1.0),1.0) gives an error
- References: <bug-33296-12313@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #7 from fxcoudert at gcc dot gnu dot org 2007-09-11 09:55 -------
(In reply to comment #6)
> Why? more precisely what are the rules behind this yes?
Short answer: the statements are treated independently in the front-end.
When the front-end sees: "nearest(huge(1.0),1.0)", it parses the expression and
then tries to simplify it. huge(1.0) will be replaced by its value, and the
"nearest(xxxxxxx,1.0)" is simplified. (At that point, the front-end detects the
overflow and errors out.)
Normally, the inter-statement optimization is to be done by the middle-end. You
will find that the following code:
x = 2.
x = sqrt(x)
you will find that sqrt() is calculated at runtime for -O0, while the two
statements are simplified (and sqrt(2.) is precomputed at compile-time) at -O1.
For NEAREST, the middle-end doesn't perform the simplification because instead
of translating the Fortran statement into C99 functions directly, we use call
the libgfortran function gfortran_nearest_r4(), which the middle-end doesn't
know and can't optimized away. (Doing so is a missed optimization, now filed as
PR33387.)
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33296