rtl.h (subreg_info): Expand commentary
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 22 Sep 2014 07:36:51 +0000 (07:36 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 22 Sep 2014 07:36:51 +0000 (07:36 +0000)
gcc/
* rtl.h (subreg_info): Expand commentary
* rtlanal.c (subreg_get_info): Likewise.

From-SVN: r215447

gcc/ChangeLog
gcc/rtl.h
gcc/rtlanal.c

index 3420fb034558c704f9addd99dcc29c751e5f9f12..9227427c161bf9e05ec10a0f089d26635d962ace 100644 (file)
@@ -1,3 +1,8 @@
+2014-09-22  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * rtl.h (subreg_info): Expand commentary
+       * rtlanal.c (subreg_get_info): Likewise.
+
 2014-09-22  Richard Sandiford  <richard.sandiford@arm.com>
 
        * hard-reg-set.h (COPY_HARD_REG_SET, COMPL_HARD_REG_SET)
index e919aaeca93a44492ced11a1ec09507953c5815a..93df69152c21d74cba79751ae5fa50f11362650f 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2875,10 +2875,13 @@ struct subreg_info
 {
   /* Offset of first hard register involved in the subreg.  */
   int offset;
-  /* Number of hard registers involved in the subreg.  */
+  /* Number of hard registers involved in the subreg.  In the case of
+     a paradoxical subreg, this is the number of registers that would
+     be modified by writing to the subreg; some of them may be don't-care
+     when reading from the subreg.  */
   int nregs;
   /* Whether this subreg can be represented as a hard reg with the new
-     mode.  */
+     mode (by adding OFFSET to the original hard register).  */
   bool representable_p;
 };
 
index e361f0f4540657e11c6e952405e6d0ba478637af..30634580f2c45ef662eb98477283494bef9ff67d 100644 (file)
@@ -3410,7 +3410,20 @@ subreg_lsb (const_rtx x)
    xmode  - The mode of xregno.
    offset - The byte offset.
    ymode  - The mode of a top level SUBREG (or what may become one).
-   info   - Pointer to structure to fill in.  */
+   info   - Pointer to structure to fill in.
+
+   Rather than considering one particular inner register (and thus one
+   particular "outer" register) in isolation, this function really uses
+   XREGNO as a model for a sequence of isomorphic hard registers.  Thus the
+   function does not check whether adding INFO->offset to XREGNO gives
+   a valid hard register; even if INFO->offset + XREGNO is out of range,
+   there might be another register of the same type that is in range.
+   Likewise it doesn't check whether HARD_REGNO_MODE_OK accepts the new
+   register, since that can depend on things like whether the final
+   register number is even or odd.  Callers that want to check whether
+   this particular subreg can be replaced by a simple (reg ...) should
+   use simplify_subreg_regno.  */
+
 void
 subreg_get_info (unsigned int xregno, enum machine_mode xmode,
                 unsigned int offset, enum machine_mode ymode,