aboutsummaryrefslogtreecommitdiff
path: root/gcc/lower-subreg.c
diff options
context:
space:
mode:
authorUros Bizjak <uros@gcc.gnu.org>2010-10-30 21:55:16 +0200
committerUros Bizjak <uros@gcc.gnu.org>2010-10-30 21:55:16 +0200
commit695ae295781d5729f9ce3966fe4f1a174434c4b5 (patch)
tree3c0df87ef6fdf3860a9beacb71a59a811d649b15 /gcc/lower-subreg.c
parent1607a827d12cbb937bf8e7aa4898ff04205cd263 (diff)
downloadgcc-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.c12
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. */