On Tue, May 18, 2021 at 4:51 AM Andrew Pinski via Gcc <gcc@gcc.gnu.org> wrote: > > On Mon, May 17, 2021 at 6:52 PM Andrew Pinski <pins...@gmail.com> wrote: > > > > I noticed while debugging why my "A?CST1:CST0" patch was broken for > > Ada, I noticed the following ranges for boolean types: > > # RANGE [0, 1] NONZERO 1 > > _14 = checks__saved_checks_tos.482_2 > 0; > > # RANGE [0, 255] NONZERO 1 > > _18 = _14 == 0; > > _19 = ~_18; > > # RANGE [0, 1] NONZERO 1 > > _15 = _19; > > if (_15 != 0) > > goto <bb 7>; [50.00%] > > else > > goto <bb 6>; [50.00%] > > > > Seems like there is a misunderstanding of TYPE_UNSIGNED for boolean > > types and that is what is causing the problem in the end. As the above > > gets optimized to be always true. My patch just happens to cause the > > ~_18 to be produced which is later on miscompiled. > > > > Should TYPE_UNSIGNED be always set for boolean types? > > > > I am testing the below patch to see if it fixes the problem, if we > > should assume TYPE_UNSIGNED is true for boolean types. If we should > > not assume that, then there is a problem with conversion between > > boolean types that have TYPE_UNSIGNED mismatched. > > I went back and noticed this has been discussed before but it does > look like the middle-end/gimple is still broken and even worse I have > done: > (bit_not:boolean_type_node (convert:boolean_type_node @0)) > Which means I have done the conversions correctly but they are removed still. > So I am still thinking we need to have a discussion about what boolean > type node should be and even how boolean types should act during the > gimple phase.
Note Adas boolean_type_node has precision 8 (but is unsigned). I don't think BOOLEAN_TYPEs are in any way restricted in precision or sign, they are required to be two-valued though. What kind of conversions are elided? Maybe the issue is in range analysis assuming comparisons result in unsigned boolean values? Because for GIMPLE we only require they produce a BOOLEAN_TYPE or a 1-bit precision integral type (see tree-cfg.c:verify_gimple_comparison). That said, I suppose you need to track down where things go wrong. Richard. > Thanks, > Andrew Pinski > > > > > Thanks, > > Andrew Pinski > > > > diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c > > index 232b552a60c..4e839f3b8ab 100644 > > --- a/gcc/ada/gcc-interface/decl.c > > +++ b/gcc/ada/gcc-interface/decl.c > > @@ -1687,7 +1687,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree > > gnu_expr, bool definition) > > > > gnu_type = make_node (is_boolean ? BOOLEAN_TYPE : ENUMERAL_TYPE); > > TYPE_PRECISION (gnu_type) = esize; > > - TYPE_UNSIGNED (gnu_type) = is_unsigned; > > + TYPE_UNSIGNED (gnu_type) = is_boolean ? true : is_unsigned; > > set_min_and_max_values_for_integral_type (gnu_type, esize, > > TYPE_SIGN (gnu_type)); > > process_attributes (&gnu_type, &attr_list, true, gnat_entity);