IGVN worklist ordering
Krystal Mok
rednaxelafx at gmail.com
Thu Dec 24 02:42:47 UTC 2015
Hi Vladimir,
Thanks a lot for your reply! I really appreciate it.
On Wed, Dec 23, 2015 at 6:16 PM, Vladimir Kozlov <vladimir.kozlov at oracle.com
> wrote:
> One of the problems is that IGVN worklist is not "true" queue. There is no
> guarantee that nodes will be processed in the order they were placed on
> worklist. Long ago I played with "real" queue worklist but it bring only
> increase in memory consumption.
>
> 1. We only delay transformation when there are merge paths to wait when
> all paths are complete.
>
Yes, this is a good rule of thumb.
Let's take Parse::sharpen_type_after_if() for example.
// Look for opportunities to sharpen the type of a node
// whose klass is compared with a constant klass.
if (btest == BoolTest::eq && tcon->isa_klassptr()) {
Node* obj = extract_obj_from_klass_load(&_gvn, val);
const TypeOopPtr* con_type = tcon->isa_klassptr()->as_instance_type();
if (obj != NULL && (con_type->isa_instptr() || con_type->isa_aryptr()))
{
// Found:
// Bool(CmpP(LoadKlass(obj._klass), ConP(Foo.klass)), [eq])
// or the narrowOop equivalent.
const Type* obj_type = _gvn.type(obj);
const TypeOopPtr* tboth = obj_type->join(con_type)->isa_oopptr();
if (tboth != NULL && tboth->klass_is_exact() && tboth != obj_type &&
tboth->higher_equal(obj_type)) {
// obj has to be of the exact type Foo if the CmpP succeeds.
int obj_in_map = map()->find_edge(obj);
JVMState* jvms = this->jvms();
if (obj_in_map >= 0 &&
(jvms->is_loc(obj_in_map) || jvms->is_stk(obj_in_map))) {
TypeNode* ccast = new (C) CheckCastPPNode(control(), obj,
tboth);
const Type* tcc = ccast->as_Type()->type();
assert(tcc != obj_type && tcc->higher_equal(obj_type), "must
improve");
// Delay transform() call to allow recovery of pre-cast value
// at the control merge.
_gvn.set_type_bottom(ccast);
record_for_igvn(ccast);
// Here's the payoff.
replace_in_map(obj, ccast);
}
}
}
}
The CheckCastPP node replaces the original value on a certain path after a
control split. It's not a node whose control is a merge point (Region,
Loop, etc); the merge point after this split should see the original
(pre-case) value.
Then is the record_for_igvn(ccast) call necessary here? If so, how does it
really work?
(I wrote the code above, but thinking of it now, I don't seem to fully
understand why I wrote it that way...)
> 2. In reality you can't say that some path is dead until some data nodes
> and depending on them condition code are processed. We do try to eliminate
> dead nodes recursively when we find one - see remove_globally_dead_node()
> and kill_dead_code(). But it not always work.
>
> Thanks a lot for the pointer. I'm looking at kill_dead_code() right now. I
might have additional questions with regards to them later.
Happy holidays!
Best regards,
Kris
> Vladimir
>
>
> On 12/23/15 3:07 PM, Krystal Mok wrote:
>
>> Hi compiler team,
>>
>> I’d like to ask about the IGVN worklist ordering:
>>
>> 1. Is there a rule of thumb of which nodes should call record_for_igvn()?
>> If so, in what order (e.g. data nodes vs.
>> their control dependence)?
>>
>> Apparently, nodes that get a record_for_igvn() call right after their
>> creation usually wants to delay the call to
>> transform(), perhaps due to potential optimizations to their control
>> input, or because they're created after parsing and
>> might affect other nodes.
>>
>> But what would be a good list of guidelines about exactly what kind of
>> nodes, or what kind of patterns in the IR, that
>> should be considered as candidates to put onto the IGVN worklist, and
>> vice versa?
>>
>> 2. Since it’s problematic for IGVN to process a node whose control path
>> is already dead (but not yet collapsed to TOP),
>> why isn’t there a mechanism built-in to IGVN’s worklist or
>> PhaseIterGVN::transform_old() so that dead control paths
>> always collapses before IGVN decides to process a node?
>>
>>
>> I’ve had a doubt on this topic for quite a while now, so I’m seeking
>> advice from all of you who have had to deal with
>> bugs in this area.
>> There have been a lot of bugs related to the IGVN worklist ordering in
>> the past, the most of the fixes does either:
>> a) add missing record_for_igvn() calls for problematic nodes
>> b) switch the order of adjacent record_for_igvn() calls on related nodes
>> Is it possible or a good idea to fix it down at the core of IGVN?
>>
>> Happy holidays, guys!
>>
>> Best regards,
>> Kris
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20151223/f14bf851/attachment.html>
More information about the hotspot-compiler-dev
mailing list