[Ada] Optimize nonstandard boolean conversions
commitbf687b8085403b94209269e15491f286644ec10b
authorAlexandre Oliva <oliva@adacore.com>
Wed, 29 Dec 2021 07:10:46 +0000 (29 04:10 -0300)
committerPierre-Marie de Rodat <derodat@adacore.com>
Tue, 10 May 2022 08:19:30 +0000 (10 08:19 +0000)
tree733cb752df74e859c1b174f36a19f7e5ecffcdf1
parent81d33c5c9211dd65b2ffd29424e403582e4542f9
[Ada] Optimize nonstandard boolean conversions

This patch improves the generated code for nonstandard boolean types.

One of the improvements extends the code that avoids converting back
to the nonstandard boolean type an expression computed as standard
boolean, when it will be converted to a(nother) nonstandard boolean
type.

The other improvement involves using the literal representation
constants in an If_Expression instead of dereferencing the T'Val array
when converting to a (nonstandard) boolean type. Avoiding the array
dereference enables the compiler middle-end to propagate the constants
and perform optimizations based on them, to the point of obviating the
improvement above.

Unfortunately, the code generated with this alternate expansion tends
to be slightly larger if it turns out to not enable any further
optimization, though it's most certainly faster, especially on targets
with conditional moves, more so if "store flag" is slow, as on x86.
Still, the array dereference is more straightforward and shorter, so
I've arranged for this alternate expansion to be used only when
optimizing for speed.

gcc/ada/

* exp_util.adb (Adjust_Result_Type): Leave result in
Standard.Boolean if it's going to be converted to another
boolean type.
* exp_ch4.adb (Expand_N_Type_Conversion): When optimizing,
convert to nonstandard booleans with an if_expression with
boolean literals.
gcc/ada/exp_ch4.adb
gcc/ada/exp_util.adb