fold-const.c (build_range_check): Properly deal with enumeral and boolean base types.
* fold-const.c (build_range_check): Properly deal with enumeral and boolean base types. From-SVN: r145988
This commit is contained in:
parent
3906a4a1bc
commit
849d624b4a
@ -1,3 +1,8 @@
|
||||
2009-04-12 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* fold-const.c (build_range_check): Properly deal with enumeral and
|
||||
boolean base types.
|
||||
|
||||
2009-04-12 Steven Bosscher <steven@gcc.gnu.org>
|
||||
|
||||
* doc/invoke.texi (max_gcse_passes): Remove documentation.
|
||||
|
@ -4671,8 +4671,8 @@ make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
|
||||
static tree
|
||||
build_range_check (tree type, tree exp, int in_p, tree low, tree high)
|
||||
{
|
||||
tree etype = TREE_TYPE (exp);
|
||||
tree value;
|
||||
tree etype = TREE_TYPE (exp), value;
|
||||
enum tree_code code;
|
||||
|
||||
#ifdef HAVE_canonicalize_funcptr_for_compare
|
||||
/* Disable this optimization for function pointer expressions
|
||||
@ -4756,20 +4756,25 @@ build_range_check (tree type, tree exp, int in_p, tree low, tree high)
|
||||
|
||||
/* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low).
|
||||
This requires wrap-around arithmetics for the type of the expression. */
|
||||
switch (TREE_CODE (etype))
|
||||
code = TREE_CODE (etype);
|
||||
switch (code)
|
||||
{
|
||||
case INTEGER_TYPE:
|
||||
case ENUMERAL_TYPE:
|
||||
case BOOLEAN_TYPE:
|
||||
/* There is no requirement that LOW be within the range of ETYPE
|
||||
if the latter is a subtype. It must, however, be within the base
|
||||
type of ETYPE. So be sure we do the subtraction in that type. */
|
||||
if (TREE_TYPE (etype))
|
||||
etype = TREE_TYPE (etype);
|
||||
break;
|
||||
if (code == INTEGER_TYPE && TREE_TYPE (etype))
|
||||
{
|
||||
etype = TREE_TYPE (etype);
|
||||
/* But not in an enumeral or boolean type though. */
|
||||
code = TREE_CODE (etype);
|
||||
}
|
||||
|
||||
case ENUMERAL_TYPE:
|
||||
case BOOLEAN_TYPE:
|
||||
etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
|
||||
TYPE_UNSIGNED (etype));
|
||||
if (code != INTEGER_TYPE)
|
||||
etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype),
|
||||
TYPE_UNSIGNED (etype));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1,4 +1,9 @@
|
||||
009-04-12 Uros Bizjak <ubizjak@gmail.com>
|
||||
2009-04-12 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gnat.dg/enum1.adb: New test.
|
||||
* gnat.dg/enum1_pkg.ads: New helper.
|
||||
|
||||
2009-04-12 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
PR target/39740
|
||||
* gcc.target/alpha/pr39740.c: New test.
|
||||
|
17
gcc/testsuite/gnat.dg/enum1.adb
Normal file
17
gcc/testsuite/gnat.dg/enum1.adb
Normal file
@ -0,0 +1,17 @@
|
||||
-- { dg-do run }
|
||||
-- { dg-options "-O2" }
|
||||
|
||||
with Enum1_Pkg; use Enum1_Pkg;
|
||||
|
||||
procedure Enum1 is
|
||||
|
||||
function Cond return Boolean is
|
||||
begin
|
||||
return My_N = Two or My_N = Three;
|
||||
end;
|
||||
|
||||
begin
|
||||
if Cond then
|
||||
raise Constraint_Error;
|
||||
end if;
|
||||
end;
|
9
gcc/testsuite/gnat.dg/enum1_pkg.ads
Normal file
9
gcc/testsuite/gnat.dg/enum1_pkg.ads
Normal file
@ -0,0 +1,9 @@
|
||||
package Enum1_Pkg is
|
||||
|
||||
type Enum is (One, Two, Three);
|
||||
|
||||
subtype Sub_Enum is Enum;
|
||||
|
||||
My_N : Sub_Enum := One;
|
||||
|
||||
end Enum1_Pkg;
|
Loading…
x
Reference in New Issue
Block a user