Request for review: 7102776 Pack instanceKlass boolean fields into single u1 field
Paul Hohensee
paul.hohensee at oracle.com
Thu Nov 10 13:06:42 PST 2011
True. Field alignment is the alignment of the underlying integral type.
On 11/10/11 4:00 PM, Jiangli Zhou wrote:
> Hi Paul,
>
> Thanks for the details and review. The bit field padding due to
> alignment is more of an issue when there are mixed types.
>
> Thanks,
> Jiangli
>
> Paul Hohensee wrote:
>> Actually, the C/C++ standards do guarantee dense bit packing in
>> bitfields,
>> because they were originally intended to be used to access device
>> registers.
>>
>> The type of the bitfield determines how much space the underlying
>> integral
>> type occupies. E.g.,
>>
>> unsigned char bit1:1, bit2:1, bit3:1;
>>
>> occupies the "first" 3 bits of a one-byte class data member, while
>>
>> unsigned int bit1:1, bit2:1, bit3:1;
>>
>> occupies the "first" 3 bits of a 4-byte class data member.
>>
>> Note that "first" means that bitfields are allocated starting from
>> the lowest addressed
>> byte in the bitfield type. That means that on big-endian machines,
>> the first allocated
>> bit in an unsigned int bitfield will be the msb, while on
>> little-endian machines
>> it'll be the lsb. If you want a bitfield that's endian-independent,
>> you have to
>> use the masking technique in the webrev: e.g., if you want to pass a
>> bitfield to Java
>> code, which has no concept of endianness.
>>
>> Paul
>>
>> On 11/10/11 2:32 PM, Jiangli Zhou wrote:
>>> Hi Chris,
>>>
>>> Thanks for the review. Comments below.
>>>
>>> On 11/10/2011 03:11 AM, Christian Thalinger wrote:
>>>> On Nov 10, 2011, at 12:02 PM, David Holmes wrote:
>>>>
>>>>> Hi Chris,
>>>>>
>>>>> On 10/11/2011 7:26 PM, Christian Thalinger wrote:
>>>>>> What about:
>>>>>>
>>>>>> - bool _is_marked_dependent:1; // used for marking
>>>>>> during flushing and deoptimization
>>>>>> - bool _rewritten:1; // methods rewritten.
>>>>>> - bool _has_nonstatic_fields:1; // for sizing with
>>>>>> UseCompressedOops
>>>>>> - bool _should_verify_class:1; // allow caching of
>>>>>> preverification
>>>>>>
>>>>>> Wouldn't that be much easier? And we already have code like that
>>>>>> in e.g. nmethod.hpp.
>>>>> I'm not familiar with this particular notation but I assume it is
>>>>> similar to using bitfields.
>>>> Correct.
>>>>
>>>>> This had been discussed internally but unfortunately the SA code
>>>>> needs to access the "is-marked-dependent" bit and as there's no
>>>>> guarantee as to the order in which bitfields are packed, the SA
>>>>> would not know how to extract that bit.
>>>> Good point. Bitfields won't work then.
>>>
>>> Besides the bit addressing issue, it cannot guarantee that the bit
>>> fields are always packed into the smallest size by all compilers.
>>>
>>> Thanks,
>>> Jiangli
>>>
>>>> -- Chris
>>>>
>>>>> David
>>>>> -----
>>>>>
>>>>>> -- Chris
>>>>>>
>>>>>> On Nov 9, 2011, at 6:47 PM, Jiangli Zhou wrote:
>>>>>>
>>>>>>> Compact following 4 instanceKlass boolean fields into a signal
>>>>>>> u1 field. Each flag now uses 1-bit. The new field is placed
>>>>>>> after the _idnum_allocated_count field to utilize the unused
>>>>>>> 2-byte after _idnum_allocated_count. Compacting these fields
>>>>>>> saves 4-bytes for each loaded classes.
>>>>>>>
>>>>>>> bool _is_marked_dependent; // used for marking during flushing
>>>>>>> and
>>>>>>> deoptimization
>>>>>>> bool _rewritten; // methods rewritten.
>>>>>>> bool _has_nonstatic_fields; // for sizing with UseCompressedOops
>>>>>>> bool _should_verify_class; // allow caching of preverification
>>>>>>>
>>>>>>> http://cr.openjdk.java.net/~bobv/7102776/webrev.00/
>>>>>>>
>>>>>>> Tested with runThese on ubuntu. Ran JPRT.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Jiangli
>>>
>
More information about the hotspot-runtime-dev
mailing list