Mercurial > hg > truffle
comparison src/share/vm/opto/parseHelper.cpp @ 10105:aeaca88565e6
8010862: The Method counter fields used for profiling can be allocated lazily.
Summary: Allocate the method's profiling related metadata until they are needed.
Reviewed-by: coleenp, roland
author | jiangli |
---|---|
date | Tue, 09 Apr 2013 17:17:41 -0400 |
parents | beebba0acc11 |
children | 6f3fd5150b67 |
comparison
equal
deleted
inserted
replaced
9055:dcdeb150988c | 10105:aeaca88565e6 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
335 //----------------------increment_and_test_invocation_counter------------------- | 335 //----------------------increment_and_test_invocation_counter------------------- |
336 void Parse::increment_and_test_invocation_counter(int limit) { | 336 void Parse::increment_and_test_invocation_counter(int limit) { |
337 if (!count_invocations()) return; | 337 if (!count_invocations()) return; |
338 | 338 |
339 // Get the Method* node. | 339 // Get the Method* node. |
340 const TypePtr* adr_type = TypeMetadataPtr::make(method()); | 340 ciMethod* m = method(); |
341 Node *method_node = makecon(adr_type); | 341 address counters_adr = m->ensure_method_counters(); |
342 | 342 |
343 // Load the interpreter_invocation_counter from the Method*. | 343 Node* ctrl = control(); |
344 int offset = Method::interpreter_invocation_counter_offset_in_bytes(); | 344 const TypePtr* adr_type = TypeRawPtr::make(counters_adr); |
345 Node* adr_node = basic_plus_adr(method_node, method_node, offset); | 345 Node *counters_node = makecon(adr_type); |
346 Node* cnt = make_load(NULL, adr_node, TypeInt::INT, T_INT, adr_type); | 346 Node* adr_iic_node = basic_plus_adr(counters_node, counters_node, |
347 MethodCounters::interpreter_invocation_counter_offset_in_bytes()); | |
348 Node* cnt = make_load(ctrl, adr_iic_node, TypeInt::INT, T_INT, adr_type); | |
347 | 349 |
348 test_counter_against_threshold(cnt, limit); | 350 test_counter_against_threshold(cnt, limit); |
349 | 351 |
350 // Add one to the counter and store | 352 // Add one to the counter and store |
351 Node* incr = _gvn.transform(new (C) AddINode(cnt, _gvn.intcon(1))); | 353 Node* incr = _gvn.transform(new (C) AddINode(cnt, _gvn.intcon(1))); |
352 store_to_memory( NULL, adr_node, incr, T_INT, adr_type ); | 354 store_to_memory( ctrl, adr_iic_node, incr, T_INT, adr_type ); |
353 } | 355 } |
354 | 356 |
355 //----------------------------method_data_addressing--------------------------- | 357 //----------------------------method_data_addressing--------------------------- |
356 Node* Parse::method_data_addressing(ciMethodData* md, ciProfileData* data, ByteSize counter_offset, Node* idx, uint stride) { | 358 Node* Parse::method_data_addressing(ciMethodData* md, ciProfileData* data, ByteSize counter_offset, Node* idx, uint stride) { |
357 // Get offset within MethodData* of the data array | 359 // Get offset within MethodData* of the data array |