Request for reviews (M): 7069452: Cleanup NodeFlags

Vladimir Kozlov vladimir.kozlov at
Wed Jul 27 17:20:53 PDT 2011

Thank you, Tom

Yes, we have few free bits in _flags now, but it does not mean we will have them 
tomorrow :) I will take one for next cbcond changes to mark avoid_back_to_back 

I don't think we need to cover all classes in class_id, we can use Opcode(). At 
the beginning I did profiling of Opcode() usage and replaced only hot ones with 
class_id check but now it is expanded for other usages. We still have space in 
class_id so I would not expand it now.


Tom Rodriguez wrote:
> That looks good.
> It looks like we could expand the number of bits dedicated to the class_id if we wanted to.  Would that allow us to have more complete coverage in the is_Node tests we provide?
> tom
> On Jul 26, 2011, at 7:47 PM, Vladimir Kozlov wrote:
>> I updated webrev.
>> is_Goto() is replaced with class_id check is_MachGoto(), new MachGotoNode is added.
>> Flag_is_block_start flag check replaced with is_Start() check.
>> is_safepoint_node() check is replaced with !is_MachCallLeaf() check. Corresponding code in adlc is removed since it is not needed.
>> Thanks,
>> Vladimir
>> Tom Rodriguez wrote:
>>> On Jul 26, 2011, at 5:05 PM, Vladimir Kozlov wrote:
>>>> Tom Rodriguez wrote:
>>>>> So is_Goto returns false for GotoNode?  That doesn't seem right.
>>>> It is used only for Mach nodes in block.cpp.
>>> Then maybe it should be is_MachGoto or we should introduce a MachGotoNode.
>>> tom
>>>>> +bool Node::is_Goto() const { return is_Branch() && is_Mach() && (as_Mach()->ideal_Opcode() == Op_Goto); }
>>>>> why does this have an is_Branch test?  Isn't testing the ideal_Opcode sufficient for the mach case?
>>>> is_Branch() is bits test and ideal_Opcode() is virtual call. So it is a little speedup. I can set is_Branch flag in ideal GotoNode and change is_Goto() to:
>>>> bool Node::is_Goto() const {
>>>> if (!is_Branch()) return false;
>>>> if (is_Mach()) return (as_Mach()->ideal_Opcode() == Op_Goto);
>>>> else           return (Opcode() == Op_Goto);
>>>> }
>>>> I will look on Flag_is_block_start and Flag_is_safepoint_node.
>>>> Thanks,
>>>> Vladimir
>>>>> Flag_is_block_start seems to be minimally useful since it's only used to mark StartNode, at least as far as I can see.
>>>>> Flag_is_safepoint_node could probably be eliminated without too much work too.  It's set for MachSafePointNode and cleared for MachCallLeaf.  The adlc tries to clear it for FastUnlock but those inherit from MachNode, not MachSafePointNode so it seems slightly useless.
>>>>> tom
>>>>> On Jul 22, 2011, at 11:06 AM, Vladimir Kozlov wrote:
>>>>>> Fixed 7069452: Cleanup NodeFlags
>>>>>> We are almost out of bits (16) for Node::NodeFlags. I removed flags which duplicate information in Node::NodeClasses.
>>>>>> is_Call() uses class_id check and is now valid only for ideal CallNode.
>>>>>> is_Goto() checks ideal_opcode().
>>>>>> is_Vector() is replaced with check for Vector,VectorLoad,VectorStore classes.
>>>>>> MachProjNode was added to class_id check to avoid calling Opcode() in many places. MulNode was removed from class_id since it was used only in one place.
>>>>>> I removed all logic associated with is_pc_relative flag. It was only checked in one place during long to short branch replacement. I replaced it with check in adlc parser - short branches should be defined only for a branch to a label, which means branch with PC relative offset. To relay on developer to set ins_pc_relative() was mistake since it could be used in wrong places. For example, it was specified for table jumps, calls and FastLock/FastUnlock.

More information about the hotspot-compiler-dev mailing list