c/8002: Alpha: internal compiler error: in trunc_int_for_mode, at explow.c:54

Falk Hueffner falk.hueffner@student.uni-tuebingen.de
Sun Sep 22 10:09:00 GMT 2002


>Number:         8002
>Category:       c
>Synopsis:       internal compiler error: in trunc_int_for_mode, at explow.c:54 (Alpha)
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          ice-on-legal-code
>Submitter-Id:   net
>Arrival-Date:   Sun Sep 22 09:56:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator:     Falk Hueffner
>Release:        3.3 20020922 (experimental)
>Organization:
>Environment:
System: Linux juist 2.4.18-4.2nhd #1 Sat Jun 15 21:17:26 MDT 2002 alpha unknown unknown GNU/Linux
Architecture: alpha

	
host: alphaev68-unknown-linux-gnu
build: alphaev68-unknown-linux-gnu
target: alphaev68-unknown-linux-gnu
configured with: ../configure --enable-languages=c
>Description:
gcc from CVS 20020922 fails to compile
sysdeps/ieee754/flt-32/s_expm1f.c from glibc when optimizing. I've
attached a preprocessed, trimmed-down version. The problem is not
present in gcc 3.2.
>How-To-Repeat:
% gcc-3.2 -c -O3 foo.i # works
% gcc -c foo.i # works
% gcc -c -O1 foo.i
foo.i: In function `__expm1f':
foo.i:122: internal compiler error: in trunc_int_for_mode, at explow.c:54
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://www.gnu.org/software/gcc/bugs.html> for instructions.
% cat foo.i
typedef int int32_t __attribute__ ((__mode__ (__SI__)));
typedef unsigned int u_int32_t __attribute__ ((__mode__ (__SI__)));

typedef union
{
  double value;
  struct
  {
    u_int32_t lsw;
    u_int32_t msw;
  } parts;
} ieee_double_shape_type;
typedef union
{
  float value;
  u_int32_t word;
} ieee_float_shape_type;

static const volatile float huge = 1.0e+30, tiny = 1.0e-30;

static const float
one = 1.0,
o_threshold = 8.8721679688e+01,
ln2_hi = 6.9313812256e-01,
ln2_lo = 9.0580006145e-06,
invln2 = 1.4426950216e+00,

Q1 = -3.3333335072e-02,
Q2 = 1.5873016091e-03,
Q3 = -7.9365076090e-05,
Q4 = 4.0082177293e-06,
Q5 = -2.0109921195e-07;


float __expm1f(float x)
{
        float y,hi,lo,c,t,e,hxs,hfx,r1;
        int32_t k,xsb;
        u_int32_t hx;

        do { ieee_float_shape_type gf_u; gf_u.value = (x); (hx) = gf_u.word; } while (0);
        xsb = hx&0x80000000;
        if(xsb==0) y=x; else y= -x;
        hx &= 0x7fffffff;


        if(hx >= 0x4195b844) {
            if(hx >= 0x42b17218) {
                if(hx>0x7f800000)
                    return x+x;
                if(hx==0x7f800000)
                    return (xsb==0)? x:-1.0;
                if(x > o_threshold) return huge*huge;
            }
            if(xsb!=0) {
                if(x+tiny<(float)0.0)
                return tiny-one;
            }
        }


        if(hx > 0x3eb17218) {
            if(hx < 0x3F851592) {
                if(xsb==0)
                    {hi = x - ln2_hi; lo = ln2_lo; k = 1;}
                else
                    {hi = x + ln2_hi; lo = -ln2_lo; k = -1;}
            } else {
                k = invln2*x+((xsb==0)?(float)0.5:(float)-0.5);
                t = k;
                hi = x - t*ln2_hi;
                lo = t*ln2_lo;
            }
            x = hi - lo;
            c = (hi-x)-lo;
        }
        else if(hx < 0x33000000) {
            t = huge+x;
            return x - (t-(huge+x));
        }
        else k = 0;


        hfx = (float)0.5*x;
        hxs = x*hfx;
        r1 = one+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5))));
        t = (float)3.0-r1*hfx;
        e = hxs*((r1-t)/((float)6.0 - x*t));
        if(k==0) return x - (x*e-hxs);
        else {
            e = (x*(e-c)-c);
            e -= hxs;
            if(k== -1) return (float)0.5*(x-e)-(float)0.5;
            if(k==1) {
                if(x < (float)-0.25) return -(float)2.0*(e-(x+(float)0.5));
                else return one+(float)2.0*(x-e);
            }
            if (k <= -2 || k>56) {
                int32_t i;
                y = one-(e-x);
                do { ieee_float_shape_type gf_u; gf_u.value = (y); (i) = gf_u.word; } while (0);
                do { ieee_float_shape_type sf_u; sf_u.word = (i+(k<<23)); (y) = sf_u.value; } while (0);
                return y-one;
            }
            t = one;
            if(k<23) {
                int32_t i;
                do { ieee_float_shape_type sf_u; sf_u.word = (0x3f800000 - (0x1000000>>k)); (t) = sf_u.value; } while (0);
                y = t-(e-x);
                do { ieee_float_shape_type gf_u; gf_u.value = (y); (i) = gf_u.word; } while (0);
                do { ieee_float_shape_type sf_u; sf_u.word = (i+(k<<23)); (y) = sf_u.value; } while (0);
           } else {
                int32_t i;
                do { ieee_float_shape_type sf_u; sf_u.word = (((0x7f-k)<<23)); (t) = sf_u.value; } while (0);
                y = x-(e+t);
                y += one;
                do { ieee_float_shape_type gf_u; gf_u.value = (y); (i) = gf_u.word; } while (0);
                do { ieee_float_shape_type sf_u; sf_u.word = (i+(k<<23)); (y) = sf_u.value; } while (0);
            }
        }
        return y;
}
>Fix:
	
>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the Gcc-bugs mailing list