From: Uros Bizjak Date: Sat, 30 Oct 2010 20:55:03 +0000 (+0200) Subject: re PR middle-end/44569 (ICE in simplify_subreg for debug insn with CONCATN) X-Git-Tag: releases/gcc-4.3.6~298 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eb5c7d79a36a155dce0d866488f52d7d83a9c4d0;p=thirdparty%2Fgcc.git re PR middle-end/44569 (ICE in simplify_subreg for debug insn with CONCATN) PR middle-end/44569 * lower-suberg.c (simplify_subreg_concatn): For VOIDmode elements, determine the mode of a subreg by GET_MODE_INNER of CONCATN RTX. From-SVN: r166096 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6b5b2d9b4195..2ade93195a72 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-10-30 Uros Bizjak + + PR middle-end/44569 + * lower-suberg.c (simplify_subreg_concatn): For VOIDmode elements, + determine the mode of a subreg by GET_MODE_INNER of CONCATN RTX. + 2010-10-22 Uros Bizjak PR target/45946 diff --git a/gcc/lower-subreg.c b/gcc/lower-subreg.c index fa3a2c87a985..d36338406446 100644 --- a/gcc/lower-subreg.c +++ b/gcc/lower-subreg.c @@ -390,7 +390,7 @@ simplify_subreg_concatn (enum machine_mode outermode, rtx op, unsigned int byte) { unsigned int inner_size; - enum machine_mode innermode; + enum machine_mode innermode, partmode; rtx part; unsigned int final_offset; @@ -403,11 +403,19 @@ simplify_subreg_concatn (enum machine_mode outermode, rtx op, inner_size = GET_MODE_SIZE (innermode) / XVECLEN (op, 0); part = XVECEXP (op, 0, byte / inner_size); + partmode = GET_MODE (part); + + if (partmode == VOIDmode) + { + gcc_assert (VECTOR_MODE_P (innermode)); + partmode = GET_MODE_INNER (innermode); + } + final_offset = byte % inner_size; if (final_offset + GET_MODE_SIZE (outermode) > inner_size) return NULL_RTX; - return simplify_gen_subreg (outermode, part, GET_MODE (part), final_offset); + return simplify_gen_subreg (outermode, part, partmode, final_offset); } /* Wrapper around simplify_gen_subreg which handles CONCATN. */