From 4649c079409ec6cb67cd2cca0df81877e53c78b4 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 25 Oct 2023 17:52:38 +0200 Subject: [PATCH] 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. --- gcc/ada/gcc-interface/trans.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gcc/ada/gcc-interface/trans.cc b/gcc/ada/gcc-interface/trans.cc index c7d91628f80c..9c418beda964 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. */ -- 2.47.2