diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1993-01-27 13:27:18 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1993-01-27 13:27:18 -0500 |
commit | e15762df9d0d7f48680b2d839a3da37536461b1a (patch) | |
tree | 24ee8c12a2f6f16e9877fbbf4e8a936024a7765c | |
parent | 4b7179be95c25b5298d116896980223cc0319517 (diff) | |
download | gcc-e15762df9d0d7f48680b2d839a3da37536461b1a.zip gcc-e15762df9d0d7f48680b2d839a3da37536461b1a.tar.gz gcc-e15762df9d0d7f48680b2d839a3da37536461b1a.tar.bz2 |
(put_var_into_stack, fixup_var_refs_insns): Minor cleanups.
(fixup_var_refs_1, case SET): Correctly check for simple insns that don't
need fixups.
From-SVN: r3367
-rw-r--r-- | gcc/function.c | 66 |
1 files changed, 54 insertions, 12 deletions
diff --git a/gcc/function.c b/gcc/function.c index 4c2f83a..dfc8aaf 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -852,6 +852,7 @@ put_var_into_stack (decl) reg = XEXP (reg, 0); decl_mode = promoted_mode = GET_MODE (reg); } + if (GET_CODE (reg) != REG) return; @@ -860,8 +861,7 @@ put_var_into_stack (decl) if (REGNO (reg) < function->max_parm_reg) new = function->parm_reg_stack_loc[REGNO (reg)]; if (new == 0) - new = assign_outer_stack_local (GET_MODE (reg), - GET_MODE_SIZE (decl_mode), + new = assign_outer_stack_local (decl_mode, GET_MODE_SIZE (decl_mode), 0, function); } else @@ -869,8 +869,7 @@ put_var_into_stack (decl) if (REGNO (reg) < max_parm_reg) new = parm_reg_stack_loc[REGNO (reg)]; if (new == 0) - new = assign_stack_local (GET_MODE (reg), - GET_MODE_SIZE (decl_mode), 0); + new = assign_stack_local (decl_mode, GET_MODE_SIZE (decl_mode), 0); } XEXP (reg, 0) = XEXP (new, 0); @@ -1004,8 +1003,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel) { rtx next = NEXT_INSN (insn); rtx note; - if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN - || GET_CODE (insn) == JUMP_INSN) + if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') { /* The insn to load VAR from a home in the arglist is now a no-op. When we see it, just delete it. */ @@ -1464,7 +1462,12 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements) must be left alone, to avoid an infinite loop here. If the reference to VAR is by a subreg, fix that up, since SUBREG is not valid for a memref. - Also fix up the address of the stack slot. */ + Also fix up the address of the stack slot. + + Note that we must not try to recognize the insn until + after we know that we have valid addresses and no + (subreg (mem ...) ...) constructs, since these interfere + with determining the validity of the insn. */ if ((SET_SRC (x) == var || (GET_CODE (SET_SRC (x)) == SUBREG @@ -1472,20 +1475,42 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements) && (GET_CODE (SET_DEST (x)) == REG || (GET_CODE (SET_DEST (x)) == SUBREG && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG)) - && recog_memoized (insn) >= 0) + && x == single_set (PATTERN (insn))) { + rtx pat; + replacement = find_fixup_replacement (replacements, SET_SRC (x)); if (replacement->new) - { SET_SRC (x) = replacement->new; - return; - } else if (GET_CODE (SET_SRC (x)) == SUBREG) SET_SRC (x) = replacement->new = fixup_memory_subreg (SET_SRC (x), insn, 0); else SET_SRC (x) = replacement->new = fixup_stack_1 (SET_SRC (x), insn); + + if (recog_memoized (insn) >= 0) + return; + + /* INSN is not valid, but we know that we want to + copy SET_SRC (x) to SET_DEST (x) in some way. So + we generate the move and see whether it requires more + than one insn. If it does, we emit those insns and + delete INSN. Otherwise, we an just replace the pattern + of INSN; we have already verified above that INSN has + no other function that to do X. */ + + pat = gen_move_insn (SET_DEST (x), SET_SRC (x)); + if (GET_CODE (pat) == SEQUENCE) + { + emit_insn_after (pat, insn); + PUT_CODE (insn, NOTE); + NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; + NOTE_SOURCE_FILE (insn) = 0; + } + else + PATTERN (insn) = pat; + return; } @@ -1495,12 +1520,29 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements) && (GET_CODE (SET_SRC (x)) == REG || (GET_CODE (SET_SRC (x)) == SUBREG && GET_CODE (SUBREG_REG (SET_SRC (x))) == REG)) - && recog_memoized (insn) >= 0) + && x == single_set (PATTERN (insn))) { + rtx pat; + if (GET_CODE (SET_DEST (x)) == SUBREG) SET_DEST (x) = fixup_memory_subreg (SET_DEST (x), insn, 0); else SET_DEST (x) = fixup_stack_1 (SET_DEST (x), insn); + + if (recog_memoized (insn) >= 0) + return; + + pat = gen_move_insn (SET_DEST (x), SET_SRC (x)); + if (GET_CODE (pat) == SEQUENCE) + { + emit_insn_after (pat, insn); + PUT_CODE (insn, NOTE); + NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; + NOTE_SOURCE_FILE (insn) = 0; + } + else + PATTERN (insn) = pat; + return; } |