summaryrefslogtreecommitdiff
path: root/gcc/ifcvt.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-05-25 16:53:23 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-05-25 16:53:23 -0700
commit4e4017cbe5e28ff3582e241cb1dc63ebae5a72c9 (patch)
treee220cd3d4052a3bc02972d1c12f86e4e1ac366ea /gcc/ifcvt.c
parent0519ce3019d4a288ca12c3ac21086f2f0cb5e28d (diff)
downloadgcc-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.c31
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;