Mercurial > hg > truffle
annotate src/share/vm/ci/ciArray.cpp @ 20543:e7d0505c8a30
8059758: Footprint regressions with JDK-8038423
Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything.
Reviewed-by: jwilhelm, brutisso
author | tschatzl |
---|---|
date | Fri, 10 Oct 2014 15:51:58 +0200 |
parents | 55fb97c4c58d |
children | 4ca6dc0799b6 |
rev | line source |
---|---|
0 | 1 /* |
17467
55fb97c4c58d
8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents:
12190
diff
changeset
|
2 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
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 | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "ci/ciArray.hpp" | |
12190
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
27 #include "ci/ciArrayKlass.hpp" |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
28 #include "ci/ciConstant.hpp" |
1972 | 29 #include "ci/ciKlass.hpp" |
30 #include "ci/ciUtilities.hpp" | |
12190
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
31 #include "oops/objArrayOop.hpp" |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
32 #include "oops/typeArrayOop.hpp" |
0 | 33 |
34 // ciArray | |
35 // | |
36 // This class represents an arrayOop in the HotSpot virtual | |
37 // machine. | |
12190
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
38 static BasicType fixup_element_type(BasicType bt) { |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
39 if (bt == T_ARRAY) return T_OBJECT; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
40 if (bt == T_BOOLEAN) return T_BYTE; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
41 return bt; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
42 } |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
43 |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
44 ciConstant ciArray::element_value_impl(BasicType elembt, |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
45 arrayOop ary, |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
46 int index) { |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
47 if (ary == NULL) |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
48 return ciConstant(); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
49 assert(ary->is_array(), ""); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
50 if (index < 0 || index >= ary->length()) |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
51 return ciConstant(); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
52 ArrayKlass* ak = (ArrayKlass*) ary->klass(); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
53 BasicType abt = ak->element_type(); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
54 if (fixup_element_type(elembt) != |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
55 fixup_element_type(abt)) |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
56 return ciConstant(); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
57 switch (elembt) { |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
58 case T_ARRAY: |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
59 case T_OBJECT: |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
60 { |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
61 assert(ary->is_objArray(), ""); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
62 objArrayOop objary = (objArrayOop) ary; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
63 oop elem = objary->obj_at(index); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
64 ciEnv* env = CURRENT_ENV; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
65 ciObject* box = env->get_object(elem); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
66 return ciConstant(T_OBJECT, box); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
67 } |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
68 } |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
69 assert(ary->is_typeArray(), ""); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
70 typeArrayOop tary = (typeArrayOop) ary; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
71 jint value = 0; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
72 switch (elembt) { |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
73 case T_LONG: return ciConstant(tary->long_at(index)); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
74 case T_FLOAT: return ciConstant(tary->float_at(index)); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
75 case T_DOUBLE: return ciConstant(tary->double_at(index)); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
76 default: return ciConstant(); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
77 case T_BYTE: value = tary->byte_at(index); break; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
78 case T_BOOLEAN: value = tary->byte_at(index) & 1; break; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
79 case T_SHORT: value = tary->short_at(index); break; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
80 case T_CHAR: value = tary->char_at(index); break; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
81 case T_INT: value = tary->int_at(index); break; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
82 } |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
83 return ciConstant(elembt, value); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
84 } |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
85 |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
86 // ------------------------------------------------------------------ |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
87 // ciArray::element_value |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
88 // |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
89 // Current value of an element. |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
90 // Returns T_ILLEGAL if there is no element at the given index. |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
91 ciConstant ciArray::element_value(int index) { |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
92 BasicType elembt = element_basic_type(); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
93 GUARDED_VM_ENTRY( |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
94 return element_value_impl(elembt, get_arrayOop(), index); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
95 ) |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
96 } |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
97 |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
98 // ------------------------------------------------------------------ |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
99 // ciArray::element_value_by_offset |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
100 // |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
101 // Current value of an element at the specified offset. |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
102 // Returns T_ILLEGAL if there is no element at the given offset. |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
103 ciConstant ciArray::element_value_by_offset(intptr_t element_offset) { |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
104 BasicType elembt = element_basic_type(); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
105 intptr_t shift = exact_log2(type2aelembytes(elembt)); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
106 intptr_t header = arrayOopDesc::base_offset_in_bytes(elembt); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
107 intptr_t index = (element_offset - header) >> shift; |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
108 intptr_t offset = header + ((intptr_t)index << shift); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
109 if (offset != element_offset || index != (jint)index) |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
110 return ciConstant(); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
111 return element_value((jint) index); |
edb5ab0f3fe5
8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents:
1972
diff
changeset
|
112 } |
0 | 113 |
114 // ------------------------------------------------------------------ | |
115 // ciArray::print_impl | |
116 // | |
117 // Implementation of the print method. | |
118 void ciArray::print_impl(outputStream* st) { | |
119 st->print(" length=%d type=", length()); | |
120 klass()->print(st); | |
121 } |