public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug rtl-optimization/48823] New: gcc-4.6.0 floating-point optimization regression on ia64-Linux
@ 2011-04-29 14:14 mariah.lenox at gmail dot com
  2011-05-02  9:21 ` [Bug rtl-optimization/48823] " jdemeyer at cage dot ugent.be
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: mariah.lenox at gmail dot com @ 2011-04-29 14:14 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48823

           Summary: gcc-4.6.0 floating-point optimization regression on
                    ia64-Linux
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: mariah.lenox@gmail.com


/* gcc-4.6.0 floating-point optimization regression on ia64-Linux

% gcc -O1 -o foo foo.c
% foo
g3  = 35f2349dc34f3df6
i[1]= 3ca1a62633145c07
i[2]= b92f1976b7ed8fbc
j[1]= 3ca4d57ee2b1013a
j[2]= b92618713a31d3e2
val = 35bfd0f99254c580
8.53973422267356774285
402114580b45d475
% 
%
% gcc -O2 -o foo foo.c
% foo
g3  = 35f2349dc34f3df6
i[1]= 3ca1a62633145c07
i[2]= b92f1976b7ed8fbc
j[1]= 3ca4d57ee2b1013a
j[2]= b92618713a31d3e2
val = 35bfd0f99254c590
8.53973422267356596649
402114580b45d474
**ERROR** QD_check failed at x[0]
%
%
% gcc-4.5.1 -O2 -o foo foo.c
% foo
g3  = 35f2349dc34f3df6
i[1]= 3ca1a62633145c07
i[2]= b92f1976b7ed8fbc
j[1]= 3ca4d57ee2b1013a
j[2]= b92618713a31d3e2
val = 35bfd0f99254c590
8.53973422267356774285
402114580b45d475
%

# note that this code compiles and runs successfully 
# with gcc-4.5.1 -03


% gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/gcc-4.6.0/ia64-Linux-gmp-5.0.1/libexec/gcc/ia64-unknown-linux-gnu/4.6.0/lto-wrapper
Target: ia64-unknown-linux-gnu
Configured with: /usr/local/gcc-4.6.0/src/gcc-4.6.0/configure
--enable-languages=c,c++,fortran --with-gnu-as
--with-as=/usr/local/binutils-2.21/ia64-Linux-rhel-gcc-4.5.1/bin/as
--with-gnu-ld
--with-ld=/usr/local/binutils-2.21/ia64-Linux-rhel-gcc-4.5.1/bin/ld
--with-gmp=/usr/local/gmp-5.0.1/ia64-Linux-rhel-gcc-4.5.0
--with-mpfr=/usr/local/mpfr-3.0.1/ia64-Linux-rhel-gmp-5.0.1-gcc-4.6.0
--with-mpc=/usr/local/mpc-0.9/ia64-Linux-rhel-gmp-5.0.1-mpfr-3.0.1-gcc-4.6.0
--prefix=/usr/local/gcc-4.6.0/ia64-Linux-gmp-5.0.1
Thread model: posix
gcc version 4.6.0 (GCC) 
%

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fpu_control.h>

double QD_e[4]={2.718281828459045091e+00,1.445646891729250158e-16,
                -2.127717108038176765e-33,1.515630159841218954e-49};
double QD_pi[4]=
{3.141592653589793116e+00,1.224646799147353207e-16,
 -2.994769809718339666e-33,1.112454220863365282e-49};

#define QD_qsum(a,b,s,e) {double z1; s=a+b; z1=s-a; e=b-z1;}
#define QD_sum(a,b,s,e)\
 {double bb,z1,z2; s=a+b; bb=s-a; z1=s-bb; z2=a-z1; z1=b-bb; e=z1+z2;}
#define QD_split(a,hi,lo)\
{double xt=134217729.0*a,z1; z1=xt-a; hi=xt-z1; lo=a-hi;}
#define QD_prod(a,b,p,e)\
{double ah,al,bh,bl,z1,z2,z3,z4; p=a*b; QD_split(a,ah,al); QD_split(b,bh,bl);\
 z1=ah*bh; z2=z1-p; z1=ah*bl; z3=al*bh; z4=z1+z3; z1=z2+z4; z3=al*bl; e=z1+z3;}


double QD_mul(double *i,double *j,double *o)
{
  double a0,a1,b1,b2,c1,c2,d2,d3,e2,e3,f2,f3;
  double g3,h1,h2,h3,k2,k3,l2,l3,m2,m3,n2,n3,p2,p3;
  double t1,t2,t3;
  double a2, a3,o0;
  double val;

  QD_prod(i[0],j[0],a0,a1); 
  QD_prod(i[0],j[1],b1,b2);
  QD_prod(i[1],j[0],c1,c2); 
  QD_prod(i[0],j[2],d2,d3);
  QD_prod(i[2],j[0],e2,e3); 
  QD_prod(i[1],j[1],f2,f3);
  g3=i[0]*j[3]+i[3]*j[0]; 
  QD_sum(a1,b1,t1,t2); 
  QD_sum(c1,t1,h1,t3); 
  QD_sum(t2,t3,h2,h3);
  QD_sum(b2,c2,k2,k3); 
  QD_sum(d2,e2,l2,l3); 
  QD_sum(f2,h2,m2,m3);
printf("g3  = %lx\n", g3); 
printf("i[1]= %lx\n", i[1]); 
printf("i[2]= %lx\n", i[2]); 
printf("j[1]= %lx\n", j[1]); 
printf("j[2]= %lx\n", j[2]); 
  g3+=(i[1]*j[2]+i[2]*j[1]); 
val = g3;  /* printing g3 here makes the bug disappear, so use return */
  QD_sum(k2,l2,n2,n3); 
  QD_sum(m2,n2,p2,p3);
  g3+=d3+e3+f3+h3+k3+l3+m3+n3+p3; 
  QD_qsum(p2,g3,a2,a3); 
  QD_qsum(h1,a2,b1,b2); 
  QD_qsum(a0,b1,o0,c1);
  o[0]=o0; 
  QD_qsum(c1,b2,o[1],d2); 
  QD_qsum(d2,a3,o[2],o[3]);
  return val;
}

void errorit(S) char *S; {printf("**ERROR** %s\n",S); exit(-1);}

int main()
{
  double x[4]; 
  double val;
  /* This fpu_control code should set the control
   word of the floating point processor to round to an 
   IEEE-754 double (53-bit mantissa, 64-bits in total), rather
   than the default extended precision

   However the bug also occurs if this fpu_control code is
   removed or commented out.
  */
  fpu_control_t fpu_control=0x027f; _FPU_SETCW(fpu_control);

  val = QD_mul(QD_pi,QD_e,x);
printf("val = %lx\n", val);
printf("%1.20f\n", x[0]);
printf("%lx\n", x[0]);
  if (x[0]!=8.53973422267356774285) errorit("QD_check failed at x[0]");
  if (x[1]!=-6.7738152905024242803e-16) errorit("QD_check failed at x[1]");
  if (x[2]!=1.6082340642907151632e-32) errorit("QD_check failed at x[2]");
  return 0;
}


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug rtl-optimization/48823] gcc-4.6.0 floating-point optimization regression on ia64-Linux
  2011-04-29 14:14 [Bug rtl-optimization/48823] New: gcc-4.6.0 floating-point optimization regression on ia64-Linux mariah.lenox at gmail dot com
@ 2011-05-02  9:21 ` jdemeyer at cage dot ugent.be
  2011-05-02  9:32 ` jdemeyer at cage dot ugent.be
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: jdemeyer at cage dot ugent.be @ 2011-05-02  9:21 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48823

--- Comment #2 from Jeroen Demeyer <jdemeyer at cage dot ugent.be> 2011-05-02 09:21:07 UTC ---
Created attachment 24161
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=24161
Testcase


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug rtl-optimization/48823] gcc-4.6.0 floating-point optimization regression on ia64-Linux
  2011-04-29 14:14 [Bug rtl-optimization/48823] New: gcc-4.6.0 floating-point optimization regression on ia64-Linux mariah.lenox at gmail dot com
  2011-05-02  9:21 ` [Bug rtl-optimization/48823] " jdemeyer at cage dot ugent.be
@ 2011-05-02  9:32 ` jdemeyer at cage dot ugent.be
  2011-10-13 17:58 ` sje at cup dot hp.com
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: jdemeyer at cage dot ugent.be @ 2011-05-02  9:32 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48823

Jeroen Demeyer <jdemeyer at cage dot ugent.be> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jdemeyer at cage dot
                   |                            |ugent.be

--- Comment #1 from Jeroen Demeyer <jdemeyer at cage dot ugent.be> 2011-05-02 09:20:23 UTC ---
Minimal code to demonstrate the problem in qd.i.  The problematic flag seems to
be -fexpensive-optimizations.

$ gcc qd.i -O1 -o qd && ./qd
0x1.114580b45d474p+3
$ gcc qd.i -O1 -fexpensive-optimizations -o qd && ./qd
0x1.114580b45d475p+3


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug rtl-optimization/48823] gcc-4.6.0 floating-point optimization regression on ia64-Linux
  2011-04-29 14:14 [Bug rtl-optimization/48823] New: gcc-4.6.0 floating-point optimization regression on ia64-Linux mariah.lenox at gmail dot com
  2011-05-02  9:21 ` [Bug rtl-optimization/48823] " jdemeyer at cage dot ugent.be
  2011-05-02  9:32 ` jdemeyer at cage dot ugent.be
