]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/44569 (ICE in simplify_subreg for debug insn with CONCATN)
authorUros Bizjak <ubizjak@gmail.com>
Sat, 30 Oct 2010 20:55:03 +0000 (22:55 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Sat, 30 Oct 2010 20:55:03 +0000 (22:55 +0200)
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

gcc/ChangeLog
gcc/lower-subreg.c

index 6b5b2d9b419580587a2501b881ac2faef00b43cd..2ade93195a72d97f2f765107dabc3676da9cc765 100644 (file)
@@ -1,3 +1,9 @@
+2010-10-30  Uros Bizjak  <ubizjak@gmail.com>
+
+       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  <ubizjak@gmail.com>
 
        PR target/45946
index fa3a2c87a985a2a9cb1e625b89b94555db9f6d05..d363384064462bf7dbaa789741d70c9c73e68ab6 100644 (file)
@@ -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.  */