diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-02-01 18:27:04 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-02-01 18:27:04 -0500 |
commit | e73735563717fa9dfaf10dfa7dfe8242026d6c67 (patch) | |
tree | ebc319a8d7896d8d57f672b025732d2282963a1e | |
parent | 08d95f9128a3edc487281033732341b2d95552be (diff) | |
download | gcc-e73735563717fa9dfaf10dfa7dfe8242026d6c67.zip gcc-e73735563717fa9dfaf10dfa7dfe8242026d6c67.tar.gz gcc-e73735563717fa9dfaf10dfa7dfe8242026d6c67.tar.bz2 |
(make_extraction): Don't make an extraction that has the potential of
crossing a boundary.
From-SVN: r6462
-rw-r--r-- | gcc/combine.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index d682939..25f0297 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -5120,6 +5120,16 @@ make_extraction (mode, inner, pos, pos_rtx, len, && ! in_compare && ! spans_byte && unsignedp) return 0; + /* Unless we are allowed to span bytes, reject this if we would be + spanning bytes or if the position is not a constant and the length + is not 1. In all other cases, we would only be going outside + out object in cases when an original shift would have been + undefined. */ + if (! spans_byte + && ((pos_rtx == 0 && pos + len > GET_MODE_BITSIZE (is_mode)) + || (pos_rtx != 0 && len != 1))) + return 0; + /* Get the mode to use should INNER be a MEM, the mode for the position, and the mode for the result. */ #ifdef HAVE_insv |