diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-06-04 18:04:36 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-06-04 18:04:36 +0000 |
commit | 84e81e84adc59d4a0ed070b49f4f888c191acb98 (patch) | |
tree | 829c85ccd2ce524faa3bdeb601db3f7f80cc282f /gcc/gcse.c | |
parent | b14e5da57c59fd64cba5cfc30634a137f0685274 (diff) | |
download | gcc-84e81e84adc59d4a0ed070b49f4f888c191acb98.tar.gz |
* rtlanal.c (operand_preference): Fix preference for objects.
* gcse.c (handle_avail_expr): Be prepared to handle single_set
parallels.
* combine.c (if_then_else_cond): Use simplify_subreg instead
of operand_subword.
* integreate.c (sub_constants): Likewise.
* emit-rtl.c (constant_subword): Deprecate; remove most of code
and use simplify_gen_subreg.
Mon Jun 4 19:55:23 CEST 2001 Lars Brinkhoff <lars@nocrew.org>
* sibcall.c (skip_copy_to_return_value): recognize the situation
when the called function's return value is copied into an
intermediate pseudo, and then into the calling functions return
value register.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@42864 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gcse.c')
-rw-r--r-- | gcc/gcse.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/gcc/gcse.c b/gcc/gcse.c index 2b1bdee68b3..82f2787c6a3 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -3472,7 +3472,7 @@ handle_avail_expr (insn, expr) rtx insn; struct expr *expr; { - rtx pat, insn_computes_expr; + rtx pat, insn_computes_expr, expr_set; rtx to; struct reg_set *this_reg; int found_setting, use_src; @@ -3483,6 +3483,9 @@ handle_avail_expr (insn, expr) insn_computes_expr = computing_insn (expr, insn); if (insn_computes_expr == NULL) return 0; + expr_set = single_set (insn_computes_expr); + if (!expr_set) + abort (); found_setting = 0; use_src = 0; @@ -3490,12 +3493,12 @@ handle_avail_expr (insn, expr) /* At this point we know only one computation of EXPR outside of this block reaches this insn. Now try to find a register that the expression is computed into. */ - if (GET_CODE (SET_SRC (PATTERN (insn_computes_expr))) == REG) + if (GET_CODE (SET_SRC (expr_set)) == REG) { /* This is the case when the available expression that reaches here has already been handled as an available expression. */ unsigned int regnum_for_replacing - = REGNO (SET_SRC (PATTERN (insn_computes_expr))); + = REGNO (SET_SRC (expr_set)); /* If the register was created by GCSE we can't use `reg_set_table', however we know it's set only once. */ @@ -3514,7 +3517,7 @@ handle_avail_expr (insn, expr) if (!found_setting) { unsigned int regnum_for_replacing - = REGNO (SET_DEST (PATTERN (insn_computes_expr))); + = REGNO (SET_DEST (expr_set)); /* This shouldn't happen. */ if (regnum_for_replacing >= max_gcse_regno) @@ -3533,9 +3536,9 @@ handle_avail_expr (insn, expr) { pat = PATTERN (insn); if (use_src) - to = SET_SRC (PATTERN (insn_computes_expr)); + to = SET_SRC (expr_set); else - to = SET_DEST (PATTERN (insn_computes_expr)); + to = SET_DEST (expr_set); changed = validate_change (insn, &SET_SRC (pat), to, 0); /* We should be able to ignore the return code from validate_change but @@ -3563,15 +3566,14 @@ handle_avail_expr (insn, expr) replace all uses of REGB with REGN. */ rtx new_insn; - to = gen_reg_rtx (GET_MODE (SET_DEST (PATTERN (insn_computes_expr)))); + to = gen_reg_rtx (GET_MODE (SET_DEST (expr_set))); /* Generate the new insn. */ /* ??? If the change fails, we return 0, even though we created an insn. I think this is ok. */ new_insn = emit_insn_after (gen_rtx_SET (VOIDmode, to, - SET_DEST (PATTERN - (insn_computes_expr))), + SET_DEST (expr_set)), insn_computes_expr); /* Keep block number table up to date. */ |