]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ifcvt.c (seq_contains_jump): New.
authorRichard Henderson <rth@cygnus.com>
Thu, 25 May 2000 23:53:23 +0000 (16:53 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 25 May 2000 23:53:23 +0000 (16:53 -0700)
        * 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

gcc/ChangeLog
gcc/ifcvt.c

index 80e638c5918880f8706f63ec65843bbe2a77fd9a..68a7369efdbcc89b7bb44b2f7230944be694dba8 100644 (file)
@@ -1,3 +1,9 @@
+2000-05-25  Richard Henderson  <rth@cygnus.com>
+
+       * 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.
+
 2000-05-25  Mark Mitchell  <mark@codesourcery.com>
 
        * except.h (can_throw): Declare it.
index 088efd0943dae893fbcd3fb216e68c3a440dd692..9b20b3ae503cbd48b19edbf65dc9e91c795691e5 100644 (file)
@@ -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;
+}
 \f
 /* 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;