diff options
author | Richard Henderson <rth@cygnus.com> | 2000-05-25 16:53:23 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-05-25 16:53:23 -0700 |
commit | 4e4017cbe5e28ff3582e241cb1dc63ebae5a72c9 (patch) | |
tree | e220cd3d4052a3bc02972d1c12f86e4e1ac366ea /gcc/ifcvt.c | |
parent | 0519ce3019d4a288ca12c3ac21086f2f0cb5e28d (diff) | |
download | gcc-4e4017cbe5e28ff3582e241cb1dc63ebae5a72c9.tar.gz |
ifcvt.c (seq_contains_jump): New.
* ifcvt.c (seq_contains_jump): New.
(noce_try_store_flag_constants): Use it to fail conversion.
(noce_try_store_flag_inc, noce_try_store_flag_mask): Likewise.
From-SVN: r34179
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r-- | gcc/ifcvt.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 088efd0943d..9b20b3ae503 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -73,6 +73,7 @@ static sbitmap *post_dominators; static int count_bb_insns PARAMS ((basic_block)); static rtx first_active_insn PARAMS ((basic_block)); static int last_active_insn_p PARAMS ((basic_block, rtx)); +static int seq_contains_jump PARAMS ((rtx)); static int cond_exec_process_insns PARAMS ((rtx, rtx, rtx, rtx, int)); static rtx cond_exec_get_condition PARAMS ((rtx)); @@ -173,6 +174,24 @@ last_active_insn_p (bb, insn) return GET_CODE (insn) == JUMP_INSN; } + +/* It is possible, especially when having dealt with multi-word + arithmetic, for the expanders to have emitted jumps. Search + through the sequence and return TRUE if a jump exists so that + we can abort the conversion. */ + +static int +seq_contains_jump (insn) + rtx insn; +{ + while (insn) + { + if (GET_CODE (insn) == JUMP_INSN) + return 1; + insn = NEXT_INSN (insn); + } + return 0; +} /* Go through a bunch of insns, converting them to conditional execution format if possible. Return TRUE if all of the non-note @@ -637,6 +656,10 @@ noce_try_store_flag_constants (if_info) seq = get_insns (); end_sequence (); + + if (seq_contains_jump (seq)) + return FALSE; + emit_insns_before (seq, if_info->cond_earliest); return TRUE; @@ -691,6 +714,10 @@ noce_try_store_flag_inc (if_info) seq = get_insns (); end_sequence (); + + if (seq_contains_jump (seq)) + return FALSE; + emit_insns_before (seq, if_info->cond_earliest); return TRUE; @@ -738,6 +765,10 @@ noce_try_store_flag_mask (if_info) seq = get_insns (); end_sequence (); + + if (seq_contains_jump (seq)) + return FALSE; + emit_insns_before (seq, if_info->cond_earliest); return TRUE; |