From: Uros Bizjak Date: Tue, 14 Apr 2009 10:31:29 +0000 (+0200) Subject: backport: re PR target/39740 (unrecognizable insn on alpha using -O3 and -std=c99) X-Git-Tag: releases/gcc-4.3.4~224 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3aa7b9cd737a249a12d21f139b01a89f1136b345;p=thirdparty%2Fgcc.git backport: re PR target/39740 (unrecognizable insn on alpha using -O3 and -std=c99) Backport from mainline: 2009-04-12 Uros Bizjak PR target/39740 * config/alpha/predicates.md (local_symbolic_operand): Return 1 for offseted label references. testsuite/ChangeLog: Backport from mainline: 2009-04-12 Uros Bizjak PR target/39740 * gcc.target/alpha/pr39740.c: New test. From-SVN: r146030 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f0a010630c6..1020d576ac45 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-04-14 Uros Bizjak + + Backport from mainline: + 2009-04-12 Uros Bizjak + + PR target/39740 + * config/alpha/predicates.md (local_symbolic_operand): Return 1 for + offseted label references. + 2009-04-07 Alan Modra PR target/39634 @@ -5,7 +14,7 @@ rs6000/t-linux64. 2009-04-02 David Ayers - + PR objc/27377 * c-typeck.c (build_conditional_expr): Emit ObjC warnings by calling objc_compare_types and surpress warnings about diff --git a/gcc/config/alpha/predicates.md b/gcc/config/alpha/predicates.md index 57e5f3a22663..e8379e73dc06 100644 --- a/gcc/config/alpha/predicates.md +++ b/gcc/config/alpha/predicates.md @@ -324,14 +324,14 @@ (define_predicate "local_symbolic_operand" (match_code "label_ref,const,symbol_ref") { - if (GET_CODE (op) == LABEL_REF) - return 1; - if (GET_CODE (op) == CONST && GET_CODE (XEXP (op, 0)) == PLUS && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT) op = XEXP (XEXP (op, 0), 0); + if (GET_CODE (op) == LABEL_REF) + return 1; + if (GET_CODE (op) != SYMBOL_REF) return 0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f791425ec862..95ecf7f50a09 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2009-04-14 Uros Bizjak + + Backport from mainline: + 2009-04-12 Uros Bizjak + + PR target/39740 + * gcc.target/alpha/pr39740.c: New test. + 2009-04-13 Jason Merrill PR c++/39480 diff --git a/gcc/testsuite/gcc.target/alpha/pr39740.c b/gcc/testsuite/gcc.target/alpha/pr39740.c new file mode 100644 index 000000000000..230beb7db5d2 --- /dev/null +++ b/gcc/testsuite/gcc.target/alpha/pr39740.c @@ -0,0 +1,162 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -std=c99 -mexplicit-relocs" } */ + +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 +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; +}