@ 2011-10-13 17:58 ` sje at cup dot hp.com
  2011-10-13 20:05 ` jdemeyer at cage dot ugent.be
  2011-10-13 20:17 ` sje at cup dot hp.com
  4 siblings, 0 replies; 6+ messages in thread
From: sje at cup dot hp.com @ 2011-10-13 17:58 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48823

Steve Ellcey <sje at cup dot hp.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
                 CC|                            |sje at cup dot hp.com
         Resolution|                            |INVALID

--- Comment #3 from Steve Ellcey <sje at cup dot hp.com> 2011-10-13 17:57:50 UTC ---
The difference in results is due to the use of the fma instructions (fused
multiply add).  If you don't want the fma instructions to be used you should
use the -ffp-contract=on flag.  Otherwise GCC will use them and accept the
slightly different floating point results due to no rounding being done between
the multiply and the add in the fma instruction.  GCC will also do other
optimizations that may change the results of inexact floating point
instructions.

I am resolving this as invalid since this change in the least significant bit
of an inexact floating point value is reasonable without fp-contract being on.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug rtl-optimization/48823] gcc-4.6.0 floating-point optimization regression on ia64-Linux
  2011-04-29 14:14 [Bug rtl-optimization/48823] New: gcc-4.6.0 floating-point optimization regression on ia64-Linux mariah.lenox at gmail dot com
                   ` (2 preceding siblings ...)
  2011-10-13 17:58 ` sje at cup dot hp.com
@ 2011-10-13 20:05 ` jdemeyer at cage dot ugent.be
  2011-10-13 20:17 ` sje at cup dot hp.com
  4 siblings, 0 replies; 6+ messages in thread
From: jdemeyer at cage dot ugent.be @ 2011-10-13 20:05 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48823

--- Comment #4 from Jeroen Demeyer <jdemeyer at cage dot ugent.be> 2011-10-13 20:05:21 UTC ---
(In reply to comment #3)
> The difference in results is due to the use of the fma instructions (fused
> multiply add).  If you don't want the fma instructions to be used you should
> use the -ffp-contract=on flag.

Thanks for the reply, I understand your reasoning.  However, will this option
guarantee strict IEEE floating-point behaviour or are there other flags to be
specified?  I have always been under the impression that *by default* gcc
produced code respecting the floating-point standard unless one specifies
something like -ffast-math.  It seems this has changed in recent GCC versions.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug rtl-optimization/48823] gcc-4.6.0 floating-point optimization regression on ia64-Linux
  2011-04-29 14:14 [Bug rtl-optimization/48823] New: gcc-4.6.0 floating-point optimization regression on ia64-Linux mariah.lenox at gmail dot com
                   ` (3 preceding siblings ...)
  2011-10-13 20:05 ` jdemeyer at cage dot ugent.be
@ 2011-10-13 20:17 ` sje at cup dot hp.com
  4 siblings, 0 replies; 6+ messages in thread
From: sje at cup dot hp.com @ 2011-10-13 20:17 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48823

--- Comment #5 from Steve Ellcey <sje at cup dot hp.com> 2011-10-13 20:16:46 UTC ---
I am not sure any set of flags will guarantee strict IEEE floating point
behavior.  See PR37845 for some more information.


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2011-10-13 20:17 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-29 14:14 [Bug rtl-optimization/48823] New: gcc-4.6.0 floating-point optimization regression on ia64-Linux mariah.lenox at gmail dot com
2011-05-02  9:21 ` [Bug rtl-optimization/48823] " jdemeyer at cage dot ugent.be
2011-05-02  9:32 ` jdemeyer at cage dot ugent.be
2011-10-13 17:58 ` sje at cup dot hp.com
2011-10-13 20:05 ` jdemeyer at cage dot ugent.be
2011-10-13 20:17 ` sje at cup dot hp.com

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).