/* The program doesn't terminate with -O2 but works with no optimization on
double Datatype */

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/time.h>
#include<unistd.h>

#define STRMAX 1000

#ifdef FLOAT
#define FTYPE(function) function##_f
#define DTYPE float
#define SIZE 4
#endif

#ifdef DOUBLE
#define FTYPE(function) function##_d
#define DTYPE double
#define SIZE 8
#endif

#ifdef EXTENDED
#define FTYPE(function) function##_e
#define DTYPE long double
#define SIZE 16
#endif

void FTYPE(LEAST_SQUARE_QR)(DTYPE *A, DTYPE *x, DTYPE *b, int ZA, int SA)
{
 DTYPE *R, *Qinvb;
 int i,j,k,l;
 DTYPE *ai,an,e,*b1;

 R=(DTYPE *)malloc(ZA*SA*SIZE);
 Qinvb=(DTYPE *)malloc(ZA*SIZE);
 ai=(DTYPE *)malloc(ZA*SIZE);
 b1=(DTYPE *)malloc(ZA*SIZE);

 FTYPE(COPY)(A,R,ZA*SA);
 FTYPE(COPY)(b,Qinvb,ZA);

 i=0;

 for(j=0;j<i;j++)
 {
  *(ai+j)=0.0;
 }
 an=0.0;
 for(j=i;j<ZA;j++)
 {
  *(ai+j)=*(R+j*SA+i);
  an+=*(ai+j) * *(ai+j);
 }
 an=FTYPE(SQUARE_ROOT)(an);

 if(*(ai+i)>0)
 {
  *(ai+i)+=an;
 }
 else
 {
  *(ai+i)-=an;
 }

 an=0.0;
 for(j=i;j<ZA;j++)
 {
  an+= *(ai+j) * *(ai+j);
 }

 an=FTYPE(SQUARE_ROOT)(an);
 an=1.0/an;
for(j=i;j<ZA;j++)
 {
  *(ai+j)=*(ai+j)*an;
 }

 for(l=0;l<SA;l++)
 {
  for(k=0;k<ZA;k++)
  {
   *(b1+k)=0.0;
    for(j=0;j<k;j++)
    {
     e= -2.0* *(ai+j) * *(ai+k);
     *(b1+k)+=e * *(R+j*SA+l);
    }
    e=1.0 - 2.0* *(ai+j) * *(ai+k);
    *(b1+k)+=e * *(R+j*SA+l);
    for(j=k+1;j<ZA;j++)
    {
     e= -2.0* *(ai+j) * *(ai+k);
     *(b1+k)+=e * *(R+j*SA+l);
    }
  }

  for(k=0;k<ZA;k++)
  {
   *(R+k*SA+l)=*(b1+k);
  }
 }

 for(k=1;k<ZA;k++)
 {
  *(R+k*SA)=0.0;
 }

 for(k=0;k<ZA;k++)
 {
  *(b1+k)=0.0;
 }

 for(k=0;k<ZA;k++)
 {
   for(j=0;j<k;j++)
   {
    e = -2.0* *(ai+j) * *(ai+k);
    *(b1+k) +=e * *(Qinvb+j);
   }
   e=1.0 - 2.0* *(ai+j) * *(ai+k);
   *(b1+k)+=e * *(Qinvb+j);
   for(j=k+1;j<ZA;j++)
   {
    e= -2.0* *(ai+j) * *(ai+k);
    *(b1+k)+=e * *(Qinvb+j);
   }
 }
 for(k=0;k<ZA;k++)
 {
  *(Qinvb+k)=*(b1+k);
 }



for(i=1;i<SA;i++)
{
 for(j=0;j<i;j++)
 {
  *(ai+j)=0.0;
 }
 an=0.0;
 for(j=i;j<ZA;j++)
 {
  *(ai+j)=*(R+j*SA+i);
  an+=*(ai+j) * *(ai+j);
 }
 an=FTYPE(SQUARE_ROOT)(an);

 if(*(ai+i)>0)
 {
  *(ai+i)+=an;
 }
 else
 {
  *(ai+i)-=an;
 }




 an=0.0;
 for(j=i;j<ZA;j++)
 {
  an+= *(ai+j) * *(ai+j);
 }

 an=FTYPE(SQUARE_ROOT)(an);
 an=1.0/an;

 for(j=i;j<ZA;j++)
 {
  *(ai+j)=*(ai+j)*an;
 }

 for(l=i;l<SA;l++)
 {
  for(k=0;k<ZA;k++)
  {
   *(b1+k)=0.0;
   for(j=0;j<k;j++)
   {
    e= -2.0* *(ai+j) * *(ai+k);
    *(b1+k)+=e * *(R+j*SA+l);
   }
   e=1.0 - 2.0* *(ai+j) * *(ai+k);
   *(b1+k)+=e * *(R+j*SA+l);
   for(j=k+1;j<ZA;j++)
   {
    e= -2.0* *(ai+j) * *(ai+k);
    *(b1+k)+=e * *(R+j*SA+l);
   }
  }
  for(k=0;k<ZA;k++)
  {
   *(R+k*SA+l)=*(b1+k);
  }
 }


  for(k=0;k<ZA;k++)
  {
   *(b1+k)=0.0;
   for(j=0;j<k;j++)
   {
    e= -2.0* *(ai+j) * *(ai+k);
    *(b1+k)+=e * *(Qinvb+j);
   }
   e=1.0 - 2.0* *(ai+j) * *(ai+k);
   *(b1+k)+=e * *(Qinvb+j);
   for(j=k+1;j<ZA;j++)
   {
    e= -2.0* *(ai+j) * *(ai+k);
    *(b1+k)+=e * *(Qinvb+j);
   }
  }
  for(k=0;k<ZA;k++)
  {
   *(Qinvb+k)=*(b1+k);
  }

 for(k=i+1;k<ZA;k++)
 {
  *(R+k*SA+i)=0.0;
 }
}

for(i=SA;i>=1;i--)
{
 *(x+i-1)=*(Qinvb+i-1);
 for(j=i+1;j<=SA;j++)
 {
  *(x+i-1)-= *(x+j-1) * *(R+SA*(i-1)+j-1);
 }
 *(x+i-1)=*(x+i-1)/ *(R+SA*(i-1)+i-1);
}

free(b1);
free(R);
free(Qinvb);
free(ai);
return;
}


-- 
           Summary: Optimizer -O2 doesn't work on linear algebra code on
                    double data type
           Product: gcc
           Version: 4.3.2
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: rbenedik at fsmat dot htu dot tuwien dot ac dot at
 GCC build triplet: gcc-Version 4.3.2 20081105 (Red Hat 4.3.2-7) (GCC)
  GCC host triplet: x86_64-redhat-linux - Fedora 10.0
GCC target triplet: x86_64-redhat-linux


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

Reply via email to