aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-05-17 18:51:25 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1994-05-17 18:51:25 -0400
commit246e00f2ff8caaab1968d97d346df7c61718a729 (patch)
treebd731c848638c855f5de249b95316c4411ee082e /gcc
parentc0d3ac4db65a7c4ada6f1e63f51311cfa04d309b (diff)
downloadgcc-246e00f2ff8caaab1968d97d346df7c61718a729.zip
gcc-246e00f2ff8caaab1968d97d346df7c61718a729.tar.gz
gcc-246e00f2ff8caaab1968d97d346df7c61718a729.tar.bz2
(simplify_set): Move call to make_field_assignment to end; if SRC or DEST is a (clobber (const_int 0)), return it.
(simplify_set): Move call to make_field_assignment to end; if SRC or DEST is a (clobber (const_int 0)), return it. (force_to_mode): If X is a CALL, just return it. From-SVN: r7323
Diffstat (limited to 'gcc')
-rw-r--r--gcc/combine.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index a800a27..2cd4f07 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -4196,9 +4196,6 @@ simplify_set (x)
if (GET_MODE_CLASS (mode) == MODE_INT)
src = force_to_mode (src, mode, GET_MODE_MASK (mode), NULL_RTX, 0);
- /* Convert this into a field assignment operation, if possible. */
- x = make_field_assignment (x);
-
/* If we are setting CC0 or if the source is a COMPARE, look for the use of
the comparison result and try to simplify it unless we already have used
undobuf.other_insn. */
@@ -4435,7 +4432,15 @@ simplify_set (x)
}
#endif
- return x;
+ /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
+ whole thing fail. */
+ if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
+ return src;
+ else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
+ return dest;
+ else
+ /* Convert this into a field assignment operation, if possible. */
+ return make_field_assignment (x);
}
/* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
@@ -5632,6 +5637,11 @@ force_to_mode (x, mode, mask, reg, just_select)
unsigned HOST_WIDE_INT fuller_mask, nonzero;
rtx op0, op1, temp;
+ /* If this is a CALL, don't do anything. Some of the code below
+ will do the wrong thing since the mode of a CALL is VOIDmode. */
+ if (code == CALL)
+ return x;
+
/* We want to perform the operation is its present mode unless we know
that the operation is valid in MODE, in which case we do the operation
in MODE. */