Request for reviews (S): 6823453: DeoptimizeALot causes fastdebug server jvm to fail with assert(false,"unscheduable graph")
Vladimir Kozlov
Vladimir.Kozlov at Sun.COM
Wed Apr 1 18:02:20 PDT 2009
Generating uncommon trap during parsing when length < 0 works:
@@ -3125,13 +3126,26 @@ Node* GraphKit::new_array(Node* klass_no
Node* javaoop = set_output_for_allocation(alloc, ary_type, raw_mem_only);
+ Node* ccast = alloc->make_ideal_length(ary_type, &_gvn);
+ if (ccast != length && length_type->_hi < 0) {
+ uncommon_trap(Deoptimization::Reason_unreached,
+ Deoptimization::Action_reinterpret,
+ NULL, "negative length", true);
+ }
+
// Cast length on remaining path to be as narrow as possible
if (map()->find_edge(length) >= 0) {
Node* ccast = alloc->make_ideal_length(ary_type, &_gvn);
Vladimir
Tom Rodriguez wrote:
>
> On Apr 1, 2009, at 2:50 PM, Vladimir Kozlov wrote:
>
>> You are absolutely right.
>> The problem is the current code replace data path with TOP
>> after the full igvn but control path stays alive.
>> My changes remove CastII if it can produce TOP so the data path
>> stays alive also.
>>
>> I like your suggestion to cut the control path during parsing but
>> it is against our rule which is to let IGVN do cutting
>> since during parsing graph is not complete.
>
> I wasn't suggesting that we do this during parse. It should be part of
> AllocateArrayNode::Ideal when can_reshape is true.
>
> tom
>
>>
>>
>> Vladimir
>>
>> Tom Rodriguez wrote:
>>> Isn't this just delaying the problem? If you hide the negative value
>>> behind something that won't get simplified until the full igvn pass
>>> then you're back where you started, aren't you? Or is this something
>>> that would only be a problem during parse?
>>
>>
>>
>>> The root of the problem is that the negative length effectively
>>> proves that the control flow following the allocation is all dead
>>> since it will throw an exception but our graph doesn't express this.
>>> The allocation stays around and simply becomes a slow path call that
>>> will throw the exception but any control flow that follows it is
>>> actually dead but can't fold up. Maybe we need to hammer the fall
>>> through projection of the AllocateArrayNode to be a HaltNode to
>>> indicate that the fall through path is unreachable?
>>> tom
>>> On Apr 1, 2009, at 11:57 AM, Vladimir Kozlov wrote:
>>>> I added test case suggested by John.
>>>> I also replaced the code in GraphKit::new_array
>>>> with the _gvn.transform(ccast) call and the result's
>>>> type check as John suggested. I think it is safe
>>>> to not delay the transform() call since the TOP result
>>>> will not be used.
>>>>
>>>> Thanks,
>>>> Vladimir
>>>>
>>>>
>>>> http://cr.openjdk.java.net/~kvn/6823453/webrev.01
>>>>
>>>> Fixed 6823453: DeoptimizeALot causes fastdebug server jvm to fail
>>>> with assert(false,"unscheduable graph")
>>>>
>>>> Problem:
>>>> The code in GraphKit::new_array replaces a negative value with
>>>> TOP (CastII(-1)#0) for all uses if it is used as new array length.
>>>> Incorrect ideal graph is generated as result.
>>>>
>>>> Solution:
>>>> Don't replace a value with TOP.
>>>> Added regression test.
>>>>
>>>> Reviewed by:
>>>>
>>>> Fix verified (y/n): y, bug tests
>>>>
>>>> Other testing:
>>>> JPRT
>>>>
>
More information about the hotspot-compiler-dev
mailing list