From 0a8f8c4572b2f0cea7f56922122275d2ff76746c Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Fri, 23 Feb 2007 15:52:27 +0000 Subject: [PATCH] bfin.md (doloop_end): Fail for loops that can iterate 2^32-1 or more times unless... * config/bfin/bfin.md (doloop_end): Fail for loops that can iterate 2^32-1 or more times unless flag_unsafe_loop_optimizations. From-SVN: r122262 --- gcc/ChangeLog | 5 +++++ gcc/config/bfin/bfin.md | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c0fcb118c42..fed1961f666 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2007-02-23 Bernd Schmidt + + * 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 * builtins.c (fold_builtin_logb, fold_builtin_significand): New. diff --git a/gcc/config/bfin/bfin.md b/gcc/config/bfin/bfin.md index 8c088f93caf..63a651a5035 100644 --- a/gcc/config/bfin/bfin.md +++ b/gcc/config/bfin/bfin.md @@ -1639,7 +1639,16 @@ (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) -- 2.30.2