]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[Ada] Optimize nonstandard boolean validity checking
authorAlexandre Oliva <oliva@adacore.com>
Wed, 29 Dec 2021 07:10:46 +0000 (04:10 -0300)
committerPierre-Marie de Rodat <derodat@adacore.com>
Tue, 10 May 2022 08:19:30 +0000 (08:19 +0000)
Validity checking of enumerations with nonstandard representation
starts by checking the value range, then calling _rep_to_pos to verify
that the value itself is valid. The value range check is thus
redundant and inefficient: the _rep_to_pos call is normally inlined
when optimizing for speed and the range check slows down the fast
path; it is unnecesary and undesirable when optimizing for size, and
just unnecessary when not optimizing. This patch thus drops the range
check for nonstandard boolean types.

gcc/ada/

* exp_attr.adb (Expand_N_Attribute_Reference) <Attribute_Valid>:
Drop redundant range check for nonstandard booleans.

gcc/ada/exp_attr.adb

index 7b36daec9aee8bfc112a43c2834a6cd0109542ae..cc04351391190612c06a26ceebc858bf8a5f0821 100644 (file)
@@ -7281,7 +7281,11 @@ package body Exp_Attr is
                       New_Occurrence_Of (Standard_False, Loc))),
                 Right_Opnd => Make_Integer_Literal (Loc, 0));
 
-            if Ptyp /= PBtyp
+            --  Skip the range test for boolean types, as it buys us
+            --  nothing. The function called above already fails for
+            --  values different from both True and False.
+
+            if Ptyp /= PBtyp and then not Is_Boolean_Type (PBtyp)
               and then
                 (Type_Low_Bound (Ptyp) /= Type_Low_Bound (PBtyp)
                   or else