diff options
author | Doug Evans <dje@gnu.org> | 1996-03-17 21:54:11 +0000 |
---|---|---|
committer | Doug Evans <dje@gnu.org> | 1996-03-17 21:54:11 +0000 |
commit | 76184def9f7a7c3ea2dd7a1298b7aae708586ae7 (patch) | |
tree | bd59b29978075828eb9ae4556845036aee2405e3 /gcc | |
parent | 0d4ae18aae4047e956c4bc8b23a59436daa537d5 (diff) | |
download | gcc-76184def9f7a7c3ea2dd7a1298b7aae708586ae7.zip gcc-76184def9f7a7c3ea2dd7a1298b7aae708586ae7.tar.gz gcc-76184def9f7a7c3ea2dd7a1298b7aae708586ae7.tar.bz2 |
(find_split_point): Handle NULL return from make_extraction.
(make_field_assignment): Likewise.
From-SVN: r11552
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/combine.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index 70b9faa..33ce6e6 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -2610,11 +2610,14 @@ find_split_point (loc, insn) && XEXP (*split, 0) == SET_DEST (x) && XEXP (*split, 1) == const0_rtx) { - SUBST (SET_SRC (x), - make_extraction (GET_MODE (SET_DEST (x)), - XEXP (SET_SRC (x), 0), - pos, NULL_RTX, 1, 1, 0, 0)); - return find_split_point (loc, insn); + rtx extraction = make_extraction (GET_MODE (SET_DEST (x)), + XEXP (SET_SRC (x), 0), + pos, NULL_RTX, 1, 1, 0, 0); + if (extraction != 0) + { + SUBST (SET_SRC (x), extraction); + return find_split_point (loc, insn); + } } break; @@ -5050,7 +5053,10 @@ expand_field_assignment (x) IN_COMPARE is non-zero if we are in a COMPARE. This means that a ZERO_EXTRACT should be built even for bits starting at bit 0. - MODE is the desired mode of the result (if IN_DEST == 0). */ + MODE is the desired mode of the result (if IN_DEST == 0). + + The result is an RTX for the extraction or NULL_RTX if the target + can't handle it. */ static rtx make_extraction (mode, inner, pos, pos_rtx, len, @@ -6553,7 +6559,9 @@ make_field_assignment (x) { assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1), 1, 1, 1, 0); - return gen_rtx (SET, VOIDmode, assign, const0_rtx); + if (assign != 0) + return gen_rtx (SET, VOIDmode, assign, const0_rtx); + return x; } else if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG @@ -6567,7 +6575,9 @@ make_field_assignment (x) assign = make_extraction (VOIDmode, dest, 0, XEXP (SUBREG_REG (XEXP (src, 0)), 1), 1, 1, 1, 0); - return gen_rtx (SET, VOIDmode, assign, const0_rtx); + if (assign != 0) + return gen_rtx (SET, VOIDmode, assign, const0_rtx); + return x; } /* If SRC is (ior (ashift (const_int 1) POS DEST)), this is a set of a @@ -6578,7 +6588,9 @@ make_field_assignment (x) { assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1), 1, 1, 1, 0); - return gen_rtx (SET, VOIDmode, assign, const1_rtx); + if (assign != 0) + return gen_rtx (SET, VOIDmode, assign, const1_rtx); + return x; } /* The other case we handle is assignments into a constant-position @@ -6613,6 +6625,8 @@ make_field_assignment (x) return x; assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0); + if (assign == 0) + return x; /* The mode to use for the source is the mode of the assignment, or of what is inside a possible STRICT_LOW_PART. */ |