OSDN Git Service

* config/bfin/bfin.md (doloop_end): Fail for loops that can iterate
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Feb 2007 15:52:27 +0000 (15:52 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Feb 2007 15:52:27 +0000 (15:52 +0000)
2^32-1 or more times unless flag_unsafe_loop_optimizations.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122262 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/bfin/bfin.md

index c0fcb11..fed1961 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-23  Bernd Schmidt  <bernd.schmidt@analog.com>
+
+       * config/bfin/bfin.md (doloop_end): Fail for loops that can iterate
+       2^32-1 or more times unless flag_unsafe_loop_optimizations.
+
 2007-02-23  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * builtins.c (fold_builtin_logb, fold_builtin_significand): New.
index 8c088f9..63a651a 100644 (file)
              (unspec [(const_int 0)] UNSPEC_LSETUP_END)
              (clobber (match_scratch:SI 5 ""))])]
   ""
-  {bfin_hardware_loop ();})
+{
+  /* Due to limitations in the hardware (an initial loop count of 0
+     does not loop 2^32 times) we must avoid to generate a hardware
+     loops when we cannot rule out this case.  */
+
+  if (!flag_unsafe_loop_optimizations
+      && (unsigned HOST_WIDE_INT) INTVAL (operands[2]) >= 0xFFFFFFFF)
+    FAIL;
+  bfin_hardware_loop ();
+})
 
 (define_insn "loop_end"
   [(set (pc)