From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10491 invoked by alias); 26 Oct 2004 18:52:27 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 10463 invoked by uid 48); 26 Oct 2004 18:52:26 -0000 Date: Tue, 26 Oct 2004 18:52:00 -0000 Message-ID: <20041026185226.10462.qmail@sourceware.org> From: "dennisc at harding dot ca" To: gcc-bugs@gcc.gnu.org In-Reply-To: <20040928193157.17717.dennisc@harding.ca> References: <20040928193157.17717.dennisc@harding.ca> Reply-To: gcc-bugzilla@gcc.gnu.org Subject: [Bug target/17717] SH4 internal compiler error: in emit_move_insn X-Bugzilla-Reason: CC X-SW-Source: 2004-10/txt/msg03216.txt.bz2 List-Id: ------- Additional Comments From dennisc at harding dot ca 2004-10-26 18:52 ------- I have found a patch for this problem that was proposed by DJ Delorie about a year ago. His posting in the mailing list is at http://gcc.gnu.org/ml/gcc-patches/2003-10/msg02277.html which I have copied below. * From: DJ Delorie * To: gcc-patches at gcc dot gnu dot org * Cc: dj at redhat dot com * Date: Fri, 24 Oct 2003 23:10:31 -0400 * Subject: [patch] sh-elf, -mrenesas, FUNCTION_VALUE This file: char bar(int); void foo (char *f, int i) { f[i] = bar(i); } Fails thusly: $ ./cc1 -quiet -mrenesas -O2 -m4 dj.c dj.c: In function `foo': dj.c:5: internal compiler error: in emit_move_insn, at expr.c:2792 The failure is due to bar()'s return value being mispromoted, leading to a (set (QI) (SI)). Proposed patch follows. Comments? 2003-10-24 DJ Delorie * config/sh/sh.h (FUNCTION_VALUE): Support renesas attribute. Index: config/sh/sh.h =================================================================== RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.h,v retrieving revision 1.225 diff -p -2 -r1.225 sh.h *** config/sh/sh.h 13 Oct 2003 21:16:32 -0000 1.225 --- config/sh/sh.h 25 Oct 2003 02:35:39 -0000 *************** extern enum reg_class reg_class_from_let *** 1634,1646 **** #define FUNCTION_VALUE(VALTYPE, FUNC) \ gen_rtx (REG, \ ! ((GET_MODE_CLASS (TYPE_MODE (VALTYPE)) == MODE_INT \ ! && GET_MODE_SIZE (TYPE_MODE (VALTYPE)) < UNITS_PER_WORD \ ! && (TREE_CODE (VALTYPE) == INTEGER_TYPE \ ! || TREE_CODE (VALTYPE) == ENUMERAL_TYPE \ ! || TREE_CODE (VALTYPE) == BOOLEAN_TYPE \ ! || TREE_CODE (VALTYPE) == CHAR_TYPE \ ! || TREE_CODE (VALTYPE) == REAL_TYPE \ ! || TREE_CODE (VALTYPE) == OFFSET_TYPE)) \ ! ? (TARGET_SHMEDIA ? DImode : SImode) : TYPE_MODE (VALTYPE)), \ BASE_RETURN_VALUE_REG (TYPE_MODE (VALTYPE))) --- 1634,1648 ---- #define FUNCTION_VALUE(VALTYPE, FUNC) \ gen_rtx (REG, \ ! sh_attr_renesas_p (FUNC) \ ! ? TYPE_MODE (VALTYPE) \ ! : ((GET_MODE_CLASS (TYPE_MODE (VALTYPE)) == MODE_INT \ ! && GET_MODE_SIZE (TYPE_MODE (VALTYPE)) < UNITS_PER_WORD \ ! && (TREE_CODE (VALTYPE) == INTEGER_TYPE \ ! || TREE_CODE (VALTYPE) == ENUMERAL_TYPE \ ! || TREE_CODE (VALTYPE) == BOOLEAN_TYPE \ ! || TREE_CODE (VALTYPE) == CHAR_TYPE \ ! || TREE_CODE (VALTYPE) == REAL_TYPE \ ! || TREE_CODE (VALTYPE) == OFFSET_TYPE)) \ ! ? (TARGET_SHMEDIA ? DImode : SImode) : TYPE_MODE (VALTYPE)), \ BASE_RETURN_VALUE_REG (TYPE_MODE (VALTYPE))) I'm not really able to judge the nature of the patch, but I will test it as soon as I can get GCC version 3.4.2 to recognize the -mrenesas switch again. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17717