diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2023-10-25 17:52:38 +0200 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2023-11-21 10:57:43 +0100 |
commit | 4649c079409ec6cb67cd2cca0df81877e53c78b4 (patch) | |
tree | 149b4e28c454e089d39b6c349aa1a89521560450 /gcc/ada | |
parent | 4d011701c074cac9bab7edfcf07c1868f0472177 (diff) | |
download | gcc-4649c079409ec6cb67cd2cca0df81877e53c78b4.zip gcc-4649c079409ec6cb67cd2cca0df81877e53c78b4.tar.gz gcc-4649c079409ec6cb67cd2cca0df81877e53c78b4.tar.bz2 |
ada: Fix miscompilation of loop over boolean range
The optimized form generated in this case turns out to be problematic.
gcc/ada/
* gcc-interface/trans.cc (Loop_Statement_to_gnu): Always use the
simpler form for a loop with a boolean iteration variable.
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/gcc-interface/trans.cc | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/ada/gcc-interface/trans.cc b/gcc/ada/gcc-interface/trans.cc index c7d9162..9c418be 100644 --- a/gcc/ada/gcc-interface/trans.cc +++ b/gcc/ada/gcc-interface/trans.cc @@ -3021,7 +3021,9 @@ Loop_Statement_to_gnu (Node_Id gnat_node) } /* We use two different strategies to translate the loop, depending on - whether optimization is enabled. + whether optimization is enabled, except for the very peculiar case + of a loop running over a boolean type where we use the simpler form + in order to avoid manipulating negative values in a boolean context. If it is, we generate the canonical loop form expected by the loop optimizer and the loop vectorizer, which is the do-while form: @@ -3067,7 +3069,9 @@ Loop_Statement_to_gnu (Node_Id gnat_node) which works in all cases. */ - if (optimize && !optimize_debug) + if (optimize + && !optimize_debug + && TREE_CODE (gnu_base_type) != BOOLEAN_TYPE) { /* We can use the do-while form directly if GNU_FIRST-1 doesn't overflow. */ |