diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/rtlanal.c | 16 |
2 files changed, 21 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3f1dda4..40422a3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-01-21 Alan Hayward <alan.hayward@arm.com> + + * rtlanal.c (subreg_get_info): Exit early for simple and common + cases. + 2015-01-21 Richard Henderson <rth@redhat.com> PR target/64669 diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 513feeb..743aad6 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -3440,6 +3440,22 @@ subreg_get_info (unsigned int xregno, machine_mode xmode, info->offset = offset / regsize_xmode; return; } + /* Quick exit for the simple and common case of extracting whole + subregisters from a multiregister value. */ + /* ??? It would be better to integrate this into the code below, + if we can generalize the concept enough and figure out how + odd-sized modes can coexist with the other weird cases we support. */ + if (!rknown + && WORDS_BIG_ENDIAN == REG_WORDS_BIG_ENDIAN + && regsize_xmode == regsize_ymode + && (offset % regsize_ymode) == 0) + { + info->representable_p = true; + info->nregs = nregs_ymode; + info->offset = offset / regsize_ymode; + gcc_assert (info->offset + info->nregs <= nregs_xmode); + return; + } } /* Lowpart subregs are otherwise valid. */ |