From 9ab41c76dd2db2e2880a17eb4e6d760a087dfa45 Mon Sep 17 00:00:00 2001 From: Alan Hayward Date: Wed, 21 Jan 2015 17:53:04 +0000 Subject: [PATCH] rtlanal.c (subreg_get_info): Exit early for simple and common cases. gcc/ 2015-01-25 Alan Hayward * rtlanal.c (subreg_get_info): Exit early for simple and common cases. From-SVN: r219957 --- gcc/ChangeLog | 5 +++++ gcc/rtlanal.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3f1dda4188d..40422a38d54 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-01-21 Alan Hayward + + * rtlanal.c (subreg_get_info): Exit early for simple and common + cases. + 2015-01-21 Richard Henderson PR target/64669 diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 513feeb577b..743aad6705c 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. */ -- 2.30.2