From: Bernd Schmidt Date: Fri, 6 Apr 2001 11:37:52 +0000 (+0000) Subject: Fix a problem with complex numbers on rs6000. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=71687454eb38f2303b5e51b38e3931bf395ec646;p=thirdparty%2Fgcc.git Fix a problem with complex numbers on rs6000. From-SVN: r41151 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cf9174ea0e5a..94272ff9502a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2001-04-06 Bernd Schmidt + + Thu Oct 28 10:20:02 1999 Geoffrey Keating + * config/rs6000/rs6000.md (movsf): Don't convert a SUBREG + of the function return register into a plain REG until + after function inlining is done. + 2001-04-04 Bernd Schmidt Fri Nov 5 10:07:25 1999 Nick Clifton diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 23a9715f9be9..343171de739c 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -6184,7 +6184,9 @@ reg. So expand it. */ if (GET_CODE (operands[0]) == SUBREG && GET_CODE (SUBREG_REG (operands[0])) == REG - && REGNO (SUBREG_REG (operands[0])) < FIRST_PSEUDO_REGISTER) + && REGNO (SUBREG_REG (operands[0])) < FIRST_PSEUDO_REGISTER + && (! REG_FUNCTION_VALUE_P (SUBREG_REG (operands[0])) + || ! rtx_equal_function_value_matters)) operands[0] = alter_subreg (operands[0]); if (GET_CODE (operands[1]) == SUBREG && GET_CODE (SUBREG_REG (operands[1])) == REG diff --git a/gcc/cse.c b/gcc/cse.c index ca40ab36e418..ff4d00f326e9 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -695,8 +695,6 @@ static void check_fold_consts PROTO((PTR)); static struct cse_reg_info* get_cse_reg_info PROTO((int)); static void free_cse_reg_info PROTO((splay_tree_value)); static void flush_hash_table PROTO((void)); - -extern int rtx_equal_function_value_matters; /* Dump the expressions in the equivalence class indicated by CLASSP. This function is used only for debugging. */ diff --git a/gcc/rtl.h b/gcc/rtl.h index efbf588d7691..754228f6d5d1 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -888,6 +888,12 @@ extern char *note_insn_name[]; /* For a NOTE_INSN_LIVE note, the original basic block number. */ #define RANGE_LIVE_ORIG_BLOCK(INSN) (XINT (INSN, 1)) +/* Nonzero if we need to distinguish between the return value of this function + and the return value of a function called by this function. This helps + integrate.c. + This is 1 until after the rtl generation pass. */ +extern int rtx_equal_function_value_matters; + /* Generally useful functions. */ /* The following functions accept a wide integer argument. Rather than diff --git a/gcc/toplev.c b/gcc/toplev.c index 5f8913fa3e58..a575dc6b6b8c 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -137,8 +137,6 @@ You Lose! You must define PREFERRED_DEBUGGING_TYPE! #define DIR_SEPARATOR '/' #endif -extern int rtx_equal_function_value_matters; - #if ! (defined (VMS) || defined (OS2)) extern char **environ; #endif