From: Eric Botcazou Date: Tue, 13 Aug 2013 15:52:26 +0000 (+0000) Subject: trans.c (can_equal_min_or_max_val_p): Be prepared for values outside of the range... X-Git-Tag: releases/gcc-4.9.0~4602 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2efdbf0f3c085ca257f06acf045a8d9e8586df04;p=thirdparty%2Fgcc.git trans.c (can_equal_min_or_max_val_p): Be prepared for values outside of the range of the type. * gcc-interface/trans.c (can_equal_min_or_max_val_p): Be prepared for values outside of the range of the type. From-SVN: r201692 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e8d538980ff9..e1f7363a3305 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2013-08-13 Eric Botcazou + + * gcc-interface/trans.c (can_equal_min_or_max_val_p): Be prepared for + values outside of the range of the type. + 2013-08-13 Eric Botcazou * gcc-interface/utils2.c (build_atomic_load): Do a mere view-conversion diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index f91f4b83a6e4..fdd59a801858 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -2391,7 +2391,10 @@ can_equal_min_or_max_val_p (tree val, tree type, bool max) if (TREE_CODE (val) != INTEGER_CST) return true; - return tree_int_cst_equal (val, min_or_max_val) == 1; + if (max) + return tree_int_cst_lt (val, min_or_max_val) == 0; + else + return tree_int_cst_lt (min_or_max_val, val) == 0; } /* Return true if VAL (of type TYPE) can equal the minimum value of TYPE. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ae7973dd5419..c264264592a3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-08-13 Eric Botcazou + + * gnat.dg/loop_optimization16.adb: New test. + * gnat.dg/loop_optimization16_pkg.ad[sb]: New helper. + 2013-08-13 Marek Polacek * gcc.dg/pr57980.c: Use vector of two elements, not just one. diff --git a/gcc/testsuite/gnat.dg/loop_optimization16.adb b/gcc/testsuite/gnat.dg/loop_optimization16.adb new file mode 100644 index 000000000000..b9f2b70bb453 --- /dev/null +++ b/gcc/testsuite/gnat.dg/loop_optimization16.adb @@ -0,0 +1,24 @@ +-- { dg-do run } + +with Loop_Optimization16_Pkg; use Loop_Optimization16_Pkg; + +procedure Loop_Optimization16 is + + Counter : Natural := 0; + + C : constant Natural := F; + + subtype Index_T is Index_Base range 1 .. Index_Base (C); + +begin + + for I in Index_T'First .. Index_T'Last loop + Counter := Counter + 1; + exit when Counter > 200; + end loop; + + if Counter > 200 then + raise Program_Error; + end if; + +end Loop_Optimization16; diff --git a/gcc/testsuite/gnat.dg/loop_optimization16_pkg.adb b/gcc/testsuite/gnat.dg/loop_optimization16_pkg.adb new file mode 100644 index 000000000000..e4142f6e6a1b --- /dev/null +++ b/gcc/testsuite/gnat.dg/loop_optimization16_pkg.adb @@ -0,0 +1,8 @@ +package body Loop_Optimization16_Pkg is + + function F return Natural is + begin + return Natural (Index_Base'Last); + end; + +end Loop_Optimization16_Pkg; diff --git a/gcc/testsuite/gnat.dg/loop_optimization16_pkg.ads b/gcc/testsuite/gnat.dg/loop_optimization16_pkg.ads new file mode 100644 index 000000000000..abeecfb646f1 --- /dev/null +++ b/gcc/testsuite/gnat.dg/loop_optimization16_pkg.ads @@ -0,0 +1,7 @@ +package Loop_Optimization16_Pkg is + + type Index_Base is range 0 .. 127; + + function F return Natural; + +end Loop_Optimization16_Pkg;