aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-06-04 22:27:23 +0000
committerRichard Stallman <rms@gnu.org>1992-06-04 22:27:23 +0000
commite4890d4537b539824d089960163de1b077b6697e (patch)
tree0fc3d7c3193dda4477f4dddc01b7a45c2b55ff13 /gcc
parentd1c1397eebc39be331ab210b57ade79bf51ced73 (diff)
downloadgcc-e4890d4537b539824d089960163de1b077b6697e.zip
gcc-e4890d4537b539824d089960163de1b077b6697e.tar.gz
gcc-e4890d4537b539824d089960163de1b077b6697e.tar.bz2
*** empty log message ***
From-SVN: r1162
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cse.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/gcc/cse.c b/gcc/cse.c
index c863d3c..a54781e 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -4580,6 +4580,10 @@ fold_rtx (x, insn)
switch (GET_RTX_CLASS (code))
{
case '1':
+ /* We can't simplify extension ops unless we know the original mode. */
+ if ((code == ZERO_EXTEND || code == SIGN_EXTEND)
+ && mode_arg0 == VOIDmode)
+ break;
new = simplify_unary_operation (code, mode,
const_arg0 ? const_arg0 : folded_arg0,
mode_arg0);
@@ -6630,6 +6634,17 @@ cse_process_notes (x, object)
XEXP (x, 1) = cse_process_notes (XEXP (x, 1), 0);
return x;
+ case SIGN_EXTEND:
+ case ZERO_EXTEND:
+ {
+ rtx new = cse_process_notes (XEXP (x, 0), object);
+ /* We don't substitute VOIDmode constants into these rtx,
+ since they would impede folding. */
+ if (GET_MODE (new) != VOIDmode)
+ validate_change (object, &XEXP (x, 0), new, 0);
+ return x;
+ }
+
case REG:
i = reg_qty[REGNO (x)];
@@ -7599,6 +7614,7 @@ delete_dead_from_cse (insns, nreg)
rtx insn;
rtx tem;
int i;
+ int in_libcall = 0;
/* First count the number of times each register is used. */
bzero (counts, sizeof (int) * nreg);
@@ -7613,7 +7629,14 @@ delete_dead_from_cse (insns, nreg)
{
int live_insn = 0;
- if (GET_CODE (PATTERN (insn)) == SET)
+ /* Don't delete any insns that are part of a libcall block.
+ Flow or loop might get confused if we did that. */
+ if (find_reg_note (insn, REG_LIBCALL, 0))
+ in_libcall = 1;
+
+ if (in_libcall)
+ live_insn = 1;
+ else if (GET_CODE (PATTERN (insn)) == SET)
{
if (GET_CODE (SET_DEST (PATTERN (insn))) == REG
&& SET_DEST (PATTERN (insn)) == SET_SRC (PATTERN (insn)))
@@ -7665,16 +7688,17 @@ delete_dead_from_cse (insns, nreg)
live_insn = 1;
/* If this is a dead insn, delete it and show registers in it aren't
- being used. If this is the last insn of a libcall sequence, don't
- delete it even if it is dead because we don't know how to do so
- here. */
+ being used. */
- if (! live_insn && ! find_reg_note (insn, REG_RETVAL, 0))
+ if (! live_insn)
{
count_reg_usage (insn, counts, -1);
PUT_CODE (insn, NOTE);
NOTE_SOURCE_FILE (insn) = 0;
NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
}
+
+ if (find_reg_note (insn, REG_RETVAL, 0))
+ in_libcall = 0;
}
}