diff options
author | Jan Hubicka <jh@suse.cz> | 2001-02-19 15:59:42 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2001-02-19 14:59:42 +0000 |
commit | 0eac0e81c4bfcfc7b48f4d91eafbd9c027e31ff6 (patch) | |
tree | 625126b53f56c723996597f2f47bd167c61cb6a8 /gcc/reg-stack.c | |
parent | e7ca84b3a6df74c93d6542a973983b4cf436bfa6 (diff) | |
download | gcc-0eac0e81c4bfcfc7b48f4d91eafbd9c027e31ff6.zip gcc-0eac0e81c4bfcfc7b48f4d91eafbd9c027e31ff6.tar.gz gcc-0eac0e81c4bfcfc7b48f4d91eafbd9c027e31ff6.tar.bz2 |
reg-stack.c (next_flags_user): Use current_block->end
* reg-stack.c (next_flags_user): Use current_block->end
(swap_rtx_condition): Look for next user if flags don't die;
give up on CALL_INSNs; use current_block->end.
From-SVN: r39884
Diffstat (limited to 'gcc/reg-stack.c')
-rw-r--r-- | gcc/reg-stack.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index 75ffbed..94300c3 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -335,22 +335,18 @@ next_flags_user (insn) { /* Search forward looking for the first use of this value. Stop at block boundaries. */ - /* ??? This really cries for BLOCK_END! */ - while (1) + while (insn != current_block->end) { insn = NEXT_INSN (insn); - if (!insn) - return NULL_RTX; if (INSN_P (insn) && reg_mentioned_p (ix86_flags_rtx, PATTERN (insn))) return insn; - if (GET_CODE (insn) == JUMP_INSN - || GET_CODE (insn) == CODE_LABEL - || GET_CODE (insn) == CALL_INSN) + if (GET_CODE (insn) == CALL_INSN) return NULL_RTX; } + return NULL_RTX; } /* Reorganise the stack into ascending numbers, @@ -1231,17 +1227,12 @@ swap_rtx_condition (insn) /* Search forward looking for the first use of this value. Stop at block boundaries. */ - /* ??? This really cries for BLOCK_END! */ - while (1) + while (insn != current_block->end) { insn = NEXT_INSN (insn); - if (insn == NULL_RTX) - return 0; if (INSN_P (insn) && reg_mentioned_p (dest, insn)) break; - if (GET_CODE (insn) == JUMP_INSN) - return 0; - if (GET_CODE (insn) == CODE_LABEL) + if (GET_CODE (insn) == CALL_INSN) return 0; } @@ -1264,8 +1255,19 @@ swap_rtx_condition (insn) if (swap_rtx_condition_1 (pat)) { + int fail = 0; INSN_CODE (insn) = -1; if (recog_memoized (insn) == -1) + fail = 1; + /* In case the flags don't die here, recurse to try fix + following user too. */ + else if (! dead_or_set_p (insn, ix86_flags_rtx)) + { + insn = next_flags_user (insn); + if (!insn || !swap_rtx_condition (insn)) + fail = 1; + } + if (fail) { swap_rtx_condition_1 (pat); return 0; |