diff options
author | Andreas Krebbel <krebbel1@de.ibm.com> | 2005-06-19 13:29:45 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2005-06-19 13:29:45 +0000 |
commit | 966b148a49460db9772e7dff4216ba40990d24fa (patch) | |
tree | d78e058ffb8c59dbb9c1e39898d4e3eac700544f | |
parent | 9f24cc73613940d9c96c8857b92c805126f34873 (diff) | |
download | gcc-966b148a49460db9772e7dff4216ba40990d24fa.zip gcc-966b148a49460db9772e7dff4216ba40990d24fa.tar.gz gcc-966b148a49460db9772e7dff4216ba40990d24fa.tar.bz2 |
combine.c (make_compound_operation): Use simplify_subreg.
2005-06-19 Andreas Krebbel <krebbel1@de.ibm.com>
* combine.c (make_compound_operation): Use simplify_subreg. Delete
a optimization already done by simplify_subreg.
From-SVN: r101183
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/combine.c | 54 |
2 files changed, 28 insertions, 31 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index af13fe0..ef767e2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-06-19 Andreas Krebbel <krebbel1@de.ibm.com> + + * combine.c (make_compound_operation): Use simplify_subreg. Delete + a optimization already done by simplify_subreg. + 2005-06-19 Ulrich Weigand <uweigand@de.ibm.com> * loop.c (scan_loop): Do not consider insns setting the frame diff --git a/gcc/combine.c b/gcc/combine.c index d618c9f..c4e6f95 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -6732,41 +6732,33 @@ make_compound_operation (rtx x, enum rtx_code in_code) what it originally did, do this SUBREG as a force_to_mode. */ tem = make_compound_operation (SUBREG_REG (x), in_code); - if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x)) - && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem)) - && subreg_lowpart_p (x)) - { - rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0, - NULL_RTX, 0); - /* If we have something other than a SUBREG, we might have - done an expansion, so rerun ourselves. */ - if (GET_CODE (newer) != SUBREG) - newer = make_compound_operation (newer, in_code); + { + rtx simplified; + simplified = simplify_subreg (GET_MODE (x), tem, GET_MODE (tem), + SUBREG_BYTE (x)); - return newer; - } + if (simplified) + tem = simplified; - /* If this is a paradoxical subreg, and the new code is a sign or - zero extension, omit the subreg and widen the extension. If it - is a regular subreg, we can still get rid of the subreg by not - widening so much, or in fact removing the extension entirely. */ - if ((GET_CODE (tem) == SIGN_EXTEND - || GET_CODE (tem) == ZERO_EXTEND) - && subreg_lowpart_p (x)) - { - if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (tem)) - || (GET_MODE_SIZE (mode) > - GET_MODE_SIZE (GET_MODE (XEXP (tem, 0))))) - { - if (! SCALAR_INT_MODE_P (mode)) - break; - tem = gen_rtx_fmt_e (GET_CODE (tem), mode, XEXP (tem, 0)); - } - else - tem = gen_lowpart (mode, XEXP (tem, 0)); + if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x)) + && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem)) + && subreg_lowpart_p (x)) + { + rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0, + NULL_RTX, 0); + + /* If we have something other than a SUBREG, we might have + done an expansion, so rerun ourselves. */ + if (GET_CODE (newer) != SUBREG) + newer = make_compound_operation (newer, in_code); + + return newer; + } + + if (simplified) return tem; - } + } break; default: |