rs6000.c (rs6000_insn_valid_within_doloop): New.
authorDavid Edelsohn <edelsohn@gnu.org>
Thu, 2 Jun 2005 14:19:18 +0000 (14:19 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Thu, 2 Jun 2005 14:19:18 +0000 (10:19 -0400)
* config/rs6000/rs6000.c (rs6000_insn_valid_within_doloop): New.
(TARGET_INSN_VALID_WITHIN_DOLOOP): Define.

From-SVN: r100493

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index c26763b645da1b789d2542630f9e858ed5d00a95..600266d91460df77f61b41c8952db918e622b010 100644 (file)
@@ -1,3 +1,8 @@
+2005-06-02  David Edelsohn  <edelsohn@gnu.org>
+
+       * config/rs6000/rs6000.c (rs6000_insn_valid_within_doloop): New.
+       (TARGET_INSN_VALID_WITHIN_DOLOOP): Define.
+
 2005-06-02  Diego Novillo  <dnovillo@redhat.com>
 
        * tree-vrp.c (has_assert_expr, maybe_add_assert_expr): Remove.
index 9f8bbd78ca837335468b79d0c29e601510aea842..b82ee747c614c550d5017e419c13227a21bd9d59 100644 (file)
@@ -552,6 +552,7 @@ struct processor_costs power4_cost = {
 
 \f
 static bool rs6000_function_ok_for_sibcall (tree, tree);
+static bool rs6000_insn_valid_within_doloop (rtx);
 static rtx rs6000_generate_compare (enum rtx_code);
 static void rs6000_maybe_dead (rtx);
 static void rs6000_emit_stack_tie (void);
@@ -906,6 +907,9 @@ static const char alt_reg_names[][8] =
 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
 #define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
 
+#undef TARGET_INSN_VALID_WITHIN_DOLOOP
+#define TARGET_INSN_VALID_WITHIN_DOLOOP rs6000_insn_valid_within_doloop
+
 #undef TARGET_RTX_COSTS
 #define TARGET_RTX_COSTS rs6000_rtx_costs
 #undef TARGET_ADDRESS_COST
@@ -12520,6 +12524,23 @@ rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
   return false;
 }
 
+/* TRUE if INSN insn is valid within a low-overhead loop.
+   PowerPC uses the COUNT register for branch on table instructions.  */
+
+static bool
+rs6000_insn_valid_within_doloop (rtx insn)
+{
+  if (CALL_P (insn))
+    return false;
+
+  if (JUMP_P (insn)
+      && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
+         || GET_CODE (PATTERN (insn)) == ADDR_VEC))
+    return false;
+
+  return true;
+}
+
 static int
 rs6000_ra_ever_killed (void)
 {