diff options
author | Uros Bizjak <uros@gcc.gnu.org> | 2010-10-30 21:55:16 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2010-10-30 21:55:16 +0200 |
commit | 695ae295781d5729f9ce3966fe4f1a174434c4b5 (patch) | |
tree | 3c0df87ef6fdf3860a9beacb71a59a811d649b15 /gcc/lower-subreg.c | |
parent | 1607a827d12cbb937bf8e7aa4898ff04205cd263 (diff) | |
download | gcc-695ae295781d5729f9ce3966fe4f1a174434c4b5.zip gcc-695ae295781d5729f9ce3966fe4f1a174434c4b5.tar.gz gcc-695ae295781d5729f9ce3966fe4f1a174434c4b5.tar.bz2 |
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: r166092
Diffstat (limited to 'gcc/lower-subreg.c')
-rw-r--r-- | gcc/lower-subreg.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/lower-subreg.c b/gcc/lower-subreg.c index 71729af..1c4e9ad 100644 --- a/gcc/lower-subreg.c +++ b/gcc/lower-subreg.c @@ -396,7 +396,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; @@ -409,11 +409,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. */ |