getting the right boolean type
Richard Biener
richard.guenther@gmail.com
Thu Nov 9 15:29:00 GMT 2017
On Thu, Nov 9, 2017 at 4:24 PM, Andrew MacLeod <amacleod@redhat.com> wrote:
> On 11/09/2017 10:16 AM, Richard Biener wrote:
>>
>> On Thu, Nov 9, 2017 at 3:44 PM, Andrew MacLeod <amacleod@redhat.com>
>> wrote:
>>>
>>> I'm a little confused. In gimple I need to do a comparison between 2
>>> values, and I create a boolean_type_node result.
>>> I then combine it with an existing condition, but fortran is crapping out
>>> on
>>> me because the boolean_type I created is not
>>> compatible with the boolean type is has already created for a different
>>> condition:
>>>
>>> Its not exactly this situation, but the idea is similar:
>>>
>>> _65 = _37 != 0; <<-- in the IL
>>> _77 = _34 != 0; <<-- Im creating this
>>>
>>> and something like
>>>
>>> (_65 != _77)
>>>
>>> Craps out on me because the types are incompatible.
>>>
>>> The expression created by fortran assigned to _65 is of type:
>>> logical(kind=4)
>>> and mine, _77 created with boolean_type_node, is logical(kind=1)
>>>
>>> I was under the impression that using boolean_type_node would give me the
>>> right kind of boolean for that language, but apparently I was mistaken.
>>>
>>> If I don't have the context of the type of _65, how am I suppose to get
>>> the
>>> right boolean type for _77 when I create it? I don't want to cast it to
>>> the
>>> right logical kind, Id like to just get it right. I haven't stumbled
>>> across any hooks or other obvious thing...
>>>
>>> I feel like I am missing something obvious... :-P
>>
>> You should already know the boolean type from the existing comparison in
>> the IL.
>> That is, you shouldn't generate conditions out of thin air, do you? That
>> is,
>> there isn't a "single" boolean type a random hook would tell you.
>>
>> Richard.
>
> Yeah, I do actually generate them from thin air :-) That why I said it
> wasnt exactly that situation. All I have is 2 arbitrary things that are
> being compared, and then eventually I sometimes end up combining it with an
> existing boolean. I dont know in advance that I will need to combine it. I
> chose boolean_type_node because I thought it was the default.
Sure - you can use boolean_type_node. Then when combining you need
to convert to a common boolean type (choose any). Eventually forwprop
will retroactively "fix" your (or the other) generated comparison to produce
the correct type in the first place.
> I presume fortran is using SImode because it works better, or there is some
> other subtle difference?
Fortran has boolean types of each size -- logical(1) to logical(16).
> so even if I wasn't eventually combining it with a
> logical, and I was using the default QImode, I would generate less than
> ideal code? Is there not a way for the optimizers to pick the preferred
> type?
The preferred type depends on the context and should almost always be
boolean_type_node _unless_ the bool(s) you are working with are
loaded from / stored to memory where of course the size of the bool
matters.
Richard.
>
> Andrew
>
>
More information about the Gcc
mailing list