[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#523655: gcc-4.3: error: unrecognizable insn on alpha using -O3 and -std=c99



Package: gcc-4.3
Version: 4.3.3-5

Hi,

r-base is failing to build on alpha with the following error:
gcc     -I. -I../../src/include -I../../src/include  -DHAVE_CONFIG_H  -mieee-with-inexact -fpic  -std=gnu99 -O3 -pipe  -g -c deriv.c -o deriv.o
deriv.c: In function 'simplify':
deriv.c:267: error: unrecognizable insn:
(insn 2103 64 65 9 ../../src/include/Rinlinedfuns.h:86 (set (reg:DI 2 $2)
        (const:DI (plus:DI (label_ref:DI 68)
                (const_int 24 [0x18])))) -1 (insn_list:REG_LABEL_OPERAND 68 (nil)))
deriv.c:267: internal compiler error: in extract_insn, at recog.c:2001
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.3/README.Bugs> for instructions.
make[4]: *** [deriv.o] Error 1


I've attached a reduced test case that gives a simular error message:
$ gcc-4.3 -std=c99 -O3 -c deriv.i -o deriv.o
deriv.i: In function 'D':
deriv.i:117: error: unrecognizable insn:
(insn 383 189 190 26 deriv.i:42 (set (reg:DI 2 $2)
        (const:DI (plus:DI (label_ref:DI 193)
                (const_int 24 [0x18])))) -1 (insn_list:REG_LABEL_OPERAND 193 (nil)))
deriv.i:117: internal compiler error: in extract_insn, at recog.c:2001
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.3/README.Bugs> for instructions.

Note that the error goes away if you do not use -std=gnu99 or -std=c99,
and -O3.

It compiles with gcc-4.1 and 4.2.


Kurt

typedef int R_len_t;
typedef unsigned int SEXPTYPE;
struct sxpinfo_struct {
    SEXPTYPE type : 5;

};

struct vecsxp_struct {
    R_len_t length;
    R_len_t truelength;
};

struct listsxp_struct {
    struct SEXPREC *carval;
    struct SEXPREC *cdrval;
    struct SEXPREC *tagval;
};

typedef struct SEXPREC {
    struct sxpinfo_struct sxpinfo;
    union {
 struct listsxp_struct listsxp;
    } u;
} SEXPREC, *SEXP;

typedef struct VECTOR_SEXPREC {
    struct vecsxp_struct vecsxp;
} VECTOR_SEXPREC, *VECSEXP;

typedef union { VECTOR_SEXPREC s; double align; } SEXPREC_ALIGN;

extern SEXP R_NilValue;
extern SEXP R_MissingArg;

int Rf_envlength(SEXP rho);
SEXP Rf_protect(SEXP);
const char * Rf_translateChar(SEXP);

inline R_len_t Rf_length(SEXP s)
{
    int i;
    switch (((s)->sxpinfo.type)) {
    case 0:
 return 0;
    case 24:
 return (((VECSEXP) (s))->vecsxp.length);
    case 6:
    case 17:
 i = 0;
 while (s != ((void *)0) && s != R_NilValue) {
     i++;
     s = ((s)->u.listsxp.cdrval);
 }
 return i;
    case 4:
 return Rf_envlength(s);
    default:
 return 1;
    }
}

inline SEXP Rf_lang3(SEXP s, SEXP t, SEXP u)
{
    return s;
}

typedef SEXP (*CCODE)(SEXP, SEXP, SEXP, SEXP);

static SEXP PlusSymbol;
static SEXP MinusSymbol;
static SEXP DivideSymbol;

int isZero(SEXP s);
SEXP PP(SEXP s);
SEXP AddParens(SEXP expr);
SEXP Rf_install();

static int isUminus(SEXP s)
{
    if (((s)->sxpinfo.type) == 6 && ((s)->u.listsxp.carval) == MinusSymbol) {
 switch(Rf_length(s)) {
 case 2:
     return 1;
 case 3:
     if (((((((s)->u.listsxp.cdrval))->u.listsxp.cdrval))->u.listsxp.carval) == R_MissingArg)
  return 1;
     else return 0;
 }
    }
    else return 0;
}

static SEXP simplify(SEXP fun, SEXP arg1, SEXP arg2)
{
    SEXP ans;
    if (fun == PlusSymbol) {
 if (isZero(arg1))
     ans = arg2;
 else if (isUminus(arg1))
     ans = simplify(MinusSymbol, arg2, ((((arg1)->u.listsxp.cdrval))->u.listsxp.carval));
 else if (isUminus(arg2))
     ans = simplify(MinusSymbol, arg1, ((((arg2)->u.listsxp.cdrval))->u.listsxp.carval));
    }
    else if (fun == DivideSymbol) {
  ans = Rf_lang3(DivideSymbol, arg1, arg2);
    }

    return ans;
}


static SEXP D(SEXP expr, SEXP var)
{
  return simplify(PlusSymbol,
          PP(D(((((expr)->u.listsxp.cdrval))->u.listsxp.carval), var)),
          PP(D(((((((expr)->u.listsxp.cdrval))->u.listsxp.cdrval))->u.listsxp.carval), var)));
}

SEXP __attribute__ ((visibility ("hidden"))) do_D(SEXP call, SEXP op, SEXP args, SEXP env)
{
    SEXP expr, var;
    var = Rf_install();
    expr = ((args)->u.listsxp.carval);
    Rf_protect(expr = D(expr, var));
    expr = AddParens(expr);
    return expr;
}


Reply to: