From: dje Date: Fri, 30 Nov 2001 02:16:31 +0000 (+0000) Subject: 2001-11-29 Zoltan Hidvegi X-Git-Tag: upstream/4.9.2~90599 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fe72aa5f3a462cce8d85238c631c66c012e1e9d3;p=platform%2Fupstream%2Flinaro-gcc.git 2001-11-29 Zoltan Hidvegi * doloop.c (doloop_valid_p): Check for LTU and GTU as well. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47468 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 32f3649..00f7de4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2001-11-29 Zoltan Hidvegi + + * doloop.c (doloop_valid_p): Check for LTU and GTU as well. + 2001-11-29 Aldy Hernandez * config/rs6000/rs6000.c (function_arg): Unnamed vector arguments diff --git a/gcc/doloop.c b/gcc/doloop.c index cf50d68..f6b765a 100644 --- a/gcc/doloop.c +++ b/gcc/doloop.c @@ -353,23 +353,38 @@ doloop_valid_p (loop, jump_insn) && ((loop_info->comparison_code == LEU && INTVAL (loop_info->increment) > 0) || (loop_info->comparison_code == GEU - && INTVAL (loop_info->increment) < 0))) + && INTVAL (loop_info->increment) < 0) + || (loop_info->comparison_code == LTU + && INTVAL (loop_info->increment) > 1) + || (loop_info->comparison_code == GTU + && INTVAL (loop_info->increment) < -1))) { /* If the comparison is LEU and the comparison value is UINT_MAX then the loop will not terminate. Similarly, if the comparison code is GEU and the initial value is 0, the loop will not terminate. - Note that with LE and GE, the loop behaviour can be - implementation dependent if an overflow occurs, say between - INT_MAX and INT_MAX + 1. We thus don't have to worry about - these two cases. + If the absolute increment is not 1, the loop can be infinite + even with LTU/GTU, e.g. for (i = 3; i > 0; i -= 2) + + Note that with LE and GE, the loop behaviour is undefined + (C++ standard section 5 clause 5) if an overflow occurs, say + between INT_MAX and INT_MAX + 1. We thus don't have to worry + about these two cases. ??? We could compute these conditions at run-time and have a additional jump around the loop to ensure an infinite loop. However, it is very unlikely that this is the intended behaviour of the loop and checking for these rare boundary - conditions would pessimize all other code. */ + conditions would pessimize all other code. + + If the loop is executed only a few times an extra check to + restart the loop could use up most of the benefits of using a + count register loop. Note however, that normally, this + restart branch would never execute, so it could be predicted + well by the CPU. We should generate the pessimistic code by + default, and have an option, e.g. -funsafe-loops that would + enable count-register loops in this case. */ if (loop_dump_stream) fprintf (loop_dump_stream, "Doloop: Possible infinite iteration case ignored.\n